我正在使用 docker-compose 运行 2 个容器,1 个用于运行 react 应用程序,另一个用于运行 rabbitmq 服务器。
version: '2'
services:
node.app.local:
build:
context: ./node
container_name: app-node
hostname: node.app
domainname: local
tty: true
volumes:
- "${SOURCES_PATH}/app:/var/www/app"
ports:
- 8091:8091
expose:
- 8091
links:
- rabbitmq.app.local
working_dir: "/var/www/app"
rabbitmq.app.local:
image: rabbitmq:3.6.10
container_name: app-rabbitmq
hostname: rabbitmq.app
domainname: local
tty: true
expose:
- 5672
- 15672
- 15674
我知道我的节点容器和我的 rabbitmq 服务器之间的链接运行良好,因为我可以从我的节点容器 ping 服务器:
$ docker exec -it app-node bash
$ ping rabbitmq.app.local
64 bytes from 172.18.0.12: icmp_seq=0 ttl=64 time=0.099 ms
64 bytes from 172.18.0.12: icmp_seq=1 ttl=64 time=0.098 ms
64 bytes from 172.18.0.12: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 172.18.0.12: icmp_seq=3 ttl=64 time=0.088 ms
在我的 js 应用程序中,如果我打开与服务器 IP 的连接(由 ping 公开的 172.18.0.12),它运行良好:
const ws = new WebSocket('ws://172.18.0.12:15674/ws');
//connected to server RabbitMQ/3.6.10
但是,如果我尝试使用容器名称:
const ws = new WebSocket('ws://rabbitmq.app.local:15674/ws');
VM7698:35 WebSocket connection to 'ws://rabbitmq.app.local:15674/ws' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED
有谁知道为什么我可以在 CLI 中 ping 服务器但无法通过 ws 协议(protocol)访问它?
最佳答案
在一个容器中使用 PHP 连接到另一个容器中的 websocket 服务时,我遇到了同样的问题。
我做了一些研究,发现 docker compose v2 使用 user-defined networks ,它引入了嵌入式 DNS 服务器,取代了默认桥接网络中容器内的传统 DNS。
The embedded DNS server maintains the mapping between all of the container aliases and its IP address on a specific user-defined network.
根据 docker 官方文档,它是如何工作的。但似乎在尝试对容器别名或链接进行 DNS 解析时出现了一些问题,jake-low 表示。 ,docker-compose 的贡献者。
所以,这个问题的另一种解决方案是先通过主机名获取IP,然后使用解析的IP连接到websocket服务。这就是我解决问题的方法。
关于docker - 打开从 docker 容器到另一个容器的 WebSocket 连接(能够在 cli 中 ping 容器,但不能通过 ws),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760641/