外部主機無法訪問宿主機內容器是怎麼回事

2022-06-05 07:06:09 字數 1790 閱讀 1376

是因為建立的容器採用的網路型別是 bridge,而宿主機沒有啟用 ip **,所以,外部主機請求沒有**到對應容器。需要兩個步驟啟用 ip **功能。(來自 docker 官方文件 )

配置 linux 核心允許 ip **。

$ sysctl net.ipv4.conf.all.forwarding=1
將 iptables forward 規則從 drop 改為 accept。

$ sudo iptables -p forward accept
因為測試需要,在一台 centos 7 伺服器上用 docker 部署了乙個 nginx 服務。部署好之後,在宿主機上使用 curl 命令可以訪問 nginx 服務,但是外部機訪問卻提示 http error 503,服務不可用。檢視了容器中 nginx 的 access 日誌,發現也沒有訪問日誌,雙方都表示不是自己的責任。那就看看是不是中間商(宿主機)的責任吧。

首先想到的是宿主機的防火牆可能沒有開放埠,把請求給攔掉了。不過,使用systemctl status firewalld檢視防火牆並沒有開啟。那就看看是不是 docker 自身的網路配置的問題。

首先使用docker inspect docker-name檢視容器的網路配置資訊:

"networks": 

}

可以看到使用的網路型別是 root_default,乙個自定義的網路型別,繼續使用命令docker network ls檢視該網路具體的網路型別:

network id          name                driver              scope

5934ab852fe2 bridge bridge local

057efb45b2a8 host host local

8bb8b2aa1a26 kind bridge local

a99c8640a808 none null local

9781d8e96e34 root_default bridge local

如上所示,自定義網路型別 root_defualt 是網橋,那麼網橋為什麼會導致資料沒有**呢?我的 docker 知識比較匱乏,不過可以到官方文件看看有沒有相應的描述。(文件傳送)

在文件中,看到了這麼一段內容:

從文件中,我們可以了解到,docker 的網橋是軟體網橋,它只允許使用了同乙個網橋的容器之間互相通訊,docker 會自動在宿主機上建立**規則,避免不同網橋上的容器相互直接通訊。不過,如果是不同宿主機上的容器,需要在系統層面增加路由,或者將網路型別改為 overlay。似乎已經破案了,雖然文件中說的是不同主機間容器的通訊,不同主機和當前宿主機的容器間的通訊可能也是因為現在這台主機上可能沒有開啟系統層面的路由。

文件繼續往下看,我們找到了開啟系統方法,即本文開始的兩條命令:

$ sysctl net.ipv4.conf.all.forwarding=1

$ sudo iptables -p forward accept

因為,宿主機沒有開啟防火牆,所以只執行了第一條命令,然後通過瀏覽器訪問服務,訪問成功。

容器無法訪問容器宿主機外部網路

現象是a機器上的容器無法訪問b機器 檢視docker網路 com.docker.network.bridge.enable ip masquerade值為false.enable ip masquerade 是否開啟ip偽裝 ip偽裝,是linux系統的一種網路功能,如果一台linux主機使用ip偽...

docker 啟動kafka宿主機無法訪問

先看我啟動命令 docker run e tz asia shanghai privileged itd h single.com p 127.0.0.1 9092 9092 p 127.0.0.1 2181 2181 v d soft var soft name single.com test k...

Docker容器訪問宿主機網路

業務請求量小的時候,我們會把一些工程部署到同一臺機器上。這些工程之間也會相互訪問。如果是http的介面,我們最方便的是使用localhost帶地本機的ip。不過結合docker容器後出現了問題。docker容器中localhost表示容器的ip位址。不是宿主機ip。其實docker容器執行的時候有h...