在同一主机上的不同网络中的 Docker 容器之间进行通信
Posted
技术标签:
【中文标题】在同一主机上的不同网络中的 Docker 容器之间进行通信【英文标题】:Communicating between Docker containers in different networks on the same host 【发布时间】:2016-07-02 07:52:22 【问题描述】:是否有可能使同一主机内不同网络中的容器进行通信?请注意,我目前没有使用 docker-compose。
以下是我所做的总结。我使用以下命令创建了两个网络
docker network create --driver bridge mynetwork1
docker network create --driver bridge mynetwork2
然后我使用以下命令在每个创建的网络上运行两个容器:
docker run --net=mynetwork1 -it name=mynet1container1 mycontainerimage
docker run --net=mynetwork1 -it name=mynet1container2 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container1 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container2 mycontainerimage
然后我从使用创建的网络中识别出每个容器的 IP 地址
docker network inspect mynetwork1
docker network inspect mynetwork2
使用那些我能够在同一网络中的容器之间进行通信,但我无法跨网络的容器之间进行通信。只有将容器添加到同一网络才能进行通信。
非常感谢...
【问题讨论】:
【参考方案1】:根据 Docker Docs Containers can only communicate within networks but not across networks
您可以将一个容器附加到两个网络并能够以这种方式进行通信。
编辑:虽然那时为什么首先要有两个网络。
这是链接:
https://docs.docker.com/engine/userguide/networking/dockernetworks/
-布鲁斯
【讨论】:
【参考方案2】:问题
两个容器无法通信,因为它们不在同一个网络上。
解决方案一)
将一个容器连接到另一个网络覆盖(这可能不符合您的限制)。
解决方案 b)
创建第三个网络并将两个容器插入此网络。
如何
命令docker run
只接受一次出现的选项--net
,你要做的就是docker start
容器,然后docker network connect
将它们连接到共享网络。
你要找的答案在这里:https://***.com/a/34038381/5321002
【讨论】:
【参考方案3】:不同网络中的容器无法相互通信,因为 iptables 会丢弃此类数据包。这显示在过滤器表中的 DOCKER-ISOLATION-STAGE-1 和 DOCKER-ISOLATION-STAGE-2 链中。
sudo iptables -t filter -vL
可以将规则添加到 DOCKER-USER 链中,以允许不同网络之间的通信。在上述场景中,以下命令将允许 mynetwork1 中的任何容器与 mynetwork2 中的任何容器进行通信。
需要先找到网络的网桥接口名称(mynetwork1 和 mynetwork2)。它们的名称通常看起来像 br-07d0d51191df 或 br-85f51d1cfbf6,可以使用命令“ifconfig”或“ip link show”找到它们。由于有多个网桥接口,要为感兴趣的网络识别正确的网桥接口,网桥接口的 inet 地址(显示在 ifconfig 中)应与命令 'docker network inspect mynetwork1' 中显示的子网地址匹配
sudo iptables -I DOCKER-USER -i br-########1 -o br-########2 -j ACCEPT
sudo iptables -I DOCKER-USER -i br-########2 -o br-########1 -j ACCEPT
可以微调规则以仅允许特定 IP 之间的通信。例如,
sudo iptables -I DOCKER-USER -i br-########1 -o br-########2 -s 172.17.0.2 -d 172.19.0.2 -j ACCEPT
sudo iptables -I DOCKER-USER -i br-########2 -o br-########1 -s 172.19.0.2 -d 172.17.0.2 -j ACCEPT
【讨论】:
以上是关于在同一主机上的不同网络中的 Docker 容器之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章