Docker 容器在 Docker 服务重新启动之前无法访问互联网

Docker 容器在 Docker 服务重新启动之前无法访问互联网

我正在使用以下命令手动创建桥接:

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 服务时,这两条规则消失,我看到的是:

*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 服务才能加载允许容器使用互联网的 iptables 规则?

我该如何修复这个问题?

桥接器的创建应该修改 iptables 规则,我不应该为此重新启动 docker 服务,对吗?


编辑:

我注意到桥梁创建仅向 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

看起来创建桥接后我必须重新启动 docker?为什么?

答案1

我的错。我没有注意到我在使用--internal。不言自明!

相关内容