No route to host兩個docker容器的服務(wù)訪問不通的解決
問題描述
如圖,我的兩個docker服務(wù)service1和service2位于同一臺服務(wù)器上,當(dāng)service1調(diào)用service2時,報錯:
Failed to establish a new connection: [Errno 113] No route to host'
原因分析
- 我是在centos服務(wù)器上創(chuàng)建的docker容器,其網(wǎng)絡(luò)模式采用的是bridger模式。
- 啟動docker時,docker進(jìn)程會創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,用于宿主機與容器之間的通信。當(dāng)啟動一個docker容器時,docker容器將會附加到虛擬網(wǎng)橋上,容器內(nèi)的報文通過docker0向外轉(zhuǎn)發(fā)。
- 如果docker容器訪問宿主機,那么docker0網(wǎng)橋?qū)笪闹苯愚D(zhuǎn)發(fā)到本機,報文的源地址是docker0網(wǎng)段的地址。
- 而如果docker容器訪問宿主機以外的機器,docker的SNAT網(wǎng)橋會將報文的源地址轉(zhuǎn)換為宿主機的地址,通過宿主機的網(wǎng)卡向外發(fā)送。
- 因此,當(dāng)docker容器訪問宿主機時,宿主機服務(wù)端口會被防火墻攔截,從而無法連通宿主機,出現(xiàn)No route to host的錯誤。
- 而訪問宿主機所在局域網(wǎng)內(nèi)的其他機器,由于報文的源地址是宿主機ip,因此不會被目的機器防火墻攔截,所以可以訪問。
解決辦法
解決辦法有兩種:
- 在防火墻上開放指定端口(推薦),本文中的示例端口號為8033
firewall-cmd --zone=public --add-port=8033/tcp --permanent firewall-cmd --reload
- 關(guān)閉防火墻
systemctl stop firewalld
總結(jié)
- 我在服務(wù)器A上部署的服務(wù)調(diào)用其他服務(wù)器上的服務(wù),比如服務(wù)器B的service3服務(wù),是沒有問題的,報文的源地址會轉(zhuǎn)換為宿主機的地址;
- 但是如果我訪問宿主機的服務(wù),即服務(wù)器A上其他容器的服務(wù),報文的源地址是docker0網(wǎng)段的地址,宿主機服務(wù)端口會被防火墻攔截,從而出現(xiàn)No route to host的錯誤,需要在防火墻上開放指定端口來解決。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用docker部署influxdb與 mongo的常用命令
這篇文章主要介紹了使用docker部署influxdb與 mongo的常用命令,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05Docker部署Mysql,.Net6,Sqlserver等容器
這篇文章介紹了Docker部署Mysql,.Net6,Sqlserver等容器的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12阿里云ECS(CentOS鏡像)安裝docker的實現(xiàn)步驟
本文主要介紹了阿里云ECS(CentOS鏡像)安裝docker的實現(xiàn)步驟,從準(zhǔn)備工作到實際安裝步驟,詳細(xì)解析每一步操作,具有一定的參考價值,感興趣的可以了解一下2024-01-01docker之如何設(shè)置日志文件大小及個數(shù)
這篇文章主要介紹了docker之如何設(shè)置日志文件大小及個數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05docker可視化管理工具portainer忘記密碼重置教程的實現(xiàn)
本文主要介紹了docker可視化管理工具portainer忘記密碼重置教程的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08