从容器内部访问服务主机

时间:2021-04-06 20:59:34

标签: docker docker-compose host spring-cloud-config

我有一个 Spring Boot 配置服务器在 localhost 的 8888 端口上运行。我想从 docker 容器内部访问此服务。我不能把这个服务放在同一个 docker-compose 和同一个网络中。

服务:http://localhost:8888/cpo-executor/dev
使用我的 IP:http://192.168.0.6:8888/cpo-executor/dev

我已经在浏览器上检查了这个地址并且它正在工作。当我尝试从 docker 容器内部访问时,出现错误:

docker exec -it 7febe846f2ea /bin/bash
curl http://192.168.0.6:8888/cpo-executor/dev

错误:

curl: (7) Failed to connect to 192.168.0.6 port 8888: Connection timed out

我试图启动我的容器,在 docker-compose 中放置“network_mode: host”,但我最终陷入了另一个错误,一个容器没有与另一个容器通信。

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Caused by: java.net.UnknownHostException: mysql

如何从 docker 容器内的主机访问服务?

1 个答案:

答案 0 :(得分:0)

解决方案取决于您的 Docker 引擎在哪个平台上运行。

  1. 在 Windows 上,您的容器可以连接到具有特殊主机名 host.docker.internal 的主机(请参阅 Docker docs)。相比之下,host 网络模式不适用于 Windows(请参阅 Docker docs)。

  2. 在 Linux 上,您应该使用 host 网络模式。但是,这将破坏您的容器相互连接的方式。在默认的 bridge 网络模式下,它们可以使用与服务名称相同的主机名(在您的情况下为 mysql)相互连接。但是对于 Host 网络模式,您应该使用 localhost 主机名,因为所有容器共享同一主机的网络。