Iptables
在 docker 服務重新啟動之前,Docker 容器無法訪問 Internet
我正在使用以下命令手動創建網橋:
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
. 不言自明!