はじめに
この実験では、docker compose alpha publish コマンドを使用して Docker Compose アプリケーションを公開する方法を学びます。まず、docker-compose.yaml ファイルを使用してシンプルなマルチコンテナアプリケーションを準備します。
準備が完了したら、解決済みのイメージダイジェストを含めて公開する方法や、公開成果物に環境変数を含める方法など、アプリケーションをリポジトリに公開するさまざまな方法を探求します。このハンズオン体験を通じて、Compose アプリケーションのパッケージ化と共有のプロセスを実践的に学びます。
シンプルな Docker Compose アプリケーションの準備
このステップでは、シンプルな Docker Compose アプリケーションを準備します。Docker Compose は、マルチコンテナの Docker アプリケーションを定義・実行するためのツールです。Compose では YAML ファイルを使用してアプリケーションのサービスを設定し、単一のコマンドで設定からすべてのサービスを作成・起動できます。
まず、Docker Compose をインストールする必要があります。LabEx 環境にはプリインストールされていないため、バイナリをダウンロードして実行可能にします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
ダウンロードして実行可能にした後、バージョンを確認してインストールを検証します。
docker-compose --version
Docker Compose version v2.20.2 のような出力が表示されるはずです。
次に、シンプルな Docker Compose アプリケーションを作成しましょう。~/projectディレクトリにdocker-compose.yamlファイルを作成します。このファイルは Nginx ウェブサーバーを実行する単一のサービスを定義します。
nanoエディタを使用してファイルを作成・編集します。
nano ~/project/docker-compose.yaml
docker-compose.yamlファイルに以下の内容を追加します:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
このdocker-compose.yamlファイルでは:
version: '3.8'は Compose ファイルフォーマットのバージョンを指定services:はアプリケーションのサービスを定義web:はサービスの名前image: nginx:latestはこのサービスで使用する Docker イメージを指定(公式 Nginx イメージの最新版を使用)ports:はホストマシンからコンテナへのポートマッピング。"80:80"はホストのポート 80 をコンテナのポート 80 にマッピング
Ctrl + Sでファイルを保存し、Ctrl + Xでエディタを終了します。
アプリケーションを実行する前に、nginx:latestイメージをプルする必要があります。
docker pull nginx:latest
これで、docker-compose upコマンドを使用してアプリケーションを起動できます。-dフラグはコンテナをデタッチドモード(バックグラウンド)で実行します。
docker-compose up -d
サービスが作成・起動されていることを示す出力が表示されるはずです。
コンテナが実行中か確認するには、docker psコマンドを使用します。
docker ps
webサービスのエントリが表示され、nginxイメージとUpステータスが確認できます。
最後に、Nginx サーバーにアクセスしてテストできます。コンテナのポート 80 がホストのポート 80 にマッピングされているため、curlでlocalhostにアクセスできます。
curl localhost
デフォルトの Nginx ウェルカムページの HTML 出力が表示されるはずです。
Compose アプリケーションをリポジトリに公開
このステップでは、Docker Compose アプリケーションをリポジトリに公開する方法を学びます。Compose アプリケーションの公開には、通常docker-compose.yamlファイルの共有と、必要な Docker イメージがコンテナレジストリからアクセス可能であることを確保する作業が含まれます。
まず、前のステップで実行中の Docker Compose アプリケーションを停止しましょう。まだ~/projectディレクトリにいない場合は移動します。
cd ~/project
docker-compose downコマンドを使用して実行中のサービスを停止します。このコマンドはupで作成されたコンテナ、ネットワーク、ボリュームを停止・削除します。
docker-compose down
サービスが停止・削除されていることを示す出力が表示されるはずです。
Compose アプリケーションを公開するには、docker-compose.yamlファイルを共有する必要があります。実際のシナリオでは、通常このファイルを Git などのバージョン管理システムに保存し、リポジトリ(GitHub、GitLab、Bitbucket など)にプッシュします。
この実験では、docker-compose.yamlファイルの内容を含むシンプルなテキストファイルを作成することで、公開をシミュレートします。これにより設定を共有する核心的な概念を実演します。
~/projectディレクトリにcompose_app.txtというファイルを作成し、docker-compose.yamlの内容をコピーしましょう。
cat ~/project/docker-compose.yaml > ~/project/compose_app.txt
新しいファイルの内容を表示して、docker-compose.yamlと同じか確認できます。
cat ~/project/compose_app.txt
Compose ファイルの YAML 内容が表示されるはずです。
実際の公開シナリオでは、docker-compose.yamlファイルで参照されている Docker イメージが他の人がアクセス可能なコンテナレジストリで利用可能であることも確認する必要があります。今回のケースでは、nginx:latestイメージは Docker Hub で公開されているため、この特定のイメージに対して追加の手順は不要です。カスタムイメージを使用している場合は、それらをビルドしてレジストリにプッシュする必要があります。
例えば、my-custom-appというカスタムイメージがある場合、docker buildでビルドし、docker push your-dockerhub-username/my-custom-appで Docker Hub などのレジストリにプッシュします。
Compose ファイルの共有をシミュレートするために、compose_app.txtファイルを誰かと共有していると想像してください。相手はこのファイルをダウンロードし、必要なイメージにアクセスできて Docker と Docker Compose がインストールされていれば、自分のマシンでアプリケーションを実行できます。
これを実演するために、元のdocker-compose.yamlファイルを削除し、compose_app.txtから再作成しましょう。
rm ~/project/docker-compose.yaml
cat ~/project/compose_app.txt > ~/project/docker-compose.yaml
これでdocker-compose.yamlファイルが再作成されたことを確認できます。
cat ~/project/docker-compose.yaml
以前と同じ YAML 内容が表示されるはずです。
このステップでは Compose ファイルを共有する概念に焦点を当てました。次のステップでは、イメージダイジェストの使用や環境変数の扱いなど、公開に関するより高度な側面を探求します。
イメージダイジェスト解決済みの Compose アプリケーションを公開
このステップでは、解決済みイメージダイジェストを使用して Compose アプリケーションを公開する方法を学びます。latestのようなタグの代わりにイメージダイジェストを使用すると、常に同じイメージバージョンを使用していることをより確実に保証できます。タグは新しいイメージを指すように更新される可能性がありますが、ダイジェストは特定のイメージレイヤーを一意に識別します。
まず、前のステップで使用したnginx:latestイメージのダイジェストを取得しましょう。docker inspectコマンドを使用してイメージの詳細情報を取得できます。
docker inspect nginx:latest --format='{{.RepoDigests}}'
このコマンドはnginx:latestイメージのリポジトリダイジェストを出力します。出力は[nginx@sha256:...]のようになります。@以降の部分がイメージダイジェストです。このダイジェストをコピーしてください。
次に、docker-compose.yamlファイルを修正してタグの代わりにイメージダイジェストを使用します。nanoを使用して~/projectディレクトリのdocker-compose.yamlファイルを開きます。
nano ~/project/docker-compose.yaml
image行をimage: nginx:latestからimage: nginx@<your_image_digest>に変更し、<your_image_digest>をコピーしたダイジェストで置き換えます。例えば、ダイジェストがsha256:abcdef123456...の場合、行はimage: nginx@sha256:abcdef123456...のようになります。
version: "3.8"
services:
web:
image: nginx@sha256:your_image_digest_here
ports:
- "80:80"
Ctrl + Sでファイルを保存し、Ctrl + Xでエディタを終了します。
このdocker-compose.yamlファイルを共有すると、使用する人はlatestタグが現在何を指しているかに関係なく、ダイジェストで識別された正確なイメージをプルします。
Compose がダイジェストを使用することを実証するために、修正したdocker-compose.yamlを使用してアプリケーションをもう一度起動しましょう。
docker-compose up -d
Compose はダイジェストで指定されたイメージを使用します。イメージがシステム上にまだ存在しない場合、プルされます。
実行中のコンテナを検査して、コンテナが実行中でダイジェストで指定されたイメージを使用していることを確認できます。まず、docker psを使用してコンテナ ID を確認します。
docker ps
nginxイメージを実行しているコンテナを見つけ、その Container ID をメモします。次に、Container ID を使用してdocker inspectを実行し、イメージダイジェストを表示するように出力をフォーマットします。
docker inspect < container_id > --format='{{.Image}}'
<container_id>を実行中の Nginx コンテナの実際の ID に置き換えてください。出力はdocker-compose.yamlファイルで指定したイメージダイジェストであるはずです。
Compose ファイルでイメージダイジェストを使用することは、再現性を確保し、イメージ更新によるアプリケーションの予期しない変更を防ぐための良いプラクティスです。
環境変数を含む Compose アプリケーションの公開
このステップでは、Docker Compose アプリケーションに環境変数を含める方法と、これが公開にどのように影響するかを学びます。環境変数はアプリケーションを設定する一般的な方法であり、Docker Compose はそれらを管理するためのいくつかの方法を提供します。
まず、前のステップで実行中の Nginx コンテナを停止しましょう。まだ~/projectディレクトリにいない場合は移動します。
cd ~/project
docker-compose downコマンドを使用して実行中のサービスを停止します。
docker-compose down
次に、docker-compose.yamlファイルを修正して環境変数を使用します。webサービスにシンプルな環境変数を追加します。nanoを使用して~/projectディレクトリのdocker-compose.yamlファイルを開きます。
nano ~/project/docker-compose.yaml
webサービスの定義にenvironmentセクションを追加します。MY_VARIABLEという名前の変数と値を追加します。
version: "3.8"
services:
web:
image: nginx@sha256:your_image_digest_here ## 実際のダイジェストに置き換えてください
ports:
- "80:80"
environment:
- MY_VARIABLE=HelloFromCompose
your_image_digest_hereを前のステップで取得した実際のイメージダイジェストに置き換えることを忘れないでください。
Ctrl + Sでファイルを保存し、Ctrl + Xでエディタを終了します。
これで、docker-compose upでアプリケーションを起動すると、MY_VARIABLE環境変数が Nginx コンテナ内に設定されます。
docker-compose up -d
コンテナ内に環境変数が設定されていることを確認するために、docker execを使用して実行中のコンテナ内でコマンドを実行できます。まず、docker psを使用してコンテナ ID を確認します。
docker ps
実行中の Nginx コンテナの Container ID をメモします。次に、docker execを使用してコンテナ内でprintenvコマンドを実行し、MY_VARIABLEの出力をフィルタリングします。
docker exec < container_id > printenv | grep MY_VARIABLE
<container_id>を実行中の Nginx コンテナの実際の ID に置き換えてください。MY_VARIABLE=HelloFromComposeのような出力が表示されるはずです。
環境変数を使用する Compose アプリケーションを公開する場合、これらの変数がターゲット環境でどのように提供されるかを考慮する必要があります。
一般的なアプローチの 1 つは、.envファイルを使用することです。Docker Compose は、docker-compose.yamlファイルがあるディレクトリで.envという名前のファイルを自動的に探します。このファイルで環境変数を定義でき、Compose はそれらを読み込みます。
~/projectディレクトリに.envファイルを作成しましょう。
nano ~/project/.env
.envファイルに次の内容を追加します:
ANOTHER_VARIABLE=ThisIsFromDotEnv
ファイルを保存し、nanoを終了します。
次に、docker-compose.yamlファイルを修正してこの新しい環境変数を使用します。再度docker-compose.yamlファイルを開きます。
nano ~/project/docker-compose.yaml
environmentセクションにANOTHER_VARIABLEを追加します。
version: "3.8"
services:
web:
image: nginx@sha256:your_image_digest_here ## 実際のダイジェストに置き換えてください
ports:
- "80:80"
environment:
- MY_VARIABLE=HelloFromCompose
- ANOTHER_VARIABLE
ANOTHER_VARIABLEについては、変数名だけをリストしていることに注意してください。Compose は、.envファイルから読み込まれた変数を含む、docker-compose upが実行される環境でこの変数を探します。
ファイルを保存し、nanoを終了します。
変更を反映させるために、Compose アプリケーションを停止して再起動します。
docker-compose down
docker-compose up -d
docker psを使用して新しいコンテナ ID を取得します。
docker ps
次に、docker execを使用してコンテナ内の両方の環境変数を確認します。
docker exec < container_id > printenv | grep MY_VARIABLE
docker exec < container_id > printenv | grep ANOTHER_VARIABLE
<container_id>を新しい Container ID に置き換えてください。出力にはMY_VARIABLE=HelloFromComposeとANOTHER_VARIABLE=ThisIsFromDotEnvの両方が表示されるはずです。
公開時には、通常docker-compose.yamlファイルを共有し、必要な環境変数を設定する方法(.envファイルを通じて、または Compose が実行される環境で直接設定する)についての指示を提供します。機密情報はdocker-compose.yamlや.envファイルにハードコードせず、シークレット管理ソリューションを使用して管理する必要があります。
まとめ
この実験では、シンプルな Docker Compose アプリケーションを準備する方法を学びました。これには、Docker Compose のインストール、インストールの確認、基本的な Nginx ウェブサービスを定義するdocker-compose.yamlファイルの作成が含まれます。また、アプリケーションを実行する準備として必要な Docker イメージ (nginx:latest) をプルしました。
提供された内容では詳細に触れられていませんが、その後のステップではおそらくdocker compose alpha publishコマンドを使用してこの Compose アプリケーションをリポジトリに公開する方法をカバーするでしょう。これには、解決済みイメージダイジェストでの公開や、公開するアプリケーション定義に環境変数を含めるなどのオプションの検討が含まれると考えられます。



