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

标签 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

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/

相关文章:

ruby-on-rails - docker-compose 在 bundle 中找不到 gemfile

nginx - docker-compose + nginx-proxy + Letsencrypt-nginx-proxy-companion + gitlab-ce = git 克隆上的 SSH 连接失败

docker - 在 Windows 10 Home 中的 WSL 上设置 docker 的问题

docker - docker特权模式和kubernetes特权容器的区别

docker中的python脚本在卷中创建锁定文件

javascript - 使用 ws.onmessage = myFunc; 设置时如何删除 native websocket 处理程序或者 ws.onopen = function(){}?

php - mysql_connect 上的 Laradock 错误

javascript - close 似乎不适用于 WebSocket

ios - 在 websocket/SignalR 响应中获取 "\n "?

docker-compose 构建在 WSL2 中不起作用