パンジェンシーの「汗だく開発日誌」

システム開発の備忘録です。

【Docker】Node.jsのコンテナを作成する

パンジェンシ氏「東の森でシステムエンジニアをしております、パンジェンシーと申します。 最近は、とにかく情報が多すぎて覚えていられないので、細かい内容もできるだけメモに残しておこうと思います。 」

Node.jsのインストール再び!

f:id:x-fieldatts:20200731103219p:plain

5年前くらいのエントリーで、「Node.jsをインストールしてみよう!」的なことをやりました。

その後状況がだいぶ変わっていると思いますので、やり方を調べてよさげなものをメモしておきます。

1. Node.jsをインストール?

現在の私の環境は、Windows 10 HomeにWSL2を使ってUbuntu 20.04 LTSを入れているような状態で、このUbuntuにNode.jsをインストールしてみたいと思います。

デーヴァ「Dockerを使えばいいのデヴァ?」

パンジェン氏「!?デーヴァさん!?」

デーヴァ「せっかくDockerを入れたんだから、Node.jsがインストールされたDockerイメージを使えばすぐなのデヴァ?」

パンジェン氏「た…たしかに…。そのためのDockerですよね…。(何でデーヴァさんがここに…?)」

2. Node.jsのDockerコンテナを作成

というわけで、Node.jsを直接ホストOSにインストールするのはやめて、Node.jsのDockerコンテナを作ってみましょう!

ディレクトリとファイルを作成

まずは、必要なディレクトリとファイルを作成します。

// どこか適当なディレクトリで以下のように
$ mkdir node-app-sample && cd node-app-sample
$ touch docker-compose.yml
$ mkdir src
$ touch src/server.js

// こんな感じの構成になります。
任意のディレクトリ
└── node-app-sample
    ├── docker-compose.yml
    └── src
        └── server.js

このserver.jsというファイルに、Node.js公式ページのサンプルを貼り付けます。

const http = require("http");

const hostname = "127.0.0.1";
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello World");
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

3行目のhostname127.0.0.1(ローカルホスト)となっていますが、この設定ではホストマシンからコンテナにアクセスできません。

調査の結果、0.0.0.0と設定しておけばアクセスできるようです。この'0.0.0.0'と設定すると「ホスト内の全てのIPアドレスで待受る」という意味になります。

const http = require("http");

- const hostname = "127.0.0.1";
+ const hostname = "0.0.0.0";
const port = 3000;

Docker Composeファイルは以下のようにしてみます。

version: "3"
services:
  app:
    image: node:lts # イメージを取得
    container_name: node # コンテナの名前を設定
    volumes: # ディレクトリをリンク
      - ./src:/app/src # [ホスト側]:[コンテナ内]
    ports: # 公開用ポート設定
      - 3001:3000 # [ホスト側]:[コンテナ内]
    command: node server.js # コンテナ起動時に実行するコマンド
    working_dir: /app/src # コマンドを実行するディレクトリ

コンテナの作成

では、コンテナをビルドしてみましょう。docker-compose.ymlの置いてあるディレクトリで以下を実行します。

$ docker-compose build

ビルドが終わったら、コンテナを起動してみましょう。

$ docker-compose up -d

コンテナの内部でserver.jsのプログラムが起動しているかログを確認してみましょう。

$ docker-compose logs

以下のようなログが表示されていればOKです。エラーが起きている場合はコードを見直しましょう。

Attaching to node
node   | Server running at http://0.0.0.0:3000/

ブラウザからhttp://localhost:3001にアクセスしてみましょう。

f:id:x-fieldatts:20200728094640p:plain

無事、「Hello World」が表示されたでしょうか?

「コンテナ内では3000ポートで起動していますが、docker-compose.ymlで公開用ポートを3001に設定したので、3001でアクセスしなければいけないことに注意しましょう。」

まとめ

今回はNode.jsのコンテナを作成してサンプルプログラムを実行してみました。

これを応用して、色々なフレームワークのコンテナを作成して動かしてみようと思います。

「今回の報告は以上です!ではまた!」