簡體   English   中英

如何從主機訪問 Docker 容器的內部 IP 地址?

[英]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網絡下相互通信。 您無法從主機訪問它們。

您有多種選擇。

  1. 您可以將http://172.17.0.3:9000配置為 Jenkins 中的聲納端點。
  2. 您可以將http://172.17.0.2:8000配置為聲納中的 jenkins 端點。
  3. 如果您不想在 Ips 之上進行硬編碼,那么您的兩個容器都可以使用 Docker Default GatewayIp( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM