Docker マルチステージビルド・チャレンジ

DockerBeginner
オンラインで実践に進む

はじめに

Docker のマルチステージビルド(Multi-stage Build)は、単一の Dockerfile 内で複数のステージ(段階)を定義し、最終的な Docker イメージを最適化できる機能です。このチャレンジでは、マルチステージビルドを使用して、不要なファイルを含まない、軽量で効率的な Docker イメージを作成する手法を習得します。

マルチステージビルドを用いた Dockerfile の作成

このセクションでは、マルチステージビルドの仕組みを取り入れた Dockerfile を作成します。

課題

  • 2 つのステージを持つ新しい Dockerfile を作成してください。第 1 ステージでは、必要な依存関係のインストールとビルドスクリプトの実行を行い、アプリケーションをビルドします。第 2 ステージでは、第 1 ステージからコンパイル済みのコードのみをコピーし、本番環境用の依存関係のみを保持した最終的なイメージを作成し、必要なポートを公開します。

以下は、実施する手順の例です:

  1. myapp という名前の新しいディレクトリを作成し、その中に移動します。

    mkdir myapp
    cd myapp
    
  2. https://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-example
    
  3. myapp ディレクトリ内に、以下の内容で 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 のソースコードをクローンすること。
  • 指定された内容の Dockerfilemyapp ディレクトリ内に作成すること。

Docker イメージのビルド

このステップでは、作成した Dockerfile を使用してイメージを構築します。

課題

  • myapp という名前の新しいイメージをビルドしてください。

以下は、達成すべき操作の例です:

  1. docker build コマンドを使用して、myapp という名前の新しいイメージをビルドします。

    docker build -t myapp .
    
  2. docker images コマンドを使用して、イメージが正常に作成されたことを確認します。

要件

このチャレンジを完了するには、以下を満たす必要があります:

  • /home/labex/project/myapp ディレクトリで docker build コマンドを実行すること。
  • イメージ名を myapp に設定すること。

Docker コンテナの実行

このステップでは、作成した Docker イメージを使用してコンテナを起動します。

課題

  • myapp イメージを使用してコンテナを実行してください。コンテナ内のポート 3000 をホストのポート 3030 にマッピングし、ブラウザからアプリケーションにアクセスできるようにします。

以下は、達成すべき操作の例です:

  1. my-app という名前の新しい Docker コンテナを起動します。

    docker run --name my-app -p 3030:3000 myapp
    
  2. Web ブラウザを開き、http://localhost:3030 にアクセスして、実行中のアプリケーションを確認します。

要件

このチャレンジを完了するには、以下を満たす必要があります:

  • コンテナ名を my-app として実行すること。
  • コンテナ内部のポート 3000 をホストのポート 3030 にマッピングすること。

まとめ

このチャレンジでは、Docker のマルチステージビルドを使用して、より軽量で効率的な Docker イメージを作成する方法を学びました。Dockerfile 内で複数のステージを使い分けることで、ビルド環境と実行環境を分離し、最終的なイメージサイズを大幅に削減できます。この知識を活用して、今後は自身のプロジェクトでも最適化された Docker イメージを構築できるようになります。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習