【Docker】Node.jsのコンテナを作成する
パンジェンシ氏「東の森でシステムエンジニアをしております、パンジェンシーと申します。
最近は、とにかく情報が多すぎて覚えていられないので、細かい内容もできるだけメモに残しておこうと思います。
」
Node.jsのインストール再び!
5年前くらいのエントリーで、「Node.jsをインストールしてみよう!」的なことをやりました。
その後状況がだいぶ変わっていると思いますので、やり方を調べてよさげなものをメモしておきます。
1. Node.jsをインストール?
現在の私の環境は、Windows 10 HomeにWSL2を使ってUbuntu 20.04 LTSを入れているような状態で、このUbuntuにNode.jsをインストールしてみたいと思います。
デーヴァ「せっかく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行目のhostname
が127.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にアクセスしてみましょう。
無事、「Hello World」が表示されたでしょうか?
「コンテナ内では3000ポートで起動していますが、docker-compose.yml
で公開用ポートを3001に設定したので、3001でアクセスしなければいけないことに注意しましょう。」
まとめ
今回はNode.jsのコンテナを作成してサンプルプログラムを実行してみました。
これを応用して、色々なフレームワークのコンテナを作成して動かしてみようと思います。