在Docker服务重新启动之前,Docker容器不能访问互联网

我正在用这个命令手动创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 。 不言自明!