關於docker和iptables的問題


docker和iptabes這一對“連體嬰兒”總是會給我們帶來一些麻煩。

如果你有使用過docker的經驗你會發現docker在啟動的同時會在iptables中添加DOCKER鏈路,

而當你的docker啟動一個容器時會在DOCKER鏈路中添加DANT規則。

 

1.這一對“孿生兄弟”在我們使用時的確是會帶來很多問題,例如有些勇氣可嘉的朋友總是喜歡重啟防火牆,那么這時就會出現DOCKER鏈路丟失的情況,

DOCKER鏈路丟失,docker容器所依賴的DNAT規則就消失了,那么你會發現你的docker容器從主機外部訪問不到了。

解決方法:針對這個問題,你可以重啟docker服務,這樣iptables中的DOCKER鏈路就會重新建立,並在會將DNAT規則添加進去,這樣就恢復了訪問,

但是這樣有一個弊端就是你的其他正在提供服務會停止,所以在生產中要慎重操作。(所以防火牆不要隨意重啟)

 

2.細心的你會發現在同一個docker0子網下,你在docker0網段的一個容器中去通過宿主機的ip訪問另外一個docker0網段的另外一個容器,你會發現你訪問不了,這時就有點疑惑了,

因為這時的防火牆INPUT鏈路沒有放行,所以導致服務無法正常訪問。

 

比如:在docker0網段    有一台172.17.0.2的mysql    還有一台172.17.0.3的mysql

那么你在172.17.0.2的 mysql容器是可以訪問172.17.0.3的mysql容器的,但是你使用宿主機的ip+容器映射出來的端口 去訪問,那么你會發現是訪問失敗的,

因為這時的docker0網段是沒有在防火牆放行的。

 

 

下面列一下docker容器在不同場景下被訪問時數據包在防火牆中的過程:

1.容器出外網: PREROUTING鏈路----->FORWORD鏈路------->OUTPUT鏈路---------->POSTROUTING鏈路

2.宿主機訪問127.0.0.1: OUTPUT鏈路--------->POSTROUTING鏈路 ------->PREROUTING鏈路--------->INPUT鏈路----->容器

3.訪問宿主機的默認網卡地址:OUTPUT鏈路--------->DOCKER鏈路------->POSTROUTING鏈路----->容器 

4.宿主機之外的主機訪問容器: PREROUTING鏈路---------->DOCKER鏈路----->FORWORD鏈路----------->DOCKER鏈路-------->POSTROUTING鏈路------->容器

5.宿主機訪問容器: OUTOUT鏈路------>POSTROUTING鏈路------->容器

6.容器訪問宿主機端口:PREROUNTING鏈路---->DOCKER鏈路------->INPUT鏈路--->容器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM