同一主机上不同docker网络之间的路由

gae*_*ano 5 networking docker

我创建了两个 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 我可以获取所属的pingdocker 接口 IP ,但无法 ping Container_2 IP 。172.19.0.1Docker_network_2172.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)

BMi*_*tch 0

Docker 网络并不是为了在彼此之间路由而设计的,它们是有意隔离的,以便您可以创建只能相互通信的应用程序组。我怀疑这是在 iptables 规则中执行的,但不要引用我的话。

但是,您可以将容器添加到多个网络。这是docker network connect Docker_network_2 Container_1在创建容器后使用命令手动完成的(如果您需要在入口点启动之前连接到网络,则可以将运行命令拆分为创建和启动命令)。

Docker compose 对于跨各种网络将多个容器连接在一起非常有用。它允许您定义每个容器所属的每个网络,从而无需运行多个docker network connect命令。