No route to host兩個docker容器的服務(wù)訪問不通的解決
更新時間:2025年02月21日 10:44:04 作者:十九歲少年想長肌肉
在CentOS服務(wù)器上使用Docker容器時,當(dāng)容器之間的服務(wù)調(diào)用出現(xiàn)“Failed to establish a new connection: [Errno 113] No route to host”錯誤,是因?yàn)槿萜鞯膱笪脑吹刂繁环阑饓r截,解決方法有兩種:在防火墻上開放指定端口或關(guān)閉防火墻
問題描述
如圖,我的兩個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)橋,用于宿主機(jī)與容器之間的通信。當(dāng)啟動一個docker容器時,docker容器將會附加到虛擬網(wǎng)橋上,容器內(nèi)的報文通過docker0向外轉(zhuǎn)發(fā)。
- 如果docker容器訪問宿主機(jī),那么docker0網(wǎng)橋?qū)笪闹苯愚D(zhuǎn)發(fā)到本機(jī),報文的源地址是docker0網(wǎng)段的地址。
- 而如果docker容器訪問宿主機(jī)以外的機(jī)器,docker的SNAT網(wǎng)橋會將報文的源地址轉(zhuǎn)換為宿主機(jī)的地址,通過宿主機(jī)的網(wǎng)卡向外發(fā)送。
- 因此,當(dāng)docker容器訪問宿主機(jī)時,宿主機(jī)服務(wù)端口會被防火墻攔截,從而無法連通宿主機(jī),出現(xiàn)No route to host的錯誤。
- 而訪問宿主機(jī)所在局域網(wǎng)內(nèi)的其他機(jī)器,由于報文的源地址是宿主機(jī)ip,因此不會被目的機(jī)器防火墻攔截,所以可以訪問。
解決辦法
解決辦法有兩種:
- 在防火墻上開放指定端口(推薦),本文中的示例端口號為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)換為宿主機(jī)的地址;
- 但是如果我訪問宿主機(jī)的服務(wù),即服務(wù)器A上其他容器的服務(wù),報文的源地址是docker0網(wǎng)段的地址,宿主機(jī)服務(wù)端口會被防火墻攔截,從而出現(xiàn)No route to host的錯誤,需要在防火墻上開放指定端口來解決。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux系統(tǒng)Docker 部署 ASP.NET Core應(yīng)用的流程分析
這篇文章主要介紹了Linux系統(tǒng)Docker 部署 ASP.NET Core應(yīng)用的流程分析,在操作過程中小編遇到很多問題,下面把我的經(jīng)驗(yàn)及處理方法分享到腳本之家平臺,需要的朋友參考下吧2021-06-06
詳解使用 Docker 構(gòu)建 LNMP 環(huán)境
本篇文章主要介紹了使用 Docker 構(gòu)建 LNMP 環(huán)境,詳細(xì)的介紹了配置LNMP 環(huán)境的步驟。具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
Docker部署的gitlab升級的詳細(xì)步驟(升級到17.6.1版本)
本文詳細(xì)介紹了如何從GitLab 17.1.2版本升級到17.6.1版本,包括備份數(shù)據(jù)、確定升級路線、分步驟升級以及最終驗(yàn)證新版本的步驟,需要的朋友可以參考下2025-02-02

