我在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
这是正常行为吗?
我不能通过主机的内部IP地址从主机访问每个容器吗?
我如何测试一个容器(例如Jenkins)是否可以通过IP地址访问另一个容器(例如SonarQube)?
答案 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
网络下相互通信。您无法从主机访问它们。
为您提供多种选择。
http://172.17.0.3:9000
配置为Jenkins的声纳端点。http://172.17.0.2:8000
配置为声纳中的詹金斯端点。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。