基礎からマルチステージビルドまで

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

はじめに

Docker は、アプリケーションの開発、配布、実行の方法に革命をもたらしました。Docker の機能の中核となるのは、特定のニーズに合わせてカスタマイズされたイメージを作成できる能力です。このチャレンジでは、docker build コマンドのパワーと柔軟性を探求し、さまざまなシナリオに対応する Docker イメージの作成方法を学びます。

シンプルなアプリケーションから、依存関係や環境変数を含むより複雑なセットアップまで、Docker イメージ作成の基本概念をハンズオン形式で体験します。このチャレンジを終える頃には、効率的で効果的な Docker イメージを構築するための強固な基礎が身に付いているはずです。これは、現代のソフトウェア開発およびデプロイのワークフローにおいて極めて重要なスキルです。

それでは、Docker イメージ構築の世界への旅を始めましょう!

基本的な Docker ビルド

まずは基本から始めましょう。このステップでは、「Hello, World!」というメッセージを出力するシンプルな Docker イメージを作成します。これにより、Dockerfile の基本構造と docker build コマンドに慣れていただきます。

タスク

  1. /home/labex/project 配下の hello-world ディレクトリに移動します。
  2. このディレクトリにある Dockerfile を開き、必要な命令を追加します。
  3. docker build コマンドを使用して、hello-world という名前の Docker イメージをビルドします。

要件

  • すべての操作を /home/labex/project/hello-world ディレクトリで行うこと。
  • Dockerfile では Alpine Linux のベースイメージを使用すること。
  • Docker イメージを実行したときに "Hello, World!" と表示されるようにすること。

このステップを完了すると、次のコマンドを実行して出力を確認できるようになります。

$ docker run hello-world
Hello, World!

最初の Docker イメージの作成、お疲れ様でした!このシンプルな例は、Docker イメージ作成の基本原則を示しています。次のステップでは、この知識を応用して、依存関係を持つより複雑なイメージを作成します。

✨ 解答を確認して練習

依存関係を含む Docker イメージの構築

基本に慣れたところで、より現実的なシナリオに取り組んでみましょう。このステップでは、Flask ウェブフレームワークを使用する Python アプリケーションの Docker イメージを作成します。これにより、Docker イメージ内での依存関係(Dependencies)の管理方法について学びます。

タスク

  1. /home/labex/project 配下の flask-app ディレクトリに移動します。
  2. このディレクトリにある Dockerfile を開き、依存関係をインストールするための必要な命令を追加します。
  3. requirements.txt ファイルを確認して、依存関係の内容を把握します。
  4. docker build コマンドを使用して、flask-app という名前の Docker イメージをビルドします。

要件

  • すべての操作を /home/labex/project/flask-app ディレクトリで行うこと。
  • Dockerfile では python:3.7-alpine ベースイメージを使用すること。
  • requirements.txt にリストされている依存関係がイメージにインストールされていることを確認すること。
  • Dockerfile は requirements.txt ファイルをコピーし、依存関係をインストールするように記述すること。

このステップを完了すると、Docker イメージを一覧表示したときに flask-app イメージが表示されるはずです。

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
flask-app    latest    abcdef123456   2 minutes ago   55.8MB

素晴らしい!外部の依存関係を含む Docker イメージを作成できました。これは実際のアプリケーション開発で非常によくあるシナリオです。次のステップでは、Docker イメージをより柔軟で設定可能にするために、環境変数を使用する方法を学びます。

✨ 解答を確認して練習

環境変数を使用した Docker イメージの構築

設定管理は、コンテナ化されたアプリケーションにおいて極めて重要な要素です。このステップでは、環境変数を使用して Flask アプリケーションのポート番号を設定する Docker イメージを作成します。これにより、Docker イメージを動的にし、異なる環境に適応させる方法を学びます。

タスク

  1. /home/labex/project 配下の flask-app-env ディレクトリに移動します。
  2. このディレクトリにある Dockerfile を開き、環境変数を設定する命令を追加します。
  3. app.py ファイルを修正して、ポート番号に環境変数を使用するようにします。
  4. docker build コマンドを使用して、flask-app-env という名前の Docker イメージをビルドします。

要件

  • すべての操作を /home/labex/project/flask-app-env ディレクトリで行うこと。
  • Dockerfile では python:3.7-alpine ベースイメージを使用すること。
  • Dockerfile 内で、デフォルト値が 5000 の環境変数 PORT を設定すること。
  • Flask アプリケーションが PORT 環境変数を使用してリスニングポートを設定するように修正すること。
  • requirements.txt にリストされている必要な Python パッケージがすべてインストールされていることを確認すること。

このステップを完了してコンテナを実行すると、アプリケーションにアクセスできるようになります。

$ docker run -d -p 5000:5000 flask-app-env
$ curl http://127.0.0.1:5000
Hello, World!

よくできました!環境変数を使用して、異なる環境に適応できる柔軟な Docker イメージを作成できました。これは、再利用可能で設定可能なコンテナイメージを作成するための強力な手法です。最後のステップでは、Docker の高度な機能であるマルチステージビルド(Multi-stage builds)について学びます。

✨ 解答を確認して練習

マルチステージによる Docker イメージの構築

最後のチャレンジとして、マルチステージビルドに挑戦します。この高度なテクニックを使用すると、ビルドプロセスで複数のステージを使用することで、より効率的(軽量)な Docker イメージを作成できます。Go アプリケーションの Docker イメージを作成しますが、1 つのステージでコードをコンパイルし、別のステージで本番環境用のスリムなイメージを作成します。

タスク

  1. /home/labex/project 配下の go-app ディレクトリに移動します。
  2. このディレクトリにある Dockerfile を開き、マルチステージビルドのための命令を追加します。
  3. main.go ファイルを確認して、シンプルな Go アプリケーションの内容を把握します。
  4. docker build コマンドを使用して、go-app という名前の Docker イメージをビルドします。

要件

  • すべての操作を /home/labex/project/go-app ディレクトリで行うこと。
  • ビルドステージのベースイメージには golang:1.14-alpine を、最終ステージのベースイメージには alpine を使用すること。
  • Go アプリケーションは実行時に "Hello, World!" と出力すること。
  • Go アプリケーションは go build コマンドを使用してコンパイルすること。
  • 最終的な Docker イメージには、Go の開発環境ではなく、コンパイルされたバイナリのみが含まれるようにすること。

このステップを完了すると、次のコマンドを実行して出力を確認できるようになります。

$ docker run go-app
Hello, World!
✨ 解答を確認して練習

まとめ

Docker イメージ構築の包括的なチャレンジを完了、おめでとうございます!基本的な Docker イメージの作成から、マルチステージビルドのような高度なテクニックの実装までを体験しました。この過程で、以下の方法を学びました:

  1. 基本的な Dockerfile を使用したシンプルな Docker イメージの作成
  2. Docker イメージ内での依存関係の管理
  3. 環境変数を使用したイメージの柔軟性の向上
  4. 効率的で本番環境に適したイメージのためのマルチステージビルドの実装

これらのスキルは Docker を効果的に活用するための基盤となり、開発やテストから本番環境へのデプロイまで、さまざまなシナリオで役立ちます。Docker CLI と Dockerfile の構文に関する実践的な経験を積んだことは、コンテナ化されたアプリケーションを扱うすべての人にとって非常に価値のある資産です。

Docker の学習を続けるにあたって、これらの基本操作がより複雑な Docker ワークフローの構成要素であることを忘れないでください。これらのスキルを定期的に練習することで、コンテナイメージの作成と管理に習熟し、最終的にはより効率的で合理化された開発・デプロイプロセスを実現できるようになります。

引き続き Docker の機能を探索し、さまざまなベースイメージ、ビルド戦略、最適化手法を試してみてください。コンテナ化の世界は広大で可能性に満ちています。あなたは今、自信を持ってその世界を進むための準備が整っています!