Docker Compose で Node.js を動かしてみた

仕事で Node.js を使う機会があり、勉強がてら自分でいろいろ動かしてみました。
以前から興味のあった Discord の bot 作りを始めて、

  • そのコードを動作させる場所がほしい
  • → Docker の環境で動かそうぜ
  • → ついでに Web サーバも立ち上げてみようぜ

と見事に目的と手段が逆転し、Docker 環境下で Node.js を使った Web サーバを立ち上げてみました。

基本的な構成は Docker Compose と nginx でリバースプロキシを作ろうとしたお話(ネットワーク編) で作ったときと一緒です。
以前作ったものをそのまま活用しているので、https 対応もバッチリです。

/var/docker/app/discord.riina-k.dev
|--.dockerignore
|--docker-compose.yml
|--Dockerfile
|--app
  |--html <- Document Root
  | |--404.html
  | |--about.html
  | |--index.html
  |--node_modules <- Node モジュール
  | |--(ごにょごにょ)
  |--package.json
  |--package-lock.json
  |--server.js <- サーバ本体

docker-compose.yml では特に変わったことはしていません。

version: "3"

services:

  node.discord.riina-k.dev:
    build: .
    restart: on-failure
    container_name: node.discord.riina-k.dev
    environment:
      VIRTUAL_HOST: discord.riina-k.dev
      LETSENCRYPT_HOST: discord.riina-k.dev
      LETSENCRYPT_EMAIL: riinak.tv@gmail.com
    volumes:
      - ./app:/usr/src/app
    networks:
      - front_bridge
      - backend_mysql_bridge
      - admin_bridge

networks:
  front_bridge:
    external: true
  backend_mysql_bridge:
    external: true
  admin_bridge:
    external: true

Docker コンテナは Node 公式のを使いました。
Node.js Web アプリケーションを Docker 化する | Node.js を参考にしています。

FROM node:13

# application dir
WORKDIR /usr/src/app

RUN npm install
RUN npm install -g forever

EXPOSE 8080
CMD [ "forever", "server.js" ]

forever を使ってデーモン化したかったので、Dockerfile の中でインストール。

そしてサーバ本体。ドキュメントルート配下にファイルがある場合はそのまま出力、なかったら 404 を返すという簡単なコードです。
ソースコードは フレームワークなしの Node.js サーバ – ウェブ開発を学ぶ | MDN を参考にしています。

'use strict';

const http  = require('http');
const fs = require('fs');

http.createServer((request, response) => {
  console.log('request ', request.url);

  if (request.url.match(/boo/)) {
    dummy();  // throw error
  }

  let filePath = './html' + request.url;
  if (filePath.match(/\/$/)) {
    filePath += 'index.html';
  }

  fs.readFile(filePath, (error, content) => {
    if (error) {
      if (error.code == 'ENOENT') {
        console.log(404);
        fs.readFile('./404.html', function(error, content) {
          response.writeHead(404);
          response.end(content);
        });
      } else {
        console.log(500, error.code);
        response.writeHead(500);
        response.end('Sorry, check with the site admin for error: ' + error.code + ' ..\n');
        response.end();
      }
    } else {
      console.log(200);
      response.writeHead(200);
      response.end(content);
    }
  });
}).listen(8080);
console.log('Server running at http://127.0.0.1:8080/');

index.html , about.html の2ファイルを設置しているので、ちゃんとルーティングできていることが分かります。
「Node.js で簡単にサーバを建てる」的な記事はいろいろヒットするのですが、ルーティングまでちゃんと書いている記事が少なくて……

注目したいのが、URL に「boo」という文字列が入っていた場合に強制的にエラーを発動させている箇所。
forever を使っているおかげで、エラーが起きても自動でサーバが再起動します。便利。
実際に https://discord.riina-k.dev/boo を踏んでみると、サーバ側でエラーが起きるので 502 が返ってきます。

ちゃんとした Web サービスを作る場合は express モジュールとか入れて本格的に構築するのですが、今回は bot 作りのオマケみたいなものなので、これで完成としましょう。


で、肝心の Discord の bot についてですが、これはまた別のエントリとしましょう。
ではまた!

06-20 追記:
Discord の bot についての記事を投稿しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です