Docker多个相同端口问题

时间:2019-01-09 05:27:53

标签: 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"

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:网桥http://localhost:1001呼叫http://localhost:1002时,出现以下异常。

  

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

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

  

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

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

2 个答案:

答案 0 :(得分:1)

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

  - SERVICE1=http://localhost:1001

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

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

答案 1 :(得分:0)

从内部,您可以使用容器名称代替主机和端口(实际上更实用),可以在终端中键入docker ps来找到容器名称。

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