打开一个从Docker容器到另一个容器的WebSocket连接(能够在cli中ping容器但不能通过ws)

我使用docker-compose来运行2个容器,1个运行一个反应应用程序,另一个运行一个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时间= 0.099ms

来自172.18.0.12的64字节:icmp_seq = 1 ttl = 64时间= 0.098ms

来自172.18.0.12的64字节:icmp_seq = 2 ttl = 64时间= 0.069ms

来自172.18.0.12的64字节:icmp_seq = 3 ttl = 64时间= 0.088ms

在我的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连接失败:连接build立时出错:net :: ERR_NAME_NOT_RESOLVED

有谁知道我为什么可以在CLI中ping服务器,但无法通过ws协议访问它?

当在一个容器中使用PHP连接到另一个容器中的websocket服务时,我遇到了同样的问题。

我做了一些研究,发现docker compose v2使用了用户定义的networking ,这个networking引入了一个embedded式的DNS服务器,取代了默认网桥容器中的传统DNS。

embedded式DNS服务器维护所有容器别名与其在特定用户定义networking上的IP地址之间的映射。

根据docker官方文件,这是如何工作的。 但是,似乎在尝试DNSparsing容器别名或链接时存在一些问题,由docker撰写者贡献者杰克 – 低说。

所以,这个问题的另一种解决scheme是首先通过主机名获取IP,然后使用parsing的IP连接到websocket服务。 这是我解决问题的方法。