如何从主机访问Docker容器的内部IP地址?

gom*_*sha 6 jenkins docker sonarqube

我有 2 个 docker 容器在我的 Mac 主机上运行 - 容器 1 是来自 Docker Hub 的 Jenkins,而容器 2 是来自 Docker Hub 的 SonarQube。我有两个容器成功运行。我可以通过访问从我的主机访问 Jenkins http://localhost:8080/,我可以通过访问访问我的 SonarQube http://localhost:9000/

Jenkins 容器是这样启动的:

docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:latest
Run Code Online (Sandbox Code Playgroud)

SonarQube 容器是这样启动的:

docker run -d -p 9000:9000 sonarqube
Run Code Online (Sandbox Code Playgroud)

现在我想让每个容器相互通信,所以我需要向每个容器提供另一个容器的 IP 地址。

我通过执行以下命令获得了每个容器IP 地址

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
Run Code Online (Sandbox Code Playgroud)

这将返回172.17.0.2Jenkins 容器和172.17.0.3SonarQube 容器的 IP 地址。但是当我尝试从我的主机访问 Jenkins 容器时,http://172.17.0.2:8080我收到请求超时。当我尝试从我的主机访问 SonarQube 容器时,会发生同样的事情http://172.17.0.3:9000

这是正常行为吗?

我不应该能够通过它们的内部 IP 地址从我的主机访问每个容器吗?

以及如何测试一个容器(例如 Jenkins)是否可以通过 IP 地址访问另一个容器(例如 SonarQube)?

Imr*_*ran 2

看起来您正在使用默认bridge网络模型。内部 IP 旨在让每个容器在网络下相互通信bridge。您无法从主机访问它们。

有多种选择供您选择。

  1. 您可以http://172.17.0.3:9000在 Jenkins 中配置为声纳端点。
  2. 您可以http://172.17.0.2:8000在声纳中配置为詹金斯端点。
  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即可。