我已经创建了两个 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 我可以看到所属的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
答案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
命令。