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
タグ: Docker, Node.js