詳解如何解決docker容器無法通過IP訪問宿主機(jī)問題
問題起源
在使用 docker 的過程中我不幸需要在 docker 容器中訪問宿主機(jī)的 80 端口, 而這個(gè) 80 端口是另外一個(gè)容器 8080 端口映射出去的. 當(dāng)我在容器里通過 docker 的網(wǎng)橋 172.17.0.1 訪問宿主機(jī)時(shí), 居然發(fā)現(xiàn):
curl: (7) Failed to connect to 172.17.0.1 port 80: No route to host
查找問題原因
可以確定的是容器與宿主機(jī)是有網(wǎng)絡(luò)連接的, 因?yàn)榭梢栽谌萜鲀?nèi)部通過 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)部訪問其它內(nèi)網(wǎng)和外網(wǎng).
iptables 顯示也允許 docker 容器訪問:
# 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è)問題: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ī)訪問, 但是不允許來自本機(jī)的 Docker 容器訪問. 必須通過設(shè)置 firewalld 規(guī)則允許本機(jī)的 Docker 容器訪問.
gypark 指出可以通過在 /etc/firewalld/zones/public.xml 中添加防火墻規(guī)則避免這個(gè)問題:
<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)部訪問宿主機(jī) 80 端口.
其它問題
實(shí)際上當(dāng)我又用 vmware 新開了一臺(tái)虛擬機(jī)希望能重現(xiàn)這個(gè)問題的時(shí)候, 發(fā)現(xiàn)在新的虛擬機(jī)上居然沒有類似的問題. 也就是說容器可以直接通過172.17.0.1訪問宿主機(jī) 80 端口, 查看防火墻配置也沒看到有172.17.xx.xx的白名單.
猜測是由于在新的虛擬機(jī)安裝的 docker 是 Docker version 1.12.5, build 047e51b/1.12.5, 也就是 Red Hat 從 docker 開源版本遷出開發(fā)的版本, 而之前的是 Docker version 17.06.2-ce, build cec0b72 屬于 Docker-CE, 可能是 docker 版本有差異, Red Hat 順便把那個(gè) Known Bug 修復(fù)了.
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker部署Ragflow(完美解決502 bad gateway)
本文主要介紹了Docker部署Ragflow,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
Docker實(shí)現(xiàn)分布式應(yīng)用功能教程
這篇文章主要介紹了Docker實(shí)現(xiàn)分布式應(yīng)用功能,涉及docker分布式應(yīng)用、負(fù)載均衡相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-06-06
啟動(dòng)docker錯(cuò)誤systemctl status docker.service問題及解決
文章討論了啟動(dòng)Docker和執(zhí)行docker ps命令失敗的問題,但docker -v顯示成功,解決辦法包括在阿里云容器鏡像中找到鏡像加速器或使用公共鏡像地址,默認(rèn)情況下,Docker使用官方地址2025-01-01
Docker部署Rabbitmq容器實(shí)現(xiàn)過程解析
這篇文章主要介紹了Docker部署Rabbitmq容器實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Docker 實(shí)現(xiàn)瀏覽器里開發(fā)Android應(yīng)用的功能
這篇文章主要介紹了Docker 實(shí)現(xiàn)瀏覽器里開發(fā)Android應(yīng)用的功能的相關(guān)資料,這里對(duì)布置環(huán)境做了詳細(xì)的步驟,也許你能用到這樣的功能,需要的朋友可以參考下2016-11-11
Docker 倉庫管理和Docker Dockerfile詳解
倉庫(Repository)是集中存放鏡像的地方,以下介紹一下 Docker Hub,當(dāng)然不止 docker hub,只是遠(yuǎn)程的服務(wù)商不一樣,操作都是一樣的,對(duì)Docker 倉庫管理相關(guān)知識(shí)感興趣的朋友一起看看吧2023-11-11
docker中鏡像映射和端口映射的實(shí)現(xiàn)步驟
本文介紹了在Docker中進(jìn)行鏡像映射和端口映射,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
如何解決docker容器訪問不了外部網(wǎng)絡(luò)問題
介紹了Docker?bridge網(wǎng)絡(luò)的工作原理,包括虛擬網(wǎng)橋的創(chuàng)建、容器的IP地址分配、IP轉(zhuǎn)發(fā)的作用以及NAT的配置,通過配置IP轉(zhuǎn)發(fā)和NAT規(guī)則,Docker能夠?qū)崿F(xiàn)容器與外部網(wǎng)絡(luò)之間的通信,文章還提供了解決某個(gè)具體問題的步驟2024-11-11

