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

时间:2017-06-26 13:15:08

标签: docker websocket docker-compose

我正在使用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协议访问它?

1 个答案:

答案 0 :(得分:2)

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

我做了一些研究,发现docker compose v2使用了user-defined networks,它引入了嵌入式DNS服务器,取代了默认网桥中容器内的传统DNS。

  

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

根据码头官方文件,它是如何运作的。但似乎在尝试DNS解析容器别名或链接时存在一些问题,jake-low是docker-compose的贡献者所说的。

因此,此问题的另一种解决方案是首先通过主机名获取IP,然后使用已解析的IP连接到websocket服务。这就是我解决问题的方法。