はじめに
Docker マルチステージビルドは、Dockerfile 内で複数のステージを使用し、最終的なDockerイメージを作成できる機能です。このチャレンジでは、Docker マルチステージビルドを活用して、より軽量で効率的なDockerイメージを作成する方法を習得します。
マルチステージビルドを用いた Dockerfile の作成
このセクションでは、マルチステージビルドを利用した Dockerfile を作成します。
タスク
- 2つのステージを使用する新しい
Dockerfileを作成してください。最初のステージでは、必要な依存関係をインストールしてビルドスクリプトを実行し、アプリケーションをビルドします。2番目のステージでは、最初のステージからコンパイル済みのコードをコピーし、本番環境用の依存関係のみをインストールして、必要なポートを公開する最終イメージを作成します。
例
実行する手順の例を以下に示します。
myappという名前の新しいディレクトリを作成し、その中に移動します。mkdir myapp cd myappNodeJSのソースコードを
https://github.com/labex-labs/nodejs-example.gitからダウンロードします。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という名前のディレクトリを作成すること。- NodeJSのソースコードを
myappディレクトリにクローンすること。 - 指定された内容で
myappディレクトリ内にDockerfileを作成すること。
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イメージのサイズを削減できます。この知識を活かして、今後はマルチステージビルドを用いた独自のDockerイメージ構築を始めてみましょう。



