在Docker Compose中使用主机网络和额外网络

15

我正在为我的项目设置开发环境。

我有一个容器(ms1),它应该放置在自己的网络中(在我的情况下是“services”),还有一个容器(apigateway),它应该访问该网络并将http端口暴露给主机网络。

理想情况下,我的Docker Compose文件应该如下所示:

version: '2'
services:
    ms1:
        expose:
            - "13010"
        networks:
            services:
                aliases:
                    - ms1
   apigateway:
        networks:
            services:
                aliases:
                    - api
        network_mode: "host"
networks:
    services:

docker-compose不允许同时使用network_mode和networks。

我还有其他选择吗?

目前我正在使用这个:

   apigateway:
        networks:
            services:
                aliases:
                    - api
        ports:
            - "127.0.0.1:10000:13010"

然后apigateway容器侦听0.0.0.0:13010。它能工作但速度慢,如果主机的互联网连接中断,它会冻结。

此外,我计划在未来使用vagrant,这样做是否可以以清晰的方式解决问题?


你能否直接使用apigateway中的ms1 IP地址?请参考https://dev59.com/mF4c5IYBdhLWcg3wa52M了解如何在docker 1.10.1中实现。 - Igor Bukanov
我也在尝试做同样的事情,但是解决的问题可能不同。在我的情况下,我创建了一个在两个服务之间共享的网络,但由于某些原因,其中一个服务无法连接到互联网(我认为原因是它不是主机网络的一部分)。然而,问题是它无法解析URL,因为无法访问DNS。我使用IP地址进行了快速修复,但会仔细查看并将请求转发到正确的DNS。 - omrsin
3个回答

1
在docker-compose中,expose 不会发布主机上的端口。由于您可能不再需要服务链接(而应该像您已经做的那样依赖Docker网络),因此该选项在一般情况下具有有限的价值,并且在您的情况下似乎根本没有提供任何价值。
怀疑您是出于错误使用它并意识到它本身似乎没有任何效果后,偶然发现使用主机网络驱动程序会“使其正常工作”。请注意,这与expose属性无关。只是主机网络驱动程序允许包含进程直接绑定到主机网络接口。由于这一点,您可以从外部访问API网关进程。您可以删除expose属性,它仍然可以正常工作。
如果这是您选择主机网络驱动程序的唯一原因,那么您已经成为X-Y问题的受害者:
你在正常情况下不应该使用主机网络驱动程序,使用默认的桥接网络驱动程序就可以了。你需要的是ports属性,而不是expose。这将在幕后设置适当的端口转发。

0
在 Docker 1.13 中,您应该能够创建一个服务来桥接这两个网络。我正在使用类似的东西来解决另一个问题,我认为这也可能有所帮助:
docker service create \
--name proxy \
--network proxy \
--publish mode=host,target=80,published=80 \
--publish mode=host,target=443,published=443 \
--constraint 'node.hostname == myproxynode' \
--replicas 1 \
letsnginx

-1
我会尝试这样做:
1/ 查找主机网络 docker network ls 2/ 使用此docker-compose文件
     services:
          ms1:
              ports:
                  - "13010"
              networks:
                  - service
          apigateway:
              networks:
                  - front
                  - service

      networks:
          front:
          service:
              external:
                  name: "<ID of the network>"

当我尝试使用上述命令创建主机网络时,我会收到这个错误信息 Error response from daemon: only one instance of "host" network is allowed - disrvptor
所以你可以使用已经存在的那个。我更新了我的答案,但我没有测试它的能力。 - Plup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接