我正在使用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
来自172.18.0.12的64个字节:icmp_seq = 0 ttl = 64 time = 0.099 ms
来自172.18.0.12的64个字节:icmp_seq = 1 ttl = 64 time = 0.098 ms
来自172.18.0.12的64个字节:icmp_seq = 2 ttl = 64 time = 0.069 ms
来自172.18.0.12的64个字节: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与'ws://rabbitmq.app.local:15674 / ws'的WebSocket连接失败:连接建立错误:net :: ERR_NAME_NOT_RESOLVED
有谁知道为什么我可以在CLI中ping服务器但无法通过ws协议访问它?
答案 0 :(得分:2)
在一个连接到另一个容器中的websocket服务的容器中使用PHP时遇到了同样的问题。
我做了一些研究,发现docker compose v2使用了user-defined networks,它引入了嵌入式DNS服务器,取代了默认网桥中容器内的传统DNS。
嵌入式DNS服务器维护所有容器别名与其在特定用户定义网络上的IP地址之间的映射。
根据码头官方文件,它是如何运作的。但似乎在尝试DNS解析容器别名或链接时存在一些问题,jake-low是docker-compose的贡献者所说的。
因此,此问题的另一种解决方案是首先通过主机名获取IP,然后使用已解析的IP连接到websocket服务。这就是我解决问题的方法。