在同一主机上的不同dockernetworking之间进行路由

我创build了两个dockernetworking

docker network create --subnet=172.18.0.0/16 Docker_network_1 docker network create --subnet=172.19.0.0/16 Docker_network_2 

在他们每一个我运行两个不同的容器:

 docker run --rm -it --name Container_1 --net Docker_network_1 alpine /bin/sh docker run --rm -it --name Container_2 --net Docker_network_2 alpine /bin/sh 

Container_1具有IP 172.18.0.2而Container_2具有IP 172.19.0.2

从Container_1中,我可以ping属于Docker_network_2接口IP 172.19.0.1 ,但无法Ping通Container_2 IP 172.19.0.2

我不明白为什么因为我的主机上的“路由”似乎是正确的:

 #route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.1 0.0.0.0 UG 1024 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-ea28cf2d7108 172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-244606ad6705 

Dockernetworking并不是为彼此之间的路由而devise的,它们是有意孤立的,所以您可以创build只能相互通话的应用程序组。 我怀疑这是在iptables规则中执行的,但不要在此引用我的意思。

但是,您可以将容器添加到多个networking。 手动执行此操作是在创builddocker network connect Docker_network_2 Container_1之后使用docker network connect Docker_network_2 Container_1命令完成的(如果需要在启动入口点之前连接到networking,可以将运行命令分割为create和start命令)。

Docker组合对于跨多个networking连接多个容器非常有用。 它允许您定义每个容器所属的每个networking,从而无需运行多个docker network connect命令。

我通过删除Docker在iptables中设置的DOCKER-ISOLATION链来解决这个问题:

 # iptables --flush DOCKER-ISOLATION 

我不确定从安全的angular度来看,这是否是一个正确的方法,但它是做我所需要的。