コンテナ化とは、アプリケーション、その依存関係、ライブラリを一緒に束ねて、どんなインフラストラクチャでもプラグアンドプレイのように使用できるようにすることです。各バンドルはコンテナと呼ばれます。
Node.jsサービスをコンテナ化する理由
前のセクションで説明したように、Node.jsサービスをコンテナ化することは、アプリ、依存関係、ライブラリ、さらには設定を1つのコンテナに束ねることを意味します。コンテナ化には次のような利点があります:
- ポータブル.すべてのアプリ要件をコンテナに束ねたため、同じイメージを開発、ステージング、本番環境にインストールできます。
- 高速で軽量.コンテナは、アプリの要件のみを実行しているため、仮想マシン(VM)やベアメタルよりもはるかに高速である傾向があります。一方、従来のVMやベアメタルは、全体のマシンを起動し、すべてのアプリを実行していました。
- スケーラブル. 上記の2つの利点により、コンテナは素早く、効率的で、展開も簡単になるため、スケーラビリティが非常に容易になります。
この記事では、 Node.jsアプリをコンテナ化する
前提条件
ツールとソフトウェア
Docker(Docker EngineとDocker CLI)
コンテナを管理するためにはDockerをインストールする必要があります。Docker Engineはランタイムを処理し、CLIはコマンドラインを介して対話できます。
Node.jsとnpm/yarnがインストールされている(初期開発/テスト用)
ライブラリの依存関係をインストールし、サービスを実行するためにNode.jsとnpmが必要です。
複数のコンテナを管理するためのKubernetesまたはDocker Compose(オプション)
複数のコンテナを管理するためには、KubernetesまたはDocker Composeが必要です。
基本事項
Node.jsアプリケーション構造:
- 読者はすでにプロジェクトのメインファイル(
app.js
またはindex.js
)の役割と、package.json
やyarn.lock
のような他のファイルの役割を理解していることが期待されています。 - この記事では、コントローラー、ミドルウェア、 ルートなど、プロジェクトの他の側面については掘り下げません。
基本的なDockerコマンドとDockerfile構文
Dockerコマンド:
docker ps -> Lists all the containers running on the system
docker pull -> Pulls any image from the docker hub or official registry of Docker
docker build -> Creates an image from the docker file
docker run -> Starts a container from an exiting image
docker stop -> Stops a container if it has crashed or if you want to switch the container
主要なDockerfile命令:
FROM -> Every DockerFile
WORKDIR -> Set the working directory inside the container
COPY (or ADD) -> Transfers the application's files to the image
RUN -> Executes commands during build time
CMD -> Sets the default command to be run when the container is started from the image
EXPOSE -> Specifies the port the container listens on
ENV -> Sets environment variables used during build and runtime
取り上げた両方の表とNode.jsの構造は、コンテナ化を開始し、Node.jsサービスをデプロイするのに十分です。
Node.jsサービスのセットアップ
Node.js環境の設定は簡単なプロセスです。 確実にあなたのマシンにNode.jsがインストールされていることを確認してください。もし疑問がある場合は、付録(1)を参照してください。 インストールが完了したら、ターミナルを開き、インストールを確認するために次のコマンドを入力します。
node -v
npm -v
プロジェクトディレクトリを作成し、あなたのプロジェクトを次のように初期化します:
npm init -y
expressモジュールをインストールします
npm install express
サーバーファイルを作成します。これをserver.mjsと呼びましょう。ここでは、ルートとそのルートに対応するロジックを追加できます。この記事はコンテナ化についてのものであるため、エンドポイントロジックは非常にシンプルに保ちます。以下のようなものです:
import express from "express";
const app = express();
const port = 8080;
app.get('/', (req, res) => {
res.send('Welcome to my demo service!');
});
app.listen(port, () => {
console.log(`Demo Service is running on port ${port}`);
});
今 あなたの サービスは開始準備が整いました。プロジェクトディレクトリに移動し、ターミナルで次のコマンドを実行します:
node server.mjs
サービスは起動しており、稼働中です。もし 私たちが訪れると http://localhost:3000、次のように表示されます:
“私のサーバーへようこそ”
Dockerfileの作成
Dockerfileとは何か 復習しましょう。Dockerfileは、 Dockerイメージを構築するための指示が 記載されています。Dockerfileをルートディレクトリに作成しましょう。このステップでは、Dockerfileの指示で説明したように、次のことを行う必要があります:
FROM node:18-alpine => Indicate the base image to use. Here we're using the official Nodejs 14 image.
WORKDIR /usr/src/app => Sets the working directory in the container.
COPY package*.json ./ => Duplicate the package.json and package-lock.json files to the working directory.
RUN npm install => Installs the app package dependencies.
COPY . . => Copies the remaining of the app to the working directory.
EXPOSE 8080 => Exposes the port our app is listening on.
CMD ["node", "app.js"] => Defines the command to start your Node.js application.
Dockerイメージのビルドと実行
端末のルートから、あなたのプロジェクトに移動して、次のコマンドを実行します:
docker build -t image-name .
ここでimage-name
はDockerイメージの名前です。末尾の.
はコンテキストを現在のディレクトリに設定します。
イメージがビルドされたら、次のコンテナを作成し、Node.jsアプリを実行します:コマンドを使用します:
docker run --name container-name -p 8080:8080 image-name
上記が成功したら、サービスが実行されているかどうかを確認するために、docker ps
を実行し、以前と同じlocalhostのURLに移動します。
イメージをレジストリにプッシュする
現在、あなたのイメージが準備できたので、次はレジストリにプッシュする時です。本記事の範囲では、Docker Hubにのみプッシュすることにします。Docker Hubは、Dockerコンテナイメージを保存、共有、管理するためのクラウドベースのサービスです。
以下でアカウントを作成してください:https://hub.docker.com/そして、アカウントでログインしてください。
docker login
ログイン後、ローカルで作成したイメージを以下のように追加できます:
docker tag image-name:tag dockerhub-username/repository-name:tag
ここで:
tag
はlatest
またはバージョン番号です。repository-name
は目的のリポジトリ名です。
次に、以下のコマンドでイメージをプッシュします:
docker push dockerhub-username/repository-name:tag
結論
見てわかる通り、コンテナ化は依存関係を分離することで複雑なワークフローやサービスを迅速かつ移植可能かつスケーラブルにします。実装されると、チーム全体がその恩恵を受けることができます。高度な機能(例:マルチステージビルドやコンテナネットワーキングなど)を探求することをお勧めします。また、オーケストレーションツール(例:Kubernetes)の学習やCI/CDパイプラインの統合なども検討して、開発ワークフローを最適化してください。
付録
Source:
https://dzone.com/articles/containerization-of-a-nodejs-service