来自 Docker 容器的出站 WebSocket 连接不起作用

Jus*_*i A 5 websocket node.js typescript docker

我有一个在 Docker 上运行的简单 TypeScript 程序,该程序想要打开与外部 Websocket 服务器的 Websocket 连接。像这样的东西

-----------------------                   ------------------------------
| My Local Docker     |                   | my.ws-server.somewhere.com |                   
|                     |                   |                            |
|    WS client        |---> Internet----->| WS server                  |
-----------------------                   ------------------------------
Run Code Online (Sandbox Code Playgroud)

当我ts-node test.js在 Docker 之外的开发环境中使用 WS 客户端运行 ( ) 代码时,它工作正常并且可以毫无问题地连接:

let ws = new WebSocket("ws://my.ws-server.somewhere.com", [], { })
ws.onopen = () => {
  console.log('Connection opened ok! ')
}
Run Code Online (Sandbox Code Playgroud)

但是,当我将这个东西放入 Docker 并在那里运行时,连接被拒绝。程序按其应有的方式开始连接尝试,但只是超时,并且连接从未打开。我猜这与 Docker 网络有关?如果我想打开一个从Docker到外界的出站连接,我需要定义一些路由什么的吗?

我的 Docker 设置

Dockerfile

FROM node:12.18.3

RUN mkdir /src

WORKDIR /src
ADD ./package.json /src/package.json
RUN npm install

EXPOSE 3000
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: "3.4"
services:
  my-service:
      container_name: my-service
      restart: always
      build:
          context: .
          dockerfile: my-service.dockerfile
      volumes:
          - ".:/src"
Run Code Online (Sandbox Code Playgroud)

(我注意到我可以通过添加network_mode: "host"到 docker compose 来完成这项工作,但这并不是我真正想要做的,这样我就可以保留正常的入站端口映射)

小智 0

首先,您应该检查您的 websocket 是否在良好的端口上打开,我看到您公开了端口 3000。此外,您还必须检查您的代理是否已为该端口设置良好。您也可能需要安全的 Websocket 连接才能使其正常工作(然后 url 变为 wss://mywebsocket.something.com)。

可以的话给我反馈