我正在用这个命令手动创build一个桥:
docker network create --driver bridge --internal --subnet=172.20.0.0/24 br0
然后我启动容器使用该桥参数--net=br0 --ip=172.20.0.x
问题是这些容器没有互联网接入,我甚至不能ping通外面。
真正的问题是与iptables有关。 当我重新启动服务器,iptables显示我一些规则,容器没有互联网接入。
但是,当我重新启动docker服务,然后iptables有不同的规则和容器有互联网接入。
我只会在这里粘贴规则集之间的区别。
当我重新启动服务器,此规则显示:
*filter -A DOCKER-ISOLATION ! -s 172.20.0.0/24 -o br-aa4c507d3f06 -j DROP -A DOCKER-ISOLATION ! -d 172.20.0.0/24 -i br-aa4c507d3f06 -j DROP COMMIT
当我重新启动docker服务,这2条规则消失,我看到这个:
*filter -A FORWARD -o br-aa4c507d3f06 -j DOCKER -A FORWARD -o br-aa4c507d3f06 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i br-aa4c507d3f06 ! -o br-aa4c507d3f06 -j ACCEPT -A FORWARD -i br-aa4c507d3f06 -o br-aa4c507d3f06 -j ACCEPT -A DOCKER-ISOLATION -i br-aa4c507d3f06 -o docker0 -j DROP -A DOCKER-ISOLATION -i docker0 -o br-aa4c507d3f06 -j DROP COMMIT
&
*nat -A POSTROUTING -s 172.20.0.0/24 ! -o br-aa4c507d3f06 -j MASQUERADE -A DOCKER -i br-aa4c507d3f06 -j RETURN COMMIT
所以,手动添加它们可能是一个糟糕的主意,我希望这个工作,因为它应该。
为什么我必须重新启动docker服务才能加载允许容器使用Internet的iptables规则?
我该如何解决这个问题?
桥的创build应该修改iptables规则,我不应该重新启动docker服务,对吗?
编辑:
我注意到桥的创build只是把这个规则添加到iptables中:
-A DOCKER-ISOLATION ! -s 172.20.0.0/24 -o br-aa4c507d3f06 -j DROP -A DOCKER-ISOLATION ! -d 172.20.0.0/24 -i br-aa4c507d3f06 -j DROP
所以看起来像桥梁创build后,我必须重新启动泊坞窗? 为什么?
我的错。 我没有注意到我正在使用 – --internal 。 不言自明!