在防火墻開啟的狀態下,docker容器內部無法訪問宿主機服務(能夠訪問非宿主機的其他局域網計算機的服務),解決方法:
1.?配置防火墻規則firewall-cmd?--zone=public?--add-port={port}/tcp?--permanent,并重載防火墻規則firewall-cmd?--reload 2.?啟動容器時使用--net?host模式 3.?關閉防火墻
_補充:由于容器內請求的源地址是使用的docker0網段的內網地址,宿主機防火墻無法識別來源為非宿主機網段的docker0網段的內網地址請求,將其標記為未知來源,于是對請求進行了攔截,可通過添加防火墻來源規則(docker容器默認內網網段為172.17.0.0/16):
<rule><source></source><accept></accept></rule>
進行解決或直接更改防火墻開放端口規則,即解決方法中的第1點進行解決,當然為了更方便,特別時服務個數特別多且端口變化比較快的時候,為了降低維護成本,在保證服務器安全的情況下推薦使用第2或第3點解決方法
這也是微服務docker容器化部署時經常會遇到的坑,A服務訪問B服務,當A、B服務同時位于一臺宿主機時無法訪問,當A、B服務位于不同宿主機時,訪問正常。案例如下:
同一宿主機微服務之間通信異常的血案: 微服務A能夠正常請求AR 微服務B能夠正常請求BR 但是微服務A某請求OR,內部訪問BR,始終無法調用成功 原因: ????centos的firewalld為開啟狀態時,微服務A內部發起請求時,請求無法從容器發出,即出現了調用不成功的情況(No?route?to?host) 矛盾點: ????spring?cloud?config?啟動緩慢導致在測試的時候config服務啟動后的一段時間內無法訪問,讓我們誤以為關閉firewalld后無法接收請求,但又和其他服務又能正常訪問出現了矛盾 驗證: ????docker創建四個nginx(8120、8787、8083、8084)容器,并創建ubuntu容器安裝curl。 ????開啟iptables,關閉firewalld,重啟docker,啟動五個容器,外部四個nginx訪問成功,進入ubuntu容器使用curl訪問,均成功 ????開啟iptables,開啟firewalld,重啟docker,啟動五個容器,外部四個nginx訪問成功,進入ubuntu容器使用curl訪問,均不成功 ????開啟iptables,開啟firewalld,重啟docker,啟動五個容器,外部四個nginx訪問成功,宿主機配置firewall-cmd?--zone=public?--add-port=8120/tcp?--permanent,進入ubuntu容器使用curl訪問,8120訪問,其他均不成功 ????宿主機配置端口使用iptables轉發規則配置無效: ????????iptables?-A?INPUT?-p?tcp?--dport?8120?-j?ACCEPT ????????iptables?-A?OUTPUT?-p?tcp?--dport?8120?-j?ACCEPT ????????iptables?-A?FORWARD?-p?tcp?--dport?8120?-j?ACCEPT 結論: ????無論firewalld開啟還是關閉,均不影響外部訪問,宿主機需配置firewall-cmd?--zone=public?--add-port=8120/tcp?--permanent(刪除端口去掉--zone=public)同一宿主機才能相互訪問成功 生產解決方案: ????開啟iptables,關閉firewalld ????開啟iptables,開啟firewalld并配置開放端口 ????(開啟或關閉firewalld后,需要重啟docker) iptables->ufw(ubuntu)iptables->firewalld(centos)
相關推薦:docker教程
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦