node.js - Utgående WebSocket-anslutning från Docker-container fungerar inte
Jag har ett enkelt TypeScript-program som körs på Docker, och detta program skulle vilja öppna en Websocket-anslutning till en extern Websocket-server. Något sånt här
----------------------- ------------------------------
| My Local Docker | | my.ws-server.somewhere.com |
| | | |
| WS client |---> Internet----->| WS server |
----------------------- ------------------------------
När jag kör (ts-node test.js) koden med WS-klienten på min utvecklingsmiljö utanför Docker, fungerar det bra och kan ansluta utan några problem:
let ws = new WebSocket("ws://my.ws-server.somewhere.com", [], { })
ws.onopen = () => {
console.log('Connection opened ok! ')
}
Men när jag stoppar det här i något i Docker och kör det där, nekas anslutningen. Programmet startar anslutningsförsöket som det ska, men det blir bara en timeout och anslutningen öppnas aldrig. Jag antar att detta har något att göra med Docker-nätverket? Om jag vill öppna en utgående anslutning från Docker till omvärlden, behöver jag definiera några rutter eller något?
Min Docker-inställning
Dockerfil
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"
(Jag märkte att jag kan få detta att fungera genom att lägga till network_mode: "host" i docker compose, men det är inte riktigt vad jag vill göra eftersom jag vill behålla de vanliga inkommande portmappningarna)
Svar #1
Först bör du kontrollera om din websocket är öppen på rätt port, jag ser att du exponerar port 3000. Du måste också kontrollera om din proxy är korrekt inställd för porten. Det kan också vara möjligt att du behöver en säker websocket-anslutning för att det ska fungera (då blir url:en wss://mywebsocket.something.com).
Ge mig feedback när du kan