最近在使用Docker的時候,發(fā)現(xiàn)Docker容器內(nèi)部無法訪問外部網(wǎng)絡(luò)。經(jīng)過一番排查,發(fā)現(xiàn)是因?yàn)镈ocker會重置宿主機(jī)的防火墻規(guī)則,導(dǎo)致容器內(nèi)部無法訪問外部網(wǎng)絡(luò)。本文將簡要介紹Docker會重置防火墻的原因和解決方案。
在啟動Docker容器時,Docker會給容器分配一個獨(dú)立的網(wǎng)絡(luò)命名空間,同時也會將容器配置為與宿主機(jī)共享網(wǎng)絡(luò)設(shè)備。然而,Docker會默認(rèn)讓容器使用寬松的iptables規(guī)則,這些規(guī)則會重置宿主機(jī)的防火墻規(guī)則,導(dǎo)致容器內(nèi)部無法訪問外部網(wǎng)絡(luò)。
# docker0是Docker創(chuàng)建的橋接網(wǎng)絡(luò)
-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
以上規(guī)則會阻止所有進(jìn)入或離開容器的流量,除非經(jīng)過Docker的NAT表。這意味著如果宿主機(jī)上已有的防火墻規(guī)則不允許容器的流量通過,那么容器就無法與宿主機(jī)外的網(wǎng)絡(luò)通信。
解決方案:在宿主機(jī)上添加防火墻規(guī)則,允許Docker容器的流量通過。
# 允許Docker容器發(fā)送流量
iptables -I DOCKER-USER -i docker0 -j ACCEPT
# 允許Docker容器接收流量
iptables -I DOCKER-USER -o docker0 -j ACCEPT
以上代碼將在宿主機(jī)上添加2個規(guī)則,允許Docker容器發(fā)送和接收流量。在宿主機(jī)上添加這些規(guī)則后,Docker容器就可以正常訪問外部網(wǎng)絡(luò)了。
總之,Docker會重置宿主機(jī)的防火墻規(guī)則,因此在使用Docker時,需要在宿主機(jī)上添加適當(dāng)?shù)姆阑饓σ?guī)則,以確保Docker容器可以正常訪問外部網(wǎng)絡(luò)。