Node.js の Docker コンテナーで WebSocket クライアントを作ってみた

WebSocket を使った通信において、サーバーから何かしらのメッセージを受け取ったら、バッチ処理するクライアントを想定してみます。そのクライアントは、例えば AWS Fargate でサービスとして起動していて、常に WebSocket サーバーに接続しています。コンテナーのサービスなので仮にサーバーとの通信が途絶えても、自動でコンテナーを再起動して通信可能になるまでリトライしてくれます。そんなコンテナーを想定して今回は、Node.js の Docker コンテナーで WebSocket クライアントを作ってみました。

server.js を作成

const WebSocket = require('ws');

const ws = new WebSocket(process.env.WSURL);

ws.on('error', console.error);

ws.on('open', function open() {
  console.log('open');
});

ws.on('message', function message(data) {
  console.log('received: %s', data);
});

package.json を作成

{
  "name": "mnrwsnodecli",
  "version": "0.0.1",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "ws": "^7.2.3"
  }
}

Docker を使わずにローカル検証

npm install

export WSURL=ws://localhost:8080

npm start

wscat -c ws://localhost:8080

Dockerfile を作成

FROM node:20

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

CMD [ "npm", "start" ]

Docker コンテナーで検証

docker build -t mnrwsnodecli .

docker run -d --rm \
  --name mnrwsnodecli \
  -e WSURL=ws://192.168.10.104:8080 \
  mnrwsnodecli

docker logs -f mnrwsnodecli

docker stop mnrwsnodecli

ローカルで動いている様子

左が Docker コンテナーのコンソールログ出力で、今回の WebSocket クライアントです。真ん中が WebSocket サーバーです。右がメッセージを送信するツールで、このツールから送ったメッセージを複数の WebSocker クライアントが受け取る事になります。

参考

https://www.npmjs.com/package/ws#sending-and-receiving-text-data

タグ: ,