最近在使用Docker的時候,發現Docker容器內部無法訪問外部網絡。經過一番排查,發現是因為Docker會重置宿主機的防火墻規則,導致容器內部無法訪問外部網絡。本文將簡要介紹Docker會重置防火墻的原因和解決方案。
在啟動Docker容器時,Docker會給容器分配一個獨立的網絡命名空間,同時也會將容器配置為與宿主機共享網絡設備。然而,Docker會默認讓容器使用寬松的iptables規則,這些規則會重置宿主機的防火墻規則,導致容器內部無法訪問外部網絡。
# docker0是Docker創建的橋接網絡
-A DOCKER -d 172.17.0.1/16 ! -i docker0 -o docker0 -p tcp -j DROP
-A DOCKER -d 172.17.0.1/16 ! -i docker0 -o docker0 -p udp -j DROP
以上規則會阻止所有進入或離開容器的流量,除非經過Docker的NAT表。這意味著如果宿主機上已有的防火墻規則不允許容器的流量通過,那么容器就無法與宿主機外的網絡通信。
解決方案:在宿主機上添加防火墻規則,允許Docker容器的流量通過。
# 允許Docker容器發送流量
iptables -I DOCKER-USER -i docker0 -j ACCEPT
# 允許Docker容器接收流量
iptables -I DOCKER-USER -o docker0 -j ACCEPT
以上代碼將在宿主機上添加2個規則,允許Docker容器發送和接收流量。在宿主機上添加這些規則后,Docker容器就可以正常訪問外部網絡了。
總之,Docker會重置宿主機的防火墻規則,因此在使用Docker時,需要在宿主機上添加適當的防火墻規則,以確保Docker容器可以正常訪問外部網絡。
上一篇html字體滑動代碼
下一篇vue 2015.2