摘要:問題起源在使用的過程中我不幸需要在容器中訪問宿主機的端口而這個端口是另外一個容器端口映射出去的當我在容器里通過的網橋訪問宿主機時居然發現查找問題原因可以確定的是容器與宿主機是有網絡連接的因為可以在容器內部通過通宿主機也可以在容器內部訪問其它
問題起源
在使用 docker 的過程中我不幸需要在 docker 容器中訪問宿主機的 80 端口, 而這個 80 端口是另外一個容器 8080 端口映射出去的. 當我在容器里通過 docker 的網橋 172.17.0.1 訪問宿主機時, 居然發現:
curl: (7) Failed to connect to 172.17.0.1 port 80: No route to host查找問題原因
可以確定的是容器與宿主機是有網絡連接的, 因為可以在容器內部通過 172.17.0.1 Ping 通宿主機:
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
也可以在容器內部訪問其它內網和外網.
iptables 顯示也允許 docker 容器訪問:
# iptables --list | grep DOCKER DOCKER-ISOLATION all -- anywhere anywhere DOCKER all -- anywhere anywhere Chain DOCKER (1 references) Chain DOCKER-ISOLATION (1 references)
之后在查找一些資料后發現這個問題: NO ROUTE TO HOST network request from container to host-ip:port published from other container.
解釋正如 Docker Community Forms 所言, 這是一個已知的 Bug, 宿主機的 80 端口允許其它計算機訪問, 但是不允許來自本機的 Docker 容器訪問. 必須通過設置 firewalld 規則允許本機的 Docker 容器訪問.
gypark 指出可以通過在 /etc/firewalld/zones/public.xml 中添加防火墻規則避免這個問題:
注意這里的 172.17.0.0/16 可以匹配 172.17.xx.xx IP 段的所有 IP.
之后重啟下防火墻:
systemctl restart firewalld
之后就可以在 docker 容器內部訪問宿主機 80 端口.
其它問題實際上當我又用 vmware 新開了一臺虛擬機希望能重現這個問題的時候, 發現在新的虛擬機上居然沒有類似的問題. 也就是說容器可以直接通過172.17.0.1訪問宿主機 80 端口, 查看防火墻配置也沒看到有172.17.xx.xx的白名單.
猜測是由于在新的虛擬機安裝的 docker 是 Docker version 1.12.5, build 047e51b/1.12.5, 也就是 Red Hat 從 docker 開源版本遷出開發的版本, 而之前的是 Docker version 17.06.2-ce, build cec0b72 屬于 Docker-CE, 可能是 docker 版本有差異, Red Hat 順便把那個 Known Bug 修復了.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27655.html
摘要:每個節點的網橋使用一個子網,每個容器使用一個子網內的,那么我們就可以組成下圖中所示網絡。到此,在的協調下,各個主機上的子網就不會再沖突了,另外,會維護容器網絡的路由規則,容器就可以通過訪問容器了,也就實現了跨主機容器互聯。 當您將多臺服務器節點組成一個Docker集群時,需要對集群網絡進行設置,否則默認情況下,無法跨主機容器互聯,接下來我們首先分析一下原因。 跨主機容器互聯 下圖描述了...
摘要:日志會顯示令牌過期的信息,隨后檢查主機和主機的時鐘是否同步。如果這個子網已經被使用,你將需要更改網絡中使用的默認子網。如果負載均衡器處于初始化狀態,則很可能主機之間無法進行跨主機通信。而一直顯示黃色初始化狀態,說明一直沒有通過健康檢查。 一、服務/容器 1、為什么我只能編輯容器的名稱? Docker容器在創建之后就不可更改了。唯一可更改的內容是我們要存儲的不屬于Docker容器本身的那...
摘要:而本文主要針對容器間的網絡通信方法進行討論。而同屬于用戶自定義的容器之間自動將所有端口暴露,方便容器間進行無障礙的通信,而不會遭受到外界的意外訪問。幾天前,為了解決日常在本地進行日常工作和開發測試之間的矛盾,利用docker在Windows系統中搭建了基于Linux的測試環境:借助Docker,在win10下編碼,一鍵在Linux下測試。在這邊文章里主要介紹了如何在本地通過docker構建與...
閱讀 1487·2021-11-24 11:16
閱讀 2689·2021-07-28 12:32
閱讀 2302·2019-08-30 11:22
閱讀 1440·2019-08-30 11:01
閱讀 595·2019-08-29 16:24
閱讀 3547·2019-08-29 12:52
閱讀 1625·2019-08-29 12:15
閱讀 1332·2019-08-29 11:18