はじめに
Docker Compose の down コマンドは、Docker コンテナ管理において不可欠なツールです。この実験(Lab)では、docker-compose down を効果的に使用して、Docker コンテナ、ネットワーク、ボリューム、およびイメージを適切にシャットダウンし、クリーンアップする方法を説明します。このコマンドを習得することで、クリーンな Docker 環境を維持し、開発ワークフローを最適化することができます。
Docker Compose の down コマンドは、Docker コンテナ管理において不可欠なツールです。この実験(Lab)では、docker-compose down を効果的に使用して、Docker コンテナ、ネットワーク、ボリューム、およびイメージを適切にシャットダウンし、クリーンアップする方法を説明します。このコマンドを習得することで、クリーンな Docker 環境を維持し、開発ワークフローを最適化することができます。
docker-compose down コマンドを使用する前に、Docker Compose が正しくインストールされていることを確認し、操作するサンプル Docker Compose プロジェクトを作成する必要があります。
まず、セットアップ中に Docker Compose が正常にインストールされたかどうかを確認しましょう。
docker-compose version
次のような出力が表示されるはずです。
Docker Compose version v2.18.1
次に、この実験全体で使用する簡単な Docker Compose ファイルを作成しましょう。Nginx に基づいた基本的な Web サービスを使用して、現在のディレクトリに docker-compose.yml という名前のファイルを作成します。
nano エディタを使用してファイルを作成します。
cd ~/project/docker-compose-demo
nano docker-compose.yml
次の内容をエディタにコピーして貼り付けます。
version: "3"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- web_data:/usr/share/nginx/html
db:
image: redis:latest
volumes:
- db_data:/data
volumes:
web_data:
db_data:
Ctrl+O、Enter の順に押してファイルを保存し、Ctrl+X で終了します。
この Docker Compose ファイルは以下を定義しています。
Docker Compose ファイルで定義されたサービスを起動しましょう。
docker-compose up -d
-d フラグは、コンテナをデタッチモード(バックグラウンド)で実行します。次のような出力が表示されるはずです。
Creating network "docker-compose-demo_default" with the default driver
Creating volume "docker-compose-demo_web_data" with default driver
Creating volume "docker-compose-demo_db_data" with default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1 ... done
コンテナが実行されていることを確認しましょう。
docker-compose ps
両方のサービスが起動して実行されていることを示す出力が表示されるはずです。
Name Command State Ports
-----------------------------------------------------------------------------------
docker-compose-demo_db_1 docker-entrypoint.sh redis ... Up 6379/tcp
docker-compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8080->80/tcp
また、curl を使用して Nginx Web サーバーにアクセスできることを確認することもできます。
curl http://localhost:8080
デフォルトの Nginx ウェルカムページ HTML 出力が表示されるはずです。
これでサービスが起動して実行されたので、次のステップで docker-compose down コマンドについて学ぶ準備ができました。
Docker Compose サービスが実行されているので、docker-compose down コマンドと、それを効果的に使用する方法について学びましょう。
docker-compose down コマンドは、docker-compose up によって作成されたコンテナ、ネットワーク、ボリューム、およびイメージを停止して削除するために使用されます。このコマンドは、不要になったリソースをクリーンアップする場合や、環境をリセットする場合に不可欠です。
コマンドの最も単純な形式は次のとおりです。
docker-compose down
このコマンドを実行して、何が起こるか観察してみましょう。
cd ~/project/docker-compose-demo
docker-compose down
次のような出力が表示されるはずです。
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
このコマンドは次のことに注意してください。
ただし、デフォルトではボリュームは削除されません。これは理解しておくべき重要な点です。ボリュームは、データを保持するために、コンテナのライフサイクルを超えて存続します。
コンテナとネットワークが削除されたことを確認しましょう。
docker-compose ps
空のリストが表示されるはずです。これは、この Docker Compose プロジェクトから実行中のコンテナがないことを示しています。
ボリュームがまだ存在するかどうかを確認しましょう。
docker volume ls | grep docker-compose-demo
ボリュームがまだ存在することを確認できるはずです。
local docker-compose-demo_db_data
local docker-compose-demo_web_data
このデフォルトの動作は、コンテナの再起動間でデータを保持するため重要です。これらのボリュームも削除したい場合は、追加のオプションを使用する必要があります。これについては次のステップで説明します。
次のステップで必要になるため、サービスをもう一度起動しましょう。
docker-compose up -d
次のように表示されるはずです。
Creating network "docker-compose-demo_default" with the default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1 ... done
Docker Compose は、ボリュームが既に存在するため、それらを再作成する必要がないことに注意してください。
これで、docker-compose down の基本的な使用法を理解できました。次のステップでは、削除するリソースを正確に制御するための、より高度なオプションについて説明します。
基本的な docker-compose down コマンドは便利ですが、Docker Compose には、削除されるリソースをより詳細に制御できる追加のオプションが用意されています。このステップでは、これらのオプションについて説明します。
前のステップで確認したように、docker-compose down はデフォルトではボリュームを削除しません。これは、誤ってデータが失われるのを防ぐための安全機能です。ただし、完全なクリーンアップを行う場合や、アプリケーションのデータをリセットする場合など、ボリュームも削除したい場合があります。
コンテナとネットワークに加えてボリュームを削除するには、--volumes フラグを使用します。
docker-compose down --volumes
試してみましょう。
cd ~/project/docker-compose-demo
docker-compose down --volumes
次のような出力が表示されるはずです。
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
Removing volume docker-compose-demo_web_data
Removing volume docker-compose-demo_db_data
今回は、ボリュームも削除されていることに注意してください。
ボリュームが削除されたことを確認しましょう。
docker volume ls | grep docker-compose-demo
出力が表示されないはずです。これは、ボリュームが削除されたことを確認しています。
もう 1 つの便利なオプションは、Docker Compose 環境を停止するときにイメージを削除することです。これは、さまざまな値を受け入れる --rmi フラグを使用して実行できます。
--rmi all: すべてのサービスで使用されているすべてのイメージを削除します。--rmi local: カスタムタグのないイメージのみを削除します。サービスをもう一度起動してから、--rmi フラグを使用しましょう。
docker-compose up -d
サービスが起動するのを待ってから、--rmi フラグを使用して停止します。
docker-compose down --rmi local
次のような出力が表示されるはずです。
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
Removing image redis:latest
Removing image nginx:latest
今回は、イメージも削除されます。
場合によっては、Docker Compose によって作成されたが、現在の docker-compose.yml ファイルで定義されなくなったコンテナがある場合があります。これらは「オーファンコンテナ」と呼ばれます。
これを実証するために、Docker Compose ファイルを変更して db サービスを削除しましょう。
nano docker-compose.yml
ファイルを編集して、db サービスとそのボリュームを削除します。
version: "3"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- web_data:/usr/share/nginx/html
volumes:
web_data:
エディタを保存して終了します(Ctrl+O、Enter、Ctrl+X)。
次に、更新されたファイルを使用して、サービスをもう一度起動しましょう。
docker-compose up -d
以前の db サービスのコンテナが適切に停止していなかった場合、それはオーファンと見なされます。このようなオーファンは、--remove-orphans フラグを使用して削除できます。
docker-compose down --remove-orphans
これにより、以前のバージョンの Docker Compose ファイルによって作成されたが、もはや定義されていないコンテナも削除されます。
完全なクリーンアップのために、これらのオプションを組み合わせることもできます。
docker-compose down --volumes --rmi all --remove-orphans
このコマンドは次のことを行います。
これは、環境を完全にリセットする場合や、Docker Compose の構成に大幅な変更を加える準備をしている場合に特に役立ちます。
docker-compose down コマンドで使用できるすべてのオプションは、ヘルプフラグを使用して確認できます。
docker-compose down --help
利用可能なオプションとその説明を確認してください。
これで、Docker Compose 環境をシャットダウンするときに、さまざまなオプションを使用して削除するリソースを制御する方法について十分に理解できました。
docker-compose down コマンドとそのオプションを理解したので、このコマンドを効果的に使用するためのベストプラクティスと実際のシナリオをいくつか見ていきましょう。
実際の使用法をよりよく示すために、より複雑な Docker Compose 環境を作成しましょう。フロントエンド、バックエンド、およびデータベースを備えたシンプルな Web アプリケーションをセットアップします。
cd ~/project/docker-compose-demo
nano docker-compose.yml
内容を以下に置き換えます。
version: "3"
services:
frontend:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- frontend_data:/usr/share/nginx/html
networks:
- app_network
backend:
image: node:14-alpine
command: sh -c "echo 'Backend service running' && sleep infinity"
volumes:
- backend_data:/app
networks:
- app_network
- db_network
database:
image: postgres:13-alpine
environment:
POSTGRES_PASSWORD: example
POSTGRES_USER: user
POSTGRES_DB: appdb
volumes:
- db_data:/var/lib/postgresql/data
networks:
- db_network
networks:
app_network:
db_network:
volumes:
frontend_data:
backend_data:
db_data:
保存してエディタを終了します。
このより複雑な環境を起動しましょう。
docker-compose up -d
3 つのすべてのサービスのネットワーク、ボリューム、およびコンテナの作成を示す出力が表示されるはずです。
実際のシナリオでは、開発、テスト、本番環境など、さまざまな環境がある場合があります。Docker Compose を使用すると、さまざまな環境に対して異なる構成ファイルを使用できます。
開発環境用のファイルを作成します。
nano docker-compose.dev.yml
次の内容を追加します。
version: "3"
services:
frontend:
ports:
- "8081:80"
environment:
NODE_ENV: development
backend:
environment:
NODE_ENV: development
DEBUG: "true"
database:
ports:
- "5432:5432"
保存してエディタを終了します。
このファイルをベースファイルと組み合わせて使用するには、-f フラグを使用できます。
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
これにより、構成がマージされ、開発固有の設定が適用されます。
この環境を停止するには、次のように使用します。
docker-compose -f docker-compose.yml -f docker-compose.dev.yml down
継続的インテグレーション/デプロイメント(CI/CD)パイプラインまたは開発ワークフローでは、すべての Docker リソースを削除するクリーンアップスクリプトを用意しておくと便利なことがよくあります。簡単なクリーンアップスクリプトを作成しましょう。
nano cleanup.sh
次の内容を追加します。
#!/bin/bash
echo "Cleaning up Docker environment..."
## Stop and remove containers, networks, volumes, and images
docker-compose down --volumes --rmi all --remove-orphans
## Remove dangling volumes
echo "Removing dangling volumes..."
docker volume prune -f
## Remove dangling images
echo "Removing dangling images..."
docker image prune -f
echo "Cleanup complete!"
保存してエディタを終了します。
スクリプトを実行可能にします。
chmod +x cleanup.sh
これで、完全なクリーンアップが必要なときはいつでもこのスクリプトを実行できます。
./cleanup.sh
特定のリソースのみを削除したい場合があります。たとえば、ボリューム(データを保持するため)は保持し、コンテナ、ネットワーク、およびイメージを削除したい場合があります。
さまざまなシナリオへのアプローチは次のとおりです。
コンテナとネットワークのみを削除する(ボリュームとイメージを保持する):
docker-compose down
コンテナ、ネットワーク、およびイメージを削除する(ボリュームを保持する):
docker-compose down --rmi all
コンテナ、ネットワーク、およびボリュームを削除する(イメージを保持する):
docker-compose down --volumes
ローカルイメージのみを削除する(レジストリからプルされていないもの):
docker-compose down --rmi local
リソースを選択的に削除することにより、特定のニーズに基づいてワークフローを最適化できます。
docker-compose down を実行する前と後に、Docker リソースの使用状況を監視すると役立つことがよくあります。これにより、適切にクリーンアップされていないリソースを特定できます。
いくつかの便利なコマンドを次に示します。
すべてのコンテナを一覧表示する(停止したものを含む):
docker ps -a
すべてのネットワークを一覧表示する:
docker network ls
すべてのボリュームを一覧表示する:
docker volume ls
すべてのイメージを一覧表示する:
docker image ls
システム全体の情報を取得する:
docker system df
最後のコマンドを試して、現在のリソース使用量を確認しましょう。
docker system df
Docker リソースの使用状況の概要が表示されます。これには、コンテナ、イメージ、ボリュームの数と、使用されている合計スペースが含まれます。
次に、複雑な環境を停止し、関連するすべてのリソースを削除しましょう。
docker-compose down --volumes --rmi all --remove-orphans
これにより、Docker Compose プロジェクトに関連付けられたすべてのコンテナ、ネットワーク、ボリューム、およびイメージが停止および削除されます。
これらのベストプラクティスに従うことで、Docker 環境を効果的に管理し、最適なリソース使用量を確保できます。
この実験では、docker-compose down コマンドを効果的に使用して、Docker コンテナとリソースを管理する方法を学びました。達成した内容を以下にまとめます。
docker-compose down の基本と、デフォルトでコンテナとネットワークを削除する方法を学びました。--volumes、--rmi、--remove-orphans などの高度なオプションを調べて、削除するリソースを正確に制御しました。docker-compose down コマンドを習得することで、クリーンな Docker 環境を維持し、リソースリークを防ぎ、開発ワークフローを最適化するための知識が得られました。
これらの重要なポイントを覚えておいてください。
docker-compose down コマンドは、コンテナとネットワークを削除しますが、ボリュームは保持します。--volumes を使用してボリュームを削除します。--rmi を使用してイメージを削除します。--remove-orphans を使用します。これらのスキルにより、プロジェクトで Docker Compose 環境を効率的に管理するための準備が整いました。