在 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 网络 - nginx:在上游找不到 [emerg] 主机