提问者:小点点

在docker comment中使用主机网络和其他网络


我正在尝试为我的项目设置一个开发环境。

我有一个容器(ms1),应该放在他自己的网络中(在我的例子中是“服务”),还有一个容器(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-comment不允许同时使用network_mode和网络。

我还有其他选择吗?

目前我正在使用这个:

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

然后apigateway容器侦听0.0。0.0:13010. 它可以工作,但速度很慢,如果主机的internet连接中断,它就会冻结。

另外,我计划在docker上使用vagrant,它允许以干净的方式解决问题吗?


共3个答案

匿名用户

docker compose中的expose不会在主机上发布端口。由于您可能不再需要服务链接(相反,您应该像以前一样依赖Docker networks),因此该选项通常价值有限,在您的场景中似乎对您没有任何价值。

我怀疑你是错误地使用它的,在意识到它本身似乎没有任何效果后,偶然发现使用主机网络驱动程序会“使其工作”。请注意,这与暴露属性无关。只是主机网络驱动程序让包含的进程直接绑定到主机网络接口。因此,您可以从外部访问API网关进程。您可以删除暴露属性,它仍然可以工作。

如果这是您选择主机网络驱动程序的唯一原因,那么您就是X-Y问题的受害者:

(tl;dr)在正常情况下,您不需要使用主机网络驱动程序,默认网桥网络驱动程序工作正常。您要查找的是端口属性,而不是公开。这将在后台设置适当的端口转发。

匿名用户

在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/查找主机网络docker网络ls

2/使用此dockercompose文件

     services:
          ms1:
              ports:
                  - "13010"
              networks:
                  - service
          apigateway:
              networks:
                  - front
                  - service

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