はじめに
この実験では、Docker Compose ファイルで定義されたサービスをビルドするためにdocker compose buildコマンドを効果的に使用する方法を学びます。まず、マルチコンテナアプリケーションを定義するシンプルな Docker Compose ファイルを準備します。
セットアップ後、docker compose buildコマンドを使用してサービスをビルドします。その後、対応する Dockerfile に変更を加えた後にサービスを再ビルドする方法を探ります。最後に、ビルド引数を使用してサービスをビルドする方法と、クリーンビルドのために--no-cacheオプションを活用する方法を学びます。
シンプルな Docker Compose ファイルの準備
このステップでは、マルチコンテナ Docker アプリケーションを定義・管理するための基本的な 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
このコマンドは、公式 GitHub リリースページから Docker Compose バイナリをダウンロードし、/usr/local/bin/docker-composeに保存します。$(uname -s)と$(uname -m)の部分は、OS とアーキテクチャを自動検出して正しいバイナリをダウンロードします。
次に、ダウンロードしたバイナリに実行権限を付与します。
sudo chmod +x /usr/local/bin/docker-compose
このコマンドにより、docker-composeコマンドが実行可能になります。
インストールを確認するためにバージョンを確認しましょう。
docker-compose --version
Docker Compose version v2.20.2のような出力が表示されれば、Docker Compose が正しくインストールされています。
では、シンプルな Docker Compose ファイルを作成しましょう。nginxイメージを使用するサービスを定義します。
プロジェクトディレクトリに移動します。
cd ~/project
nanoエディタを使用してdocker-compose.ymlという名前の新しいファイルを作成します。
nano docker-compose.yml
ファイルに以下の内容を追加します:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
このファイルの内容を説明します:
version: '3.8'- Docker Compose ファイルフォーマットのバージョンを指定services:- アプリケーションを構成するさまざまなサービスを定義web:- サービス名(任意の名前を選択可能)image: nginx:latest- このサービスで使用する Docker イメージ(公式 Nginx イメージの最新版)ports:- ホストマシンとコンテナ間のポートマッピング("80:80"でホストのポート 80 をコンテナのポート 80 にマッピング)
Ctrl + X、Y、Enterの順に押してファイルを保存します。
次に、docker-compose.ymlファイルで指定したnginx:latestイメージをプルします。docker-compose up実行時に自動的にイメージをプルできますが、特に実験環境では事前に明示的にプルしておくのが良いプラクティスです。
docker pull nginx:latest
このコマンドは Docker Hub からnginx:latestイメージをダウンロードします。ダウンロードの進捗を示す出力が表示されます。
docker compose build を使用したサービスのビルド
前のステップでは、既存の Docker イメージ(nginx)を使用するシンプルなdocker-compose.ymlファイルを作成しました。Docker Compose はDockerfileからイメージをビルドすることもできます。これはイメージをカスタマイズしたり、独自のアプリケーション用のイメージをビルドしたりする場合に便利です。
このステップでは、docker-compose.ymlファイルを修正して、プリビルドされたイメージではなくDockerfileからイメージをビルドするように変更します。
まず、~/projectディレクトリにシンプルなDockerfileを作成しましょう。
nano ~/project/Dockerfile
Dockerfileに以下の内容を追加します:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker Compose!"]
このDockerfileの説明:
FROM ubuntu:latest- 新しいイメージのベースイメージを指定(公式 Ubuntu イメージの最新版を使用)RUN apt-get update && apt-get install -y cowsay- パッケージリストを更新し、cowsayパッケージをインストール(cowsayコマンドは牛が描かれた吹き出しでメッセージを表示)CMD ["cowsay", "Hello, Docker Compose!"]- このイメージからコンテナが起動された時に実行されるデフォルトコマンドを設定
Ctrl + X、Y、Enterの順に押してDockerfileを保存します。
次に、このDockerfileを使用するようにdocker-compose.ymlファイルを修正します。編集のためにファイルを開きます:
nano ~/project/docker-compose.yml
内容を以下のように変更します:
version: "3.8"
services:
cow:
build: .
更新されたdocker-compose.ymlの内容:
- サービス名を
webからcowに変更(目的をより明確に表現) image:ディレクティブをbuild: .に置き換え(build: .は Docker Compose にカレントディレクトリ(.)にあるDockerfileを使用してこのサービスのイメージをビルドするよう指示)
Ctrl + X、Y、Enterの順に押してdocker-compose.ymlファイルを保存します。
これで、docker-compose buildコマンドを使用してcowサービスのイメージをビルドできます。~/projectディレクトリにいることを確認してください。
cd ~/project
docker-compose build
このコマンドはdocker-compose.ymlファイルを読み込み、cowサービスを見つけ、カレントディレクトリのDockerfileに基づいてイメージをビルドします。Ubuntu ベースイメージのダウンロード、パッケージの更新、cowsayのインストールなど、ビルドプロセスのステップを示す出力が表示されます。
ビルドが完了したら、ローカルの Docker イメージをリスト表示してイメージが作成されたことを確認できます。
docker images
project_cowのような名前(Docker Compose はディレクトリ名とサービス名に基づいて自動的にイメージ名を生成)とlatestのようなタグが付いたイメージが表示されるはずです。
Dockerfile 変更後のサービス再ビルド
前のステップでは、Dockerfileとdocker-compose buildを使用して Docker イメージをビルドしました。Dockerfileを変更した場合、どうなるでしょうか?Docker はビルドプロセスを高速化するためにキャッシュメカニズムを使用しています。Dockerfile内のレイヤーに変更がない場合、Docker はそのレイヤーを再ビルドせずにキャッシュされたバージョンを使用します。しかし、レイヤーまたはそれ以降のレイヤーに変更がある場合、Docker はそれらのレイヤーを再ビルドします。
このステップでは、Dockerfileを変更し、イメージをリビルドして Docker が変更をどのように処理するかを確認します。
まず、cowsayが表示するメッセージを変更するためにDockerfileを修正しましょう。編集のためにDockerfileを開きます:
nano ~/project/Dockerfile
CMD行を以下のように変更します:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello again, Docker Compose!"]
メッセージを"Hello, Docker Compose!"から"Hello again, Docker Compose!"に変更しました。
Ctrl + X、Y、Enterの順に押してDockerfileを保存します。
では、再度docker-compose buildコマンドを使用してイメージをリビルドしましょう。~/projectディレクトリにいることを確認してください。
cd ~/project
docker-compose build
ビルドプロセスの出力を観察してください。最初の 2 つのステップ(FROM ubuntu:latestとRUN apt-get update && apt-get install -y cowsay)は、前回のビルドからキャッシュされたレイヤーを使用する可能性が高いです。しかし、最後のステップ(CMD ["cowsay", "Hello again, Docker Compose!"])は、Dockerfileでこの行を変更したため、再ビルドされます。
ビルドが完了したら、ローカルの Docker イメージをリスト表示してイメージが更新されたことを確認できます。
docker images
project_cowイメージは、Dockerfileで行った変更を反映しているはずです。イメージ ID は変更される可能性がありますが、名前とタグは同じままです。
変更をさらに確認するために、この新しくビルドされたイメージからコンテナを実行し、出力を確認できます。
docker run project_cow
更新されたメッセージ"Hello again, Docker Compose!"を含むcowsayの出力が表示されるはずです。
ビルド引数とキャッシュ無効化を使用したサービスのビルド
このステップでは、Docker Compose の 2 つの高度なビルドオプションを探求します:ビルド引数の使用とキャッシュ無効化でのビルドです。
ビルド引数を使用すると、Docker ビルドプロセスに変数を渡すことができます。これはDockerfile自体を変更せずに、異なる環境や設定に基づいてビルドをカスタマイズするのに便利です。
まず、ビルド引数を受け入れるようにDockerfileを修正しましょう。編集のためにDockerfileを開きます:
nano ~/project/Dockerfile
内容を以下のように変更します:
FROM ubuntu:latest
ARG MESSAGE="Hello from build argument!"
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "$MESSAGE"]
ARG MESSAGE命令を追加して、デフォルト値を持つMESSAGEというビルド引数を定義しました。また、CMD命令を変更してこの引数を使用するようにしました。
Ctrl + X、Y、Enterの順に押してDockerfileを保存します。
次に、このビルド引数に値を渡すようにdocker-compose.ymlファイルを修正します。編集のためにファイルを開きます:
nano ~/project/docker-compose.yml
内容を以下のように変更します:
version: "3.8"
services:
cow:
build:
context: .
args:
MESSAGE: "Custom message from Compose!"
build:ディレクティブをcontext:とargs:を持つオブジェクトに変更しました。
context: .-Dockerfileを含むディレクトリであるビルドコンテキストを指定args:-Dockerfileに渡すビルド引数のマップ。MESSAGE引数に"Custom message from Compose!"という値を渡しています
Ctrl + X、Y、Enterの順に押してdocker-compose.ymlファイルを保存します。
では、ビルド引数を使用してイメージをビルドしましょう。~/projectディレクトリにいることを確認してください。
cd ~/project
docker-compose build
ビルド出力を観察してください。ビルドプロセス中にビルド引数が使用されていることが確認できるはずです。
ビルドが完了したら、このイメージからコンテナを実行して出力を確認しましょう。
docker run project_cow
"Custom message from Compose!"というメッセージを含むcowsayの出力が表示されるはずです。これにより、ビルド引数が正常に渡され使用されたことが確認できます。
時々、キャッシュを無視してすべてのレイヤーを強制的にリビルドしたい場合があります。これはキャッシュの問題が疑われる場合や、クリーンなビルドを保証したい場合に便利です。docker-compose buildコマンドに--no-cacheフラグを指定することでこれが可能です。
--no-cacheフラグを使用してイメージをリビルドしてみましょう。
docker-compose build --no-cache
再度ビルド出力を観察してください。今回は Docker がキャッシュされたレイヤーを使用せず、Dockerfileのすべてのステップをリビルドします。このプロセスはキャッシュを使用したビルドよりも時間がかかります。
ビルドが完了したら、再度コンテナを実行して、メッセージがビルド引数で渡されたものと同じであることを確認できます。
docker run project_cow
依然として"Custom message from Compose!"が表示されるはずです。--no-cacheフラグはビルドプロセスにのみ影響し、docker-compose.ymlで定義された設定には影響しません。
まとめ
この実験では、Docker Compose をインストールし、nginxイメージを使用してサービスを定義するdocker-compose.ymlファイルを作成することで、シンプルな Docker Compose ファイルを準備する方法を学びました。その後、docker compose buildコマンドを使用してサービスをビルドする練習を行い、Dockerfile の変更後のサービスのリビルドや、ビルド引数の使用、キャッシュを使用しないビルドなどについて実践しました。



