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

Abr*_*son 9 containers docker docker-networking

是否有可能在同一主机内的不同网络中进行通信?请注意,我目前不使用docker-compose.

以下是我所做的总结.我使用以下命令创建了两个网络

docker network create --driver bridge mynetwork1   
docker network create --driver bridge mynetwork2
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令在这些创建的网络中运行了两个容器:

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
Run Code Online (Sandbox Code Playgroud)

然后,我从使用创建的网络中识别出每个容器的IP地址

docker network inspect mynetwork1
docker network inspect mynetwork2
Run Code Online (Sandbox Code Playgroud)

使用那些我能够在同一网络中的容器之间进行通信,但我无法通过网络在容器之间进行通信.只有将容器添加到同一网络才能进行通信.

非常感谢...

小智 6

根据 Docker 文档,Containers can only communicate within networks but not across networks您可以将一个容器附加到两个网络并能够以这种方式进行通信。

编辑:尽管那时为什么首先要有两个网络。

这是链接:

https://docs.docker.com/engine/userguide/networking/dockernetworks/

-布鲁斯


Auz*_*ias 6

问题

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

解决方案 a)

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

解决方案 b)

创建第三个网络并将两个容器插入该网络。

如何

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


您正在寻找的答案在这里:https : //stackoverflow.com/a/34038381/5321002


Jay*_*Jay 5

不同网络中的容器无法相互通信,因为iptables会丢弃此类数据包。这在过滤器表的DOCKER-ISOLATION-STAGE-1和DOCKER-ISOLATION-STAGE-2链中显示。

    sudo iptables -t filter -vL
Run Code Online (Sandbox Code Playgroud)

可以将规则添加到DOCKER-USER链中,以允许不同网络之间进行通信。在上述情况下,以下命令将允许mynetwork1中的ANY容器与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
Run Code Online (Sandbox Code Playgroud)

可以对规则进行微调,以仅允许特定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
Run Code Online (Sandbox Code Playgroud)