在同一台主机上不同网络的Docker容器之间的通信

32

在同一主机中的不同网络中,是否有可能使容器进行通信?请注意,我目前没有使用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

使用这些方法,我能够在同一网络中的容器之间进行通信,但无法跨网络的容器进行通信。只有将容器添加到相同的网络中才可以进行通信。

非常感谢......

3个回答

19

不同网络中的容器无法相互通信,因为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 20.10.10上仍然超时连接。 - hldev

8

问题

两个容器无法通信,因为它们不在同一个网络中。

解决方案a)

将一个容器连接到另一个网络覆盖层(这可能无法满足您的约束条件)。

解决方案b)

创建第三个网络,并将两个容器都连接到该网络。

如何操作

docker run命令只接受一次--net选项,您需要做的是docker start容器,然后将它们连接到共享网络docker network connect


您要查找的答案在此处:https://dev59.com/_JHea4cB1Zd3GeqPr6Sd#34038381


6

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