我创建了两个 docker 网络。
docker network create --subnet=172.18.0.0/16 Docker_network_1
docker network create --subnet=172.19.0.0/16 Docker_network_2
Run Code Online (Sandbox Code Playgroud)
我在每个容器上运行两个不同的容器:
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
Run Code Online (Sandbox Code Playgroud)
Container_1 有 IP172.18.0.2
而 Container_2 有 IP 172.19.0.2
。
从 Container_1 我可以获取所属的ping
docker 接口 IP ,但无法 ping Container_2 IP 。172.19.0.1
Docker_network_2
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
Run Code Online (Sandbox Code Playgroud)
Docker 网络并不是为了在彼此之间路由而设计的,它们是有意隔离的,以便您可以创建只能相互通信的应用程序组。我怀疑这是在 iptables 规则中执行的,但不要引用我的话。
但是,您可以将容器添加到多个网络。这是docker network connect Docker_network_2 Container_1
在创建容器后使用命令手动完成的(如果您需要在入口点启动之前连接到网络,则可以将运行命令拆分为创建和启动命令)。
Docker compose 对于跨各种网络将多个容器连接在一起非常有用。它允许您定义每个容器所属的每个网络,从而无需运行多个docker network connect
命令。