詳解如何解決docker容器無(wú)法通過(guò)IP訪問(wèn)宿主機(jī)問(wèn)題
問(wèn)題起源
在使用 docker 的過(guò)程中我不幸需要在 docker 容器中訪問(wèn)宿主機(jī)的 80 端口, 而這個(gè) 80 端口是另外一個(gè)容器 8080 端口映射出去的. 當(dāng)我在容器里通過(guò) docker 的網(wǎng)橋 172.17.0.1 訪問(wèn)宿主機(jī)時(shí), 居然發(fā)現(xiàn):
curl: (7) Failed to connect to 172.17.0.1 port 80: No route to host
查找問(wèn)題原因
可以確定的是容器與宿主機(jī)是有網(wǎng)絡(luò)連接的, 因?yàn)榭梢栽谌萜鲀?nèi)部通過(guò) 172.17.0.1 Ping 通宿主機(jī):
root@930d07576eef:/# ping 172.17.0.1 PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data. 64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.130 ms
也可以在容器內(nèi)部訪問(wèn)其它內(nèi)網(wǎng)和外網(wǎng).
iptables 顯示也允許 docker 容器訪問(wèn):
# iptables --list | grep DOCKER DOCKER-ISOLATION all -- anywhere anywhere DOCKER all -- anywhere anywhere Chain DOCKER (1 references) Chain DOCKER-ISOLATION (1 references)
之后在查找一些資料后發(fā)現(xiàn)這個(gè)問(wèn)題:NO ROUTE TO HOST network request from container to host-ip:port published from other container.
解釋
正如 Docker Community Forms 所言, 這是一個(gè)已知的 Bug, 宿主機(jī)的 80 端口允許其它計(jì)算機(jī)訪問(wèn), 但是不允許來(lái)自本機(jī)的 Docker 容器訪問(wèn). 必須通過(guò)設(shè)置 firewalld 規(guī)則允許本機(jī)的 Docker 容器訪問(wèn).
gypark 指出可以通過(guò)在 /etc/firewalld/zones/public.xml 中添加防火墻規(guī)則避免這個(gè)問(wèn)題:
<rule family="ipv4"> <source address="172.17.0.0/16" /> <accept /> </rule>
注意這里的 172.17.0.0/16
可以匹配 172.17.xx.xx
IP 段的所有 IP.
之后重啟下防火墻:
systemctl restart firewalld
之后就可以在 docker 容器內(nèi)部訪問(wèn)宿主機(jī) 80 端口.
其它問(wèn)題
實(shí)際上當(dāng)我又用 vmware 新開(kāi)了一臺(tái)虛擬機(jī)希望能重現(xiàn)這個(gè)問(wèn)題的時(shí)候, 發(fā)現(xiàn)在新的虛擬機(jī)上居然沒(méi)有類(lèi)似的問(wèn)題. 也就是說(shuō)容器可以直接通過(guò)172.17.0.1
訪問(wèn)宿主機(jī) 80 端口, 查看防火墻配置也沒(méi)看到有172.17.xx.xx
的白名單.
猜測(cè)是由于在新的虛擬機(jī)安裝的 docker 是 Docker version 1.12.5, build 047e51b/1.12.5
, 也就是 Red Hat 從 docker 開(kāi)源版本遷出開(kāi)發(fā)的版本, 而之前的是 Docker version 17.06.2-ce, build cec0b72
屬于 Docker-CE
, 可能是 docker 版本有差異, Red Hat 順便把那個(gè) Known Bug 修復(fù)了.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Docker容器與宿主機(jī)相互訪問(wèn)更方便的方法
- Docker MySQL無(wú)法被宿主機(jī)訪問(wèn)的問(wèn)題解決
- docker內(nèi)服務(wù)訪問(wèn)宿主機(jī)服務(wù)的實(shí)現(xiàn)
- docker容器訪問(wèn)宿主機(jī)的MySQL操作
- docker容器無(wú)法訪問(wèn)宿主機(jī)端口的解決
- Docker內(nèi)如何訪問(wèn)本機(jī)(宿主機(jī))的具體方法
- Docker容器訪問(wèn)宿主機(jī)網(wǎng)絡(luò)的方法
- Docker如何訪問(wèn)到宿主機(jī)MYSQL的實(shí)現(xiàn)方法
相關(guān)文章
Docker安裝配置MySQL的實(shí)現(xiàn)步驟
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一。在本教程中,會(huì)帶大家正確安裝配置MySQL在Docker2021-11-11docker-compose部署mysql數(shù)據(jù)庫(kù)完整步驟
Docker-Compose項(xiàng)目是Docker官方的開(kāi)源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)Docker容器集群的快速編排,這篇文章主要給大家介紹了關(guān)于docker-compose部署mysql數(shù)據(jù)庫(kù)的完整步驟,需要的朋友可以參考下2024-05-05docker mysql鏡像因?yàn)榕渲梦募霈F(xiàn)錯(cuò)誤一直提示重啟的解決
這篇文章主要介紹了docker mysql鏡像因?yàn)榕渲梦募霈F(xiàn)錯(cuò)誤一直提示重啟的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11關(guān)于docker啟動(dòng)jenkins環(huán)境的問(wèn)題
這篇文章主要介紹了docker啟動(dòng)jenkins環(huán)境的問(wèn)題,文中提到了jenkins基本工作原理及管理員密碼獲取方法,對(duì)docker啟動(dòng)jenkins環(huán)境相關(guān)知識(shí)感興趣的朋友一起看看吧2022-04-04