[英]How to access Docker container's internal IP address from host?
我有 2 個 docker 容器在我的 Mac 主機上運行——容器 1 是來自 Docker Hub 的 Jenkins ,容器 2 是來自 Docker Hub 的 SonarQube 。 我的兩個容器都運行成功。 我可以通過轉到http://localhost:8080/
從我的主機訪問 Jenkins,我可以通過轉到http://localhost:9000/
訪問我的 SonarQube。
Jenkins 容器是這樣啟動的:
docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:latest
SonarQube 容器是這樣啟動的:
docker run -d -p 9000:9000 sonarqube
現在我想讓每個容器相互通信,所以我需要向每個容器提供另一個容器的 IP 地址。
我通過執行以下命令獲得了每個容器的 IP 地址:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
這將返回 Jenkins 容器的 IP 地址172.17.0.2
和 SonarQube 容器的172.17.0.3
。 但是當我嘗試通過轉到http://172.17.0.2:8080
從我的主機訪問 Jenkins 容器時,我收到請求超時。 當我嘗試通過轉到http://172.17.0.3:9000
從我的主機訪問 SonarQube 容器時,也會發生同樣的事情
這是正常行為嗎?
我不應該能夠通過它們的內部 IP 地址從我的主機訪問每個容器嗎?
我如何測試一個容器(例如 Jenkins)可以通過 IP 地址訪問另一個容器(例如 SonarQube)?
看起來您正在使用默認的bridge
網絡模型。 內部 IP 用於每個容器在bridge
網絡下相互通信。 您無法從主機訪問它們。
您有多種選擇。
http://172.17.0.3:9000
配置為 Jenkins 中的聲納端點。http://172.17.0.2:8000
配置為聲納中的 jenkins 端點。172.17.0.1
)及其internal
端口與每個容器進行通信。 所以基本上你也可以配置http://172.17.0.1
。注意 - 如果您定義用戶定義的橋接網絡,則默認網關 Ip 更改會更改。
https://docs.docker.com/v17.09/engine/userguide/networking/#the-default-bridge-network
https://docs.docker.com/network/network-tutorial-standalone/
如果你想使用 docker-compose 啟動兩個容器,那么你可以使用服務名稱鏈接兩個容器。 只需遵循Compose 中的 Networking 即可。
這是正常行為嗎? 我不應該能夠通過它們的內部 IP 地址從我的主機訪問每個容器嗎?
您所描述的是正常行為:您無法直接從 MacOS 主機訪問 Docker 內部 IP 地址。 請參閱適用於 Mac 的 Docker 文檔中的“每個容器的 IP 尋址是不可能的” 。
我如何測試一個容器(例如 Jenkins)可以通過 IP 地址訪問另一個容器(例如 SonarQube)?
這不是我通常“測試”的東西。 啟動兩個進程並讓它們建立正常的(HTTP)連接; 如果有效,您將看到相應的日志消息,如果無效,您將看到投訴。 (在容器中獲取根 shell 以將 ICMP 數據包從一個容器發送到另一個容器似乎是一種流行的選擇,但並不能證明什么。)
另外:不要通過顯式 IP 地址建立此連接。 正如您已經注意到的,Docker 內部 IP 地址在某些情況下不可用,並且它們會在您重新啟動容器時發生變化。 相反,Docker 提供了一個內部 DNS 服務,可以在容器之間通信時解析主機名,但你需要顯式設置一個非默認的橋接網絡。 該設置如下所示:
docker network create jenkinsnet
docker run --name sonarqube -d --net jenkinsnet \
-p 9000:9000 \
sonarqube
docker run --name jenkins -d --net jenkinsnet \
-p 8080:8080 -p 50000:50000 \
-e SONARQUBE_URL=http://sonarqube:9000 \
jenkins/jenkins:latest
所以我明確地創建了一個網絡; 啟動連接到它的兩個容器; 並告訴客戶端容器(通過環境變量)服務器容器的位置。 您不必使用docker run -p
發布端口以這種方式訪問它們; 無論您是否這樣做,請使用服務器進程正在偵聽的端口( docker run -p
選項中的第二個端口號)。
從主機,您到達容器的唯一(可移植、可靠)路徑是通過其發布的端口。
接受的答案 ( https://stackoverflow.com/a/53992787/7730554 ) 已經提供了有效的選項,我個人通常更喜歡使用 docker compose。
但是當您在 Mac 上運行 Docker 時,您也可以將host.docker.internal與定義的轉發主機端口結合使用。 因此,即使您的主機 IP 發生變化,Docker 也會注意將 host.docker.internal 解析為相應的 IP。
請參閱https://docs.docker.com/desktop/mac/networking/ 。 請注意,這僅適用於開發模式,並且在您使用 Docker Desktop 時有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.