【问题标题】:Docker multiple same port issueDocker多个相同端口问题
【发布时间】:2019-01-09 22:04:31
【问题描述】:

我目前正在一个解决方案中处理两个相互关联的 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"

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"    

当我使用 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: 地址已在使用中。'

所以请告诉我如何解决这个问题。

【问题讨论】:

    标签: docker asp.net-core


    【解决方案1】:

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

      - SERVICE1=http://localhost:1001
    

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

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

    【讨论】:

    • 需要是内部端口号(http://services1:80/,或者甚至只是 http://services1/,因为这是默认的 HTTP 端口)。
    • 感谢您的回复。我已经尝试了这两个选项,但现在我得到了异常 {System.Net.Http.HttpRequestException: No such device or address ---> System.Net.Sockets.SocketException: No such device or address
    【解决方案2】:

    从内部你可以使用容器名称而不是主机和端口(实际上它更实用),你可以通过在终端中输入docker ps来找到你的容器名称。

    例如如果您从服务 2 调用服务 1,请使用 http://asp_project_service1

    【讨论】:

    • Docker Compose 也为块名称设置了网络别名,因此您无需手动查找它构造的容器名称。 http://services1 应该在这里工作,因为这就是块的名称。
    • 感谢您的回复。我已经尝试了这两个选项,但现在我得到了异常 {System.Net.Http.HttpRequestException: No such device or address ---> System.Net.Sockets.SocketException: No such device or address
    猜你喜欢
    • 2022-11-03
    • 2016-05-06
    • 2016-07-23
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多