はじめに
Docker のマルチステージビルド(Multi-stage Build)は、単一の Dockerfile 内で複数のステージ(段階)を定義し、最終的な Docker イメージを最適化できる機能です。このチャレンジでは、マルチステージビルドを使用して、不要なファイルを含まない、軽量で効率的な Docker イメージを作成する手法を習得します。
マルチステージビルドを用いた Dockerfile の作成
このセクションでは、マルチステージビルドの仕組みを取り入れた Dockerfile を作成します。
課題
- 2 つのステージを持つ新しい
Dockerfileを作成してください。第 1 ステージでは、必要な依存関係のインストールとビルドスクリプトの実行を行い、アプリケーションをビルドします。第 2 ステージでは、第 1 ステージからコンパイル済みのコードのみをコピーし、本番環境用の依存関係のみを保持した最終的なイメージを作成し、必要なポートを公開します。
例
以下は、実施する手順の例です:
myappという名前の新しいディレクトリを作成し、その中に移動します。mkdir myapp cd myapphttps://github.com/labex-labs/nodejs-example.gitから NodeJS のソースコードをダウンロードします。git clone https://github.com/labex-labs/nodejs-example.gitダウンロードしたコードを
myappディレクトリの直下に移動します。mv nodejs-example/* . rm -rf nodejs-examplemyappディレクトリ内に、以下の内容でDockerfileという名前の新しいファイルを作成します。## Stage 1: Build the application FROM node:14-alpine AS base WORKDIR /app COPY . ./ RUN npm install ## Stage 2: Create the final image FROM node:14-alpine WORKDIR /app COPY --from=base /app/ . EXPOSE 3000 CMD [ "npm", "start" ]
要件
このチャレンジを完了するには、以下を満たす必要があります:
/home/labex/projectディレクトリ内にmyappという名前のディレクトリを作成すること。myappディレクトリに NodeJS のソースコードをクローンすること。- 指定された内容の
Dockerfileをmyappディレクトリ内に作成すること。
Docker イメージのビルド
このステップでは、作成した Dockerfile を使用してイメージを構築します。
課題
myappという名前の新しいイメージをビルドしてください。
例
以下は、達成すべき操作の例です:
docker buildコマンドを使用して、myappという名前の新しいイメージをビルドします。docker build -t myapp .docker imagesコマンドを使用して、イメージが正常に作成されたことを確認します。
要件
このチャレンジを完了するには、以下を満たす必要があります:
/home/labex/project/myappディレクトリでdocker buildコマンドを実行すること。- イメージ名を
myappに設定すること。
Docker コンテナの実行
このステップでは、作成した Docker イメージを使用してコンテナを起動します。
課題
myappイメージを使用してコンテナを実行してください。コンテナ内のポート3000をホストのポート3030にマッピングし、ブラウザからアプリケーションにアクセスできるようにします。
例
以下は、達成すべき操作の例です:
my-appという名前の新しい Docker コンテナを起動します。docker run --name my-app -p 3030:3000 myappWeb ブラウザを開き、
http://localhost:3030にアクセスして、実行中のアプリケーションを確認します。
要件
このチャレンジを完了するには、以下を満たす必要があります:
- コンテナ名を
my-appとして実行すること。 - コンテナ内部のポート
3000をホストのポート3030にマッピングすること。
まとめ
このチャレンジでは、Docker のマルチステージビルドを使用して、より軽量で効率的な Docker イメージを作成する方法を学びました。Dockerfile 内で複数のステージを使い分けることで、ビルド環境と実行環境を分離し、最終的なイメージサイズを大幅に削減できます。この知識を活用して、今後は自身のプロジェクトでも最適化された Docker イメージを構築できるようになります。



