はじめに
この実験では、docker compose up コマンドを使用してコンテナを効果的に管理する方法を学びます。docker-compose.yml ファイルで定義されたサービスを起動するための docker compose up の基本的な使用方法をカバーします。これには、フォアグラウンドでの実行やデタッチドモードでの実行も含まれます。
さらに、force-recreate を使用したコンテナの強制再作成、no-recreate による不要な再作成の防止、コンテナ起動前の自動的なイメージビルドなど、docker compose up の高度なオプションについても探求します。この実験の終わりまでに、さまざまなコンテナ管理シナリオにおいて docker compose up を効果的に使用できるようになるでしょう。
docker compose up でサービスを起動
このステップでは、docker compose up コマンドを使用して docker-compose.yml ファイルで定義されたサービスを起動する方法を学びます。開始する前に、この環境には Docker Compose がプリインストールされていないため、インストールする必要があります。
まず、Docker Compose をインストールしましょう。最新の安定版をダウンロードし、実行可能にします。
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 がインストールされたので、サービスを定義するシンプルな docker-compose.yml ファイルを作成します。~/project ディレクトリに docker-compose.yml という名前のファイルを作成します。
nano ~/project/docker-compose.yml
ファイルに以下の内容を追加します:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
この docker-compose.yml ファイルは、web という名前の単一のサービスを定義しています。nginx:latest イメージを使用し、ホストのポート 80 をコンテナのポート 80 にマッピングします。
では、docker compose up を使用してサービスを起動しましょう。~/project ディレクトリに移動してコマンドを実行します。
cd ~/project
docker compose up
Docker Compose が web コンテナを作成して起動していることを示す出力が表示されます。デフォルトでは、docker compose up はフォアグラウンドで実行され、実行中のサービスのログが表示されます。
Nginx コンテナが実行されていることを確認するには、新しいターミナルを開くか、curl を使用して Web サーバーにアクセスします。
curl http://localhost
デフォルトの Nginx ウェルカムページの HTML 出力が表示されるはずです。これにより、web サービスが実行され、アクセス可能であることが確認できます。
サービスを停止するには、docker compose up が実行されているターミナルで Ctrl+C を押します。これにより、コンテナが停止して削除されます。
デタッチドモードでサービスを実行
前のステップでは、docker compose up を使用してフォアグラウンドでサービスを起動しました。これはデバッグに便利ですが、本番環境やバックグラウンドでサービスを実行する場合は、デタッチドモードを使用すると便利です。
デタッチドモードでは、Docker Compose がコンテナを起動した後に終了し、コンテナはバックグラウンドで実行されたままになります。これにより、ターミナルを他のタスクに使用し続けることができます。
デタッチドモードでサービスを実行するには、docker compose up コマンドに -d フラグを追加するだけです。docker-compose.yml ファイルがある ~/project ディレクトリにいることを確認してください。
cd ~/project
docker compose up -d
コンテナが作成・起動されていることを示す出力が表示されますが、サービスが起動するとコマンドはターミナルのプロンプトに戻ります。
バックグラウンドでコンテナが実行されていることを確認するには、docker ps コマンドを使用して実行中のコンテナを一覧表示します。
docker ps
project-web-1 コンテナ(通常は [ディレクトリ名]-[サービス名]-[インスタンス番号] という命名規則)のエントリが表示されるはずです。
curl を使用して Nginx Web サーバーにアクセスし、動作を確認することもできます。
curl http://localhost
再度、デフォルトの Nginx ウェルカムページの HTML 出力が表示されるはずです。
デタッチドモードで起動したサービスを停止するには、docker-compose.yml ファイルがある同じディレクトリで docker compose down コマンドを使用します。
docker compose down
このコマンドは、docker compose up によって作成されたコンテナ、ネットワーク、ボリュームを停止して削除します。
force-recreate でコンテナを再作成
前のステップでは、デタッチドモードでサービスを実行する方法を学びました。デフォルトでは、同じ docker-compose.yml ファイルで再度 docker compose up を実行し、コンテナが既に実行されている場合、Docker Compose はサービス定義(イメージやポートなど)に変更がない限りコンテナを再作成しません。
時には、サービス定義に変更がなくても Docker Compose にコンテナを停止して再作成させたい場合があります。これは docker-compose.yml ファイルを変更しない更新を適用する場合や、単にコンテナをフレッシュな状態で再起動したい場合に便利です。
コンテナの強制再作成を行うには、docker compose up コマンドに --force-recreate フラグを追加します。
まず、前のステップで web サービスがデタッチドモードで実行されていることを確認してください。実行されていない場合は次のコマンドを実行します:
cd ~/project
docker compose up -d
次に、--force-recreate フラグを付けて docker compose up を再度実行します。
cd ~/project
docker compose up -d --force-recreate
Docker Compose が web コンテナを停止して再作成していることを示す出力が表示されます。docker-compose.yml ファイルに変更がなくても、--force-recreate フラグにより既存のコンテナが破棄され、現在の設定に基づいて新しいコンテナが作成されます。
docker ps を使用してコンテナ ID を確認することで、コンテナが再作成されたことを確認できます。コンテナ ID は --force-recreate 付きでコマンドを実行する前とは異なるはずです。
docker ps
出力中のコンテナ ID を確認してください。
後片付けとして、実行中のサービスを停止します:
cd ~/project
docker compose down
no-recreate で再作成を防止
前のステップでは、--force-recreate フラグを使用してコンテナを強制的に再作成する方法を学びました。ここでは、その逆のシナリオである再作成を防止する方法を見ていきましょう。
前述の通り、デフォルトでは docker compose up は、コンテナが既に実行されており docker-compose.yml ファイルの設定に変更がない場合、コンテナを再作成しません。しかし、設定に軽微な変更があった場合でも、明示的に既存コンテナの再作成を防ぎたい状況があるかもしれません。
コンテナの再作成を防止するには、docker compose up コマンドに --no-recreate フラグを追加します。
まず、web サービスが停止していることを確認してください。実行中の場合は次のコマンドで停止します:
cd ~/project
docker compose down
次に、docker compose up -d でサービスを起動します。
cd ~/project
docker compose up -d
コンテナが実行中であることを確認します:
docker ps
コンテナ ID をメモしておきます。
ここで、--no-recreate フラグを付けて再度 docker compose up を実行します。
cd ~/project
docker compose up -d --no-recreate
サービスが最新状態であり、コンテナが再作成されていないことを示す出力が表示されます。再度 docker ps を確認すると、コンテナ ID が以前と同じであることがわかります。
docker ps
これにより、--no-recreate フラグが既存コンテナの再作成を効果的に防いだことが確認できます。
後片付けとして、実行中のサービスを停止します:
cd ~/project
docker compose down
コンテナ起動前にイメージをビルド
これまでのステップでは、Docker Hub の事前ビルド済みイメージ(例:nginx:latest)を使用してきました。しかし実際には、アプリケーション用に独自のカスタム Docker イメージをビルドする必要がよくあります。
Docker Compose は、サービス起動前に docker-compose.yml ファイルで定義されたイメージを自動的にビルドできます。これは通常、サービスに対して image 名ではなく build コンテキストを指定することで実現します。
簡単なカスタム Nginx イメージをビルドするために docker-compose.yml ファイルを変更してみましょう。
まず、~/project 内に nginx_custom という新しいディレクトリを作成します。
cd ~/project
mkdir nginx_custom
次に、nginx_custom ディレクトリ内に Dockerfile を作成します。
nano ~/project/nginx_custom/Dockerfile
Dockerfile に以下の内容を追加します:
FROM nginx:latest
RUN echo '<h1>Hello from Custom Nginx!</h1>' >/usr/share/nginx/html/index.html
この Dockerfile は公式の nginx:latest イメージをベースにし、デフォルトの index.html ファイルをカスタムコンテンツに置き換えます。
次に、web サービスのイメージビルドにこの Dockerfile を使用するよう ~/project/docker-compose.yml ファイルを修正します。編集のためにファイルを開きます:
nano ~/project/docker-compose.yml
web サービスの定義を image から build に変更します:
version: "3.8"
services:
web:
build: ./nginx_custom
ports:
- "80:80"
これで docker compose up を実行すると、Docker Compose はまず ./nginx_custom ディレクトリ内の Dockerfile で定義されたイメージをビルドし、その新しくビルドされたイメージを使用してコンテナを起動します。
~/project ディレクトリにいることを確認して実行します:
cd ~/project
docker compose up -d
イメージがビルドされ、コンテナが作成・起動される様子を示す出力が表示されます。
カスタム Nginx ページが提供されていることを確認するには、curl を使用します:
curl http://localhost
<h1>Hello from Custom Nginx!</h1> という出力が表示され、イメージがビルドされカスタムコンテンツでコンテナが実行されていることが確認できます。
後片付けとして、実行中のサービスを停止します:
cd ~/project
docker compose down
まとめ
この実験では、docker compose up コマンドを使用してコンテナを管理する方法を学びました。まず Docker Compose をインストールし、Nginx イメージを使用した Web サービスを定義するシンプルな docker-compose.yml ファイルを作成しました。その後、docker compose up でサービスを起動し、デフォルトではフォアグラウンドで実行されコンテナログが表示されることを確認しました。Nginx のウェルカムページにアクセスすることで、実行中のサービスを検証しました。
また、-d フラグを使用してサービスをデタッチドモードで実行する方法も紹介しました。これにより、コマンドが終了してもコンテナはバックグラウンドで実行され続けます。設定が変更されていない場合でもコンテナを強制的に再作成する --force-recreate フラグや、既存コンテナの再作成を防止する --no-recreate フラグの使用方法も学びました。最後に、コンテナ起動前にイメージをビルドまたはリビルドする --build フラグを探索し、最新のイメージが使用されることを確認しました。



