🙆

【Docker入門#2】 Hello Worldアプリケーション作成

に公開

🧩 関連記事

【Docker入門#1】 Windowsでの環境構築

はじめに

Hello Worldを表示するWebアプリケーションのイメージ作成からコンテナの実行までを通して、Dockerの使い方を学びます。
今回はアプリケーションの言語にNode.js、フレームワークにExpressを使用します。
以下の流れでコンテナを作成・実行していきます。

docker_container_creation_flow.png

アプリケーションのディレクトリ構成

今回作成するアプリケーションのディレクトリ構成は以下の通りです。

~/myimage
|-- .dockerignore
|-- Dockerfile
|-- node_modules/
|-- package-lock.json
|-- package.json
`-- server.js

最新のNode.jsをインストール

Node.jsでアプリケーションを作成する際には、常に最新のバージョンを使用したいところです。
ここでは、Node.jsのバージョン管理ツール「n」を使って最新版をインストールします。

パッケージの更新

sudo apt update
sudo apt upgrade

Node.js と npm のインストール

sudo apt install nodejs npm

nパッケージのインストール

sudo npm -g install n

最新のNode.jsとnpmをインストール

sudo n latest

既存のNode.jsとnpmの削除(不要な競合を防ぐため)

sudo apt purge nodejs npm

シェルを再読み込みして反映

exec $SHELL -l

バージョン確認

node -v
# v16.4.1

npm -v
# 7.18.1

Node.jsアプリケーションを作成

作業用ディレクトリを作成し、Node.jsのプロジェクトを初期化します。

mkdir ~/myimage
cd ~/myimage

package.json を作成し、Expressをインストールします。

npm init -y && npm i express

次に、server.js にHello Worldを表示する簡単なWebアプリケーションを記述します。

server.js
const express = require('express');

const PORT = 3000;
const HOST = '0.0.0.0';

const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT, HOST);

Dockerfileを作成する

Dockerfileは、Dockerイメージの構成を定義するためのファイルです。
ベースイメージや依存パッケージのインストール、アプリケーションの実行方法などを記述します。

docker_image_structure_diagram.png

以下のDockerfileを作成します。

Dockerfile
FROM node:16

WORKDIR /var/www

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

各命令の解説

  • FROM node:16
    ベースイメージとしてNode.js 16を使用します(Node.jsとnpmは含まれています)。

  • WORKDIR /var/www
    作業ディレクトリを設定します。存在しない場合は自動的に作成されます。

  • *COPY package.json ./**
    依存関係定義ファイルをコピーします。

  • RUN npm install
    依存パッケージをインストールします。

  • COPY . .
    アプリケーションのソースコードを全てコピーします。

  • EXPOSE 3000
    アプリケーションがリッスンするポートを指定します(実際の公開には -p オプションが必要です)。

  • CMD ["node", "server.js"]
    アプリケーションを起動するコマンドです。

.dockerignoreファイルを作成

イメージに含めたくないファイル・ディレクトリは .dockerignore に定義します。
ここでは、node_modules を除外して、ホスト側の依存パッケージがイメージに上書きされるのを防ぎます。

.dockerignore
node_modules

Dockerイメージを構築する

Dockerfileがあるディレクトリで次のコマンドを実行し、イメージを構築します。

docker image build -t myimage .

作成されたイメージを確認します。

docker image ls

コンテナを作成・実行する

docker container run -p 8000:3000 -d --rm --name mycontainer myimage

オプションの説明

  • -p 8000:3000:ホストの8000番ポートをコンテナの3000番ポートにマッピング
  • -d:バックグラウンドで実行
  • --rm:終了時に自動削除
  • --name:コンテナ名を指定

コンテナが起動しているか確認します。

docker container ls

アプリケーションのテスト

curlで動作確認をします。

curl localhost:8000
# Hello World

正常にレスポンスが返ってくることを確認できました。

図解で振り返り

  • Dockerfileを作成
  • イメージをビルド
  • コンテナを起動

docker_build_run_relationship.png

  • ポートフォワーディングにより、ホストの8000番ポートからアクセス可能に

docker_port_forwarding_diagram.png

  • curlで確認

docker_http_communication_flow.png

ポートの自動割り当てについて(補足)

-p オプションでホスト側のポートを省略すると、自動的に空いているポートが割り当てられます。

docker container run -p 3000 -d --rm --name mycontainer myimage

確認:

docker container ls
# PORTS: 0.0.0.0:60658->3000/tcp

後片付け

使用したコンテナとイメージを削除しておきましょう。

docker container stop mycontainer \
  && docker image rm myimage

以上で、DockerによるHello Worldアプリケーションの作成が完了です。
お疲れさまでした!

GitHubで編集を提案

Discussion