DockerでNode.jsアプリケーションをデプロイする方法

0 株式
0
0
0
0

導入

Node.js は、近年サーバー側アプリケーションの構築に人気が高まっている JavaScript ランタイムです。.

このチュートリアルでは、Docker、Docker Hub、Docker Compose を介して Node.js アプリケーションをクラウド サーバーにデプロイする方法を説明します。.

前提条件
  • このチュートリアルでは、ローカルシステムにDockerがインストールされていることを前提としています。まだインストールされていない場合は、公式ドキュメントでインストール方法をご確認ください。.
  • Linuxディストリビューション(Ubuntu 24.04が推奨)を実行するクラウドサーバーも必要です。他のディストリビューションをご利用の場合は、サーバーにDockerをインストールする際に特別な手順に従う必要がある場合があります。.
  • 一部の手順では、アプリケーションの Docker イメージをアップロードするために Docker Hub アカウント (無料) も必要です。.
  • これまで Docker の使用経験がなくても大丈夫です。このチュートリアルは非常に基本的な内容で、私たちが行っていることの背後にある中核となる概念を説明しています。.
  • デプロイできる Node.js アプリケーションが必要です。.
Dockerについて

Docker を使い始めたばかりの場合は、同じ理解を共有するために確認する価値のある用語がいくつかあります。.

  • イメージ: Docker では、イメージはファイル システムの「スナップショット」またはテンプレートであり、アプリケーションの実行に必要なものがすべて含まれています。.
  • コンテナ:アプリケーションの実際の実行インスタンスです。テンプレート(イメージ)を取得し、起動可能で状態を持つものに変換することで作成されます。.
  • レイヤーはDockerイメージを構成する要素です。各レイヤーは別のレイヤーの上に構築されるため、レイヤーキャッシュと呼ばれる機能を提供できます。つまり、イメージ内の1つのレイヤーが変更された場合でも、イメージ内のすべてのレイヤーを再ビルドまたはリロードする必要はありません。.
  • レジストリとは、イメージをアップロード(プッシュ)して、世界中、またはアクセス権限を持つユーザーに公開する場所です。このチュートリアルではDocker Hubを使用しますが、GCP、AWS、Azure、GitHubなどが提供する代替手段もあります。.

ステップ1 – Dockerfileを作成する

Node.js プロジェクトのルート ディレクトリに、次の内容を含む Dockerfile というファイルを作成します。

FROM node:20.17
ENV NODE_ENV=production
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
EXPOSE 8080
CMD [ "node", "src/index.js" ]

Dockerfileは、Dockerがイメージをビルドするための指示を記述する場所です。各指示は、イメージファイルシステムに変更を加えるレイヤーの作成を表します。.

今回は、テンプレート(ベースイメージと呼ばれることもあります)からイメージを構築します。今回の場合はnode:20.17です。これはDocker社が提供する公式イメージで、詳細はこちらで確認できます。.

次のステップでは、NODE_ENV環境変数をproductionに設定します。主な効果は、npm install実行時に開発パッケージのインストールを回避することですが、依存するモジュールの最適化が向上する場合もあります。.

WORKDIR コマンドを使用して、現在のディレクトリを /app に移動します。このディレクトリは、後続の命令が実行されるディレクトリになります。.

パッケージ行 COPY*.json 。package.json ファイルと package-lock.json ファイルを Docker イメージファイルシステムの /app フォルダにコピーします。末尾のドットは現在のディレクトリを示すために必要です。.

ここで、 RUN ディレクティブを使用して、npm ci コマンド (ci はクリーン インストールの略で、自動化された環境での使用を目的として設計されています) で本番環境の依存関係をインストールします。.

ここで注目すべき点は、これまではプロジェクトディレクトリ全体ではなく、package*.jsonファイルのみをビルドにコピーしていたことです。これによりDockerレイヤーキャッシュを活用できるようになり、依存パッケージに変更がない場合、レイヤーは再構築せずに使用できます。.

次の行 (COPY . .) は、イメージ内の残りのファイルをコピーします。.

オプションとして、コンテナから特定のネットワークポートを公開し、Webアプリケーションからアクセスできるように指定できます。EXPOSEディレクティブは実際にポートを公開するわけではないことに注意してください。ドキュメントに記載されているように、EXPOSEディレクティブは「イメージをビルドする人とコンテナを実行する人の間で、公開する予定のポートに関する一種のドキュメントとして機能します」。 .

最後のディレクティブは、コンテナの起動時にDockerがアプリケーションを実行するために使用するコマンドを指定します。この場合、アプリケーションのエントリポイントはindex.jsファイルであると想定しています。.

Dockerfileと一緒に.dockerignoreというファイルも作成しておくと良いでしょう。こうすることで、COPY. . を実行した際に、コンピューター上の不要なファイルがイメージにコピーされなくなります。

.git
Dockerfile
node_modules

この場合、git. や node_modules などのディレクトリの開発バージョンを、ビルドするテンプレートで使用できないようにします。.

ステップ2 – イメージを作成する

Dockerfile が作成されたので、それを使用してイメージを構築するように Docker に指示できます。.

これを行うための基本的なコマンドは次のコマンドのようになり、メイン プロジェクト フォルダーで実行する必要があります。

docker build -t myproject .

「/bin/sh -c npm ci」というエラーで正常に完了しない場合は、Dockerfile 内の npm ci を npm install に置き換えて再試行してください。.

 

-t オプションはイメージ名(この場合は myproject)を指定します。行末で、Docker に現在のディレクトリ内の Dockerfile を検索するように指示する必要があります。.

注: ビルドを初めて実行するとき、Docker はベースイメージ (この場合は Node.js 20.17) のすべてのレイヤーをダウンロードする必要があるため、しばらく時間がかかります。.

このイメージをオンライン Docker Hub レジストリにアップロードする (サーバーからアクセスする) 予定なので、特定の命名規則を使用してイメージに名前を付ける必要があります。.

したがって、上記のコマンドは次のようになります。

docker build -t username/myproject:latest .

username はDocker Hubのユーザー名、last はイメージタグです。イメージには複数のタグが付けられることがあるため、次のようなワークフローになることがあります。

docker build -t myproject .
docker tag myproject username/myproject:latest
docker tag myproject username/myproject:20240905

これらのコマンドはイメージを作成し、最新のタグと 20240904 (このチュートリアルが最後に更新された日付) でタグ付けします。.

Docker Hubはデフォルトでは古いイメージを削除しないため、レジストリにプッシュしたすべてのイメージの履歴を保持できます。最新のタグが付いたイメージは常に最後にビルドされたイメージであり、古いイメージには日付のタグが付けられています。.

ステップ3 – 画像を押す

イメージが完成したら、レジストリにプッシュする必要があります。まず、以下のコマンドを実行して、DockerインスタンスがDocker Hubで認証されていることを確認します。

docker login

次に、docker push を実行して、すべてのタグが付いたイメージをアップロードします。.

docker push username/myproject

アプリケーションが小さい場合は、Node.js アプリケーションとその JavaScript 依存関係に関連するレイヤーをアップロードするだけでよいため、このコマンドはすぐに完了するはずです。.

新しいバージョンのイメージができたら、push コマンドを再度実行して、Docker Hub にアップロードされていることを確認する必要があります。.

ステップ4 – Ubuntu 24.04にDockerをインストールする

さあ、サーバーにDockerとDocker Composeをインストールしましょう。前提条件で述べたように、ここではUbuntu 24.04サーバーが既にセットアップされていることを前提としています。.

まず、Docker をインストールするには、次のコマンドでインストールできるいくつかのシステム依存関係が必要です。

sudo apt-get update
sudo apt-get install ca-certificates curl

次に、公式の Docker GPG キーを追加し、カスタム apt リポジトリを構成します。

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

最後に、apt ディレクトリを再度更新し、Docker Community Edition をインストールします。

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

上記のコマンドは、コンテナとそのライフサイクルの管理を大幅に簡素化するツールである Docker Compose もインストールします。.

最後の便利なステップは、現在の Ubuntu ユーザーを docker グループに追加して、そこから Docker コマンドを直接実行できるようにすることです。.

これは次のコマンドで簡単に実行できます。

sudo gpasswd -a myuser docker

次のコマンドを実行して、すべてがうまくいったことを確認します。

docker --version
docker ps
docker compose version

エラーや警告が表示されない場合は、問題ありません。.

ステップ5 – Docker Composeでコンテナを実行する

サーバー上に、次の内容を含む docker-compose.yml というファイルを作成します。

services:
myproject:
container_name: 'myproject'
image: 'username/myproject'
restart: unless-stopped

これは非常に基本的なDocker Composeファイルで、Docker Hubのユーザー名/イメージ「myproject」に基づいて、myprojectという名前の単一のコンテナを設定します。ラベルを指定しない場合は、最後に指定したラベルがデフォルトで使用されますが、必要に応じて特定のラベルを指定することもできます。

services:
myproject:
container_name: 'myproject'
image: 'username/myproject:20240904'
restart: unless-stopped

最後に、restart 属性は、手動で停止しない限り、障害発生時にコンテナが自動的に再起動されることを示します。.

ここでこの Compose コマンドを実行すると、Docker イメージが登録解除され、アプリケーションが実行されるはずです。

docker compose -f docker-compose.yml up

このコマンドはコンテナを作成し、実行します。コンテナの出力はDockerによってキャプチャされ、コンソールに表示されます。Ctrl + C(またはCommand + C)を押して、コンテナが停止するまで数秒お待ちください。.

すべてがうまくいけば、コンテナをゴーストとして実行する準備が整いました。ゴーストとは、停止するまでバックグラウンドで実行し続けるコンテナのことです。これは、コマンドに -d オプションを追加することで実現できます。

docker compose -f docker-compose.yml up -d

ボン、結び目!(本気です)

Composeファイルのリファレンスドキュメントをざっと読んでみてください。サーバーとコンテナ間のネットワークポートのマッピングといった便利な機能が見つかります。以下は、外部ポート80を内部ポート8080にマッピングする簡単な例です。

services:
myproject:
container_name: 'myproject'
image: 'username/myproject'
restart: unless-stopped
ports:
- '80:8080'

ステップ6 – 新しいバージョンをインストールする

アプリケーションに変更を加えてリリースする必要がある場合、自動ビルドを有効にしていない限り、Docker Hubに新しいイメージが表示されるまで手順2と3を繰り返す必要があります。.

次に、サーバー上で次のように新しいイメージを手動でプルする必要があります。

docker compose -f docker-compose.yml pull

新しいイメージでコンテナを再起動します。

docker compose -f docker-compose.yml up -d --force-recreate

結果

素晴らしいです!これで、Docker、Docker Hub、Docker Compose を使用して Ubuntu 24.04 に Node.js アプリケーションをデプロイするための基本的な手順は完了です。.

簡単な Dockerfile の書き方、イメージのビルド方法、プッシュ方法、サーバーへのデプロイ方法を説明しました。.

Docker にはこのチュートリアルで説明されている以上の機能があるため、概念と機能について詳しく知るには、Docker と Docker Compose のドキュメントを必ず参照してください。.

コメントを残す

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

あなたも気に入るかもしれない