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

同一主机上不同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

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

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 我可以看到所属的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

答案1

跟踪@user 的回答。稍微安全一点的方法是添加规则以允许网络相互通信,而不是清除所有内容。

这对我有用:

sudo iptables -I DOCKER-ISOLATION-STAGE-2 -o docker0 -i othernet -j ACCEPT
sudo iptables -I DOCKER-ISOLATION-STAGE-2 -o othernet -i docker0 -j ACCEPT

我还没有找到一种非黑客的方法来自动完成此操作。

答案2

DOCKER-ISOLATION我已经通过删除Docker 在 iptables 中设置的链解决了该问题:

# iptables --flush DOCKER-ISOLATION

我不确定从安全角度来看这是否是一种正确的方法,但它满足了我的需要。

答案3

Docker 网络并非设计用于相互路由,而是故意隔离,以便您可以创建只能相互通信的应用程序组。我怀疑这是在 iptables 规则中执行的,但请不要引用我的话。

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

Docker Compose 可用于将多个容器连接到不同的网络。它允许您定义每个容器所属的每个网络,无需运行多个docker network connect命令。

相关内容