Docker несколько проблем с одним и тем же портом - PullRequest
0 голосов
/ 09 января 2019

В настоящее время я работаю над двумя взаимосвязанными службами ASP.NET Core WebAPI (Service1 и Service2) в решении. Оба имеют файлы Docker и выставляют порт 80.

Service1 - это независимая служба, которую необходимо вызывать из Service2. Я дал как docker-compose.yml, так и docker-compose.override.yml.

докер-compose.yml

version: '3.4'

    services:
      services1:
        image: ${DOCKER_REGISTRY-}services1
        network_mode: bridge
        build:
          context: .
          dockerfile: Services1/Dockerfile
        ports:
         - "501:80"

      services2:
        image: ${DOCKER_REGISTRY-}services2
        network_mode: bridge
        build:
          context: .
          Services2/Dockerfile
        ports:
         - "502:80"

докер-compose.override.yml

version: '3.4'

services:
  services1:
    build:
      context: .
      dockerfile: Services1/Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "1001:80"

  services2:
    build:
      context: .
      dockerfile: Services2/Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - SERVICE1=http://localhost:1001
      ports:
      - "1002:80"    

Когда я звоню http://localhost:1001 из http://localhost:1002 с network_mode: bridge , я получаю следующее исключение.

{System.Net.Http.HttpRequestException: невозможно назначить запрошенный адрес ---> System.Net.Sockets.SocketException: невозможно назначить запрошенный адрес

когда я изменяю network_mode на host ( network_mode: host ), я получаю следующее исключение.

System.IO.IOException: 'Не удалось привязать к адресу http://[::]:80: адрес уже используется. '

Поэтому, пожалуйста, дайте мне знать, как решить проблему.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы должны придерживаться режима моста по умолчанию (удалив network_mode: bridge) и изменить

  - SERVICE1=http://localhost:1001

до

  - SERVICE1=http://services1:80 # services1 will be resolved by docker

Поскольку service1 и service2 находятся в отдельных контейнерах, значит, нет открытого порта 1001 в контейнере service2.

0 голосов
/ 09 января 2019

Из внутреннего вы можете использовать имя контейнера вместо хоста и порта (на самом деле это более практично), вы можете найти имя контейнера, набрав docker ps в своем терминале.

например. если вы звоните в службу 1 из службы 2, используйте http://asp_project_service1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...