2 votes

La connexion WebSocket sortante à partir d'un conteneur Docker ne fonctionne pas

J'ai un programme TypeScript simple qui tourne sur Docker, et ce programme aimerait ouvrir une connexion Websocket avec un serveur Websocket externe. Quelque chose comme ceci

-----------------------                   ------------------------------
| My Local Docker     |                   | my.ws-server.somewhere.com |                   
|                     |                   |                            |
|    WS client        |---> Internet----->| WS server                  |
-----------------------                   ------------------------------

Lorsque je lance ( ts-node test.js ) le code avec le client WS sur mon environnement de développement en dehors de Docker, il fonctionne bien et peut se connecter sans problème :

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

Cependant, lorsque je place cette chose dans Docker et que je l'exécute, la connexion est refusée. Le programme démarre la tentative de connexion comme il se doit, mais il y a juste un timeout et la connexion n'est jamais ouverte. Je suppose que cela a quelque chose à voir avec le réseau Docker ? Si je veux ouvrir une connexion sortante de Docker vers le monde extérieur, dois-je définir des routes ou quelque chose comme ça ?

Ma configuration Docker

Fichier Docker

FROM node:12.18.3

RUN mkdir /src

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

EXPOSE 3000

docker-compose.yml

version: "3.4"
services:
  my-service:
      container_name: my-service
      restart: always
      build:
          context: .
          dockerfile: my-service.dockerfile
      volumes:
          - ".:/src"

(J'ai remarqué que je pouvais faire fonctionner ce système en ajoutant network_mode: "host" à docker compose, mais ce n'est pas ce que je voudrais vraiment faire pour pouvoir conserver les mappages de ports entrants normaux)

0voto

Tout d'abord, vous devriez vérifier que votre websocket est ouvert sur le bon port, je vois que vous exposez le port 3000. Vous devez également vérifier que votre proxy est bien configuré pour ce port. Il est également possible que vous ayez besoin d'une connexion sécurisée pour que cela fonctionne (l'url devient alors wss://mywebsocket.something.com).

Faites-moi part de vos commentaires quand vous le pouvez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X