はじめに
Docker は、アプリケーションの開発、配布、実行の方法に革命をもたらしました。Docker の機能の中核となるのは、特定のニーズに合わせてカスタマイズされたイメージを作成できる能力です。このチャレンジでは、docker build コマンドのパワーと柔軟性を探求し、さまざまなシナリオに対応する Docker イメージの作成方法を学びます。
シンプルなアプリケーションから、依存関係や環境変数を含むより複雑なセットアップまで、Docker イメージ作成の基本概念をハンズオン形式で体験します。このチャレンジを終える頃には、効率的で効果的な Docker イメージを構築するための強固な基礎が身に付いているはずです。これは、現代のソフトウェア開発およびデプロイのワークフローにおいて極めて重要なスキルです。
それでは、Docker イメージ構築の世界への旅を始めましょう!
基本的な Docker ビルド
まずは基本から始めましょう。このステップでは、「Hello, World!」というメッセージを出力するシンプルな Docker イメージを作成します。これにより、Dockerfile の基本構造と docker build コマンドに慣れていただきます。
タスク
/home/labex/project配下のhello-worldディレクトリに移動します。- このディレクトリにある
Dockerfileを開き、必要な命令を追加します。 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)の管理方法について学びます。
タスク
/home/labex/project配下のflask-appディレクトリに移動します。- このディレクトリにある
Dockerfileを開き、依存関係をインストールするための必要な命令を追加します。 requirements.txtファイルを確認して、依存関係の内容を把握します。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 イメージを動的にし、異なる環境に適応させる方法を学びます。
タスク
/home/labex/project配下のflask-app-envディレクトリに移動します。- このディレクトリにある
Dockerfileを開き、環境変数を設定する命令を追加します。 app.pyファイルを修正して、ポート番号に環境変数を使用するようにします。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 つのステージでコードをコンパイルし、別のステージで本番環境用のスリムなイメージを作成します。
タスク
/home/labex/project配下のgo-appディレクトリに移動します。- このディレクトリにある
Dockerfileを開き、マルチステージビルドのための命令を追加します。 main.goファイルを確認して、シンプルな Go アプリケーションの内容を把握します。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 イメージの作成から、マルチステージビルドのような高度なテクニックの実装までを体験しました。この過程で、以下の方法を学びました:
- 基本的な Dockerfile を使用したシンプルな Docker イメージの作成
- Docker イメージ内での依存関係の管理
- 環境変数を使用したイメージの柔軟性の向上
- 効率的で本番環境に適したイメージのためのマルチステージビルドの実装
これらのスキルは Docker を効果的に活用するための基盤となり、開発やテストから本番環境へのデプロイまで、さまざまなシナリオで役立ちます。Docker CLI と Dockerfile の構文に関する実践的な経験を積んだことは、コンテナ化されたアプリケーションを扱うすべての人にとって非常に価値のある資産です。
Docker の学習を続けるにあたって、これらの基本操作がより複雑な Docker ワークフローの構成要素であることを忘れないでください。これらのスキルを定期的に練習することで、コンテナイメージの作成と管理に習熟し、最終的にはより効率的で合理化された開発・デプロイプロセスを実現できるようになります。
引き続き Docker の機能を探索し、さまざまなベースイメージ、ビルド戦略、最適化手法を試してみてください。コンテナ化の世界は広大で可能性に満ちています。あなたは今、自信を持ってその世界を進むための準備が整っています!



