Docker多个相同端口问题

cha*_*nya 1 docker asp.net-core

我目前正在一个解决方案中处理两个相互关联的 ASP.NET Core WebAPI 服务(Service1 和 Service2)。两者都有 docker 文件并暴露端口 80。

Service1 是一个独立的服务,需要从 Service2 调用。我已经给出了 docker-compose.yml 和 docker-compose.override.yml。

docker-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"
Run Code Online (Sandbox Code Playgroud)

docker-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"    
Run Code Online (Sandbox Code Playgroud)

当我使用network_mode: bridgehttp://localhost:1002调用http://localhost:1001 时,我收到以下异常。

{System.Net.Http.HttpRequestException:无法分配请求的地址---> System.Net.Sockets.SocketException:无法分配请求的地址

当我将 network_mode 更改为主机(network_mode:host)时,出现以下异常。

System.IO.IOException: '未能绑定到地址http://[::]:80 : 地址已在使用中。'

所以请让我知道如何解决这个问题。

Siy*_*iyu 5

您应该坚持使用默认的桥接模式(通过删除network_mode: bridge)并更改

  - SERVICE1=http://localhost:1001
Run Code Online (Sandbox Code Playgroud)

  - SERVICE1=http://services1:80 # services1 will be resolved by docker
Run Code Online (Sandbox Code Playgroud)

因为service1和service2在不同的容器上,所以service2的容器上没有打开1001端口。