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

时间:2019-01-01 00:48:56

标签: docker jenkins sonarqube

我在Mac主机上运行2个docker容器-容器1为Jenkins from Docker Hub,容器2为SonarQube from Docker Hub。我两个容器都成功运行。我可以通过访问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 address of each container

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

这将为Jenkins容器返回IP地址172.17.0.2,为SonarQube容器返回IP地址172.17.0.3。但是,当我尝试通过访问http://172.17.0.2:8080从主机访问Jenkins容器时,出现请求超时。当我尝试通过访问http://172.17.0.3:9000

从主机访问SonarQube容器时,也会发生同样的事情

这是正常行为吗?

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

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

3 个答案:

答案 0 :(得分:1)

  

这是正常行为吗?我不能通过主机的内部IP地址从主机访问每个容器吗?

您描述的是正常行为:您无法直接从MacOS主机访问Docker内部的IP地址。参见"Per-container IP addressing is not possible" in the Docker for Mac docs

  

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

这不是我通常“测试”的东西,本身。启动两个进程并使其建立正常的(HTTP)连接;如果有效,您将看到适当的日志消息,如果无效,您将看到投诉。 (在容器中获得根shell以便将ICMP数据包从一个容器发送到另一个容器似乎是一种流行的选择,但并没有证明太多。)

也:不要通过明确的IP地址建立此连接。您已经注意到Docker内部IP地址在某些情况下不可用,并且只要您重新启动容器,它们就会更改。取而代之的是,Docker提供了一个内部DNS服务,该服务可以在容器之间进行通信时解析主机名,但是您需要显式设置non-default bridge network。该设置看起来像:

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选项中的 second 端口号)。

从主机,到达容器的唯一(便携式,可靠)路径是通过其发布的端口。

答案 1 :(得分:1)

接受的答案(https://stackoverflow.com/a/53992787/7730554)已经提供了有效的选项,我个人通常更喜欢使用docker compose。

但是当您在Mac上运行Docker时,也可以将 host.docker.internal 与定义的转发主机端口结合使用。因此,即使您的主机IP发生更改,Docker也会将host.docker.internal解析为相应的IP。

答案 2 :(得分:0)

好像您正在使用默认的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

注意-如果定义user defined bridge network,则默认网关Ip更改更改。

https://docs.docker.com/v17.09/engine/userguide/networking/#the-default-bridge-network

https://docs.docker.com/network/network-tutorial-standalone/

如果要使用docker-compose启动两个容器,则可以使用服务名称链接两个容器。只需遵循Networking in Compose