我正在使用以下命令手动创建桥接:
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
。不言自明!