我创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度来看,这是否是一个正确的方法,但它是做我所需要的。