Iptables

在 docker 服務重新啟動之前,Docker 容器無法訪問 Internet

  • July 1, 2016

我正在使用以下命令手動創建網橋:

docker network create --driver bridge --internal --subnet=172.20.0.0/24 br0

然後我使用那個橋參數啟動容器--net=br0 --ip=172.20.0.x

問題是這些容器無法訪問網際網路,我什至無法 ping 到外面。

真正的問題與 iptables 有關。當我重新啟動伺服器時,iptables 會顯示一些規則,並且容器無法訪問 Internet。

但是當我重新啟動 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?為什麼?

我的錯。我沒有註意到我正在使用--internal. 不言自明!

引用自:https://serverfault.com/questions/787153