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

Posted

技术标签:

【中文标题】在 docker compose 中使用主机网络和其他网络【英文标题】:Use host networking and additional networks in docker compose 【发布时间】:2016-07-08 14:57:07 【问题描述】:

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

我有一个容器 (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-compose 不允许同时使用 network_mode 和 networks。

我还有其他选择吗?

目前我正在使用这个:

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

然后 apigateway 容器监听 0.0.0.0:13010。它可以工作,但速度很慢,如果主机的 Internet 连接中断,它就会死机。

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

【问题讨论】:

你可以只使用来自apigateway的ms1 IP地址吗?请参阅***.com/questions/27937185/… 如何使用 docker 1.10.1 我正在尝试做同样的事情,但要解决不同的问题(也许)。就我而言,我创建了一个在两个服务之间共享的网络,但由于某种原因,其中一个服务没有连接到互联网(我认为原因是它不是主机网络的一部分)。但是,问题在于它无法解析 URL,因为无法访问 DNS。我使用 IP 地址进行了快速修复,但会彻底查看它以将请求转发到正确的 DNS。 【参考方案1】:

expose 在 docker-compose does not publish the port on the host 中。由于您可能不再需要服务链接(相反,您应该像现在一样依赖 Docker 网络),因此该选项的价值通常有限,并且在您的场景中似乎对您没有任何价值。

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

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

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

【讨论】:

【参考方案2】:

在 docker 1.13 中,您应该能够创建一个服务来桥接两个网络。我正在使用类似于修复 another problem 的东西,我认为这在这里也有帮助:

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

【讨论】:

【参考方案3】:

我会试试这个:

1/ 查找主机网络 docker network ls

2/ 使用这个 dockercompose 文件

     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 所以你可以使用已经存在的那个。我更新了我的答案,但我无法测试它。

以上是关于在 docker compose 中使用主机网络和其他网络的主要内容,如果未能解决你的问题,请参考以下文章

使用主机 DNS 服务器的 Docker-compose 容器

Docker-compose 编排

Docker 网络 - nginx:在上游找不到 [emerg] 主机

使用Docker Compose自动编排容器

如何在Ubuntu 20.04上安装Docker Compose

如何在Ubuntu 20.04上安装Docker Compose