はじめに
Docker Compose の down コマンドは、Docker コンテナ管理において不可欠なツールです。この実験では、docker-compose down を効果的に使用して、Docker コンテナ、ネットワーク、ボリューム、およびイメージを適切に停止・削除する方法を学びます。このコマンドを習得することで、Docker 環境を常にクリーンに保ち、開発ワークフローを最適化できるようになります。
Docker Compose のインストールとサンプルプロジェクトの作成
このステップでは、Docker Compose が正しくインストールされていることを確認し、作業用のサンプル Docker Compose プロジェクトを作成します。
Docker Compose のインストール確認
まず、セットアップ時に Docker Compose が正常にインストールされたかを確認しましょう。
docker-compose version
以下のような出力が表示されるはずです(ビルドの詳細は異なる場合があります)。
docker-compose version 1.29.2, build unknown
シンプルな Docker Compose ファイルの作成
次に、この実験全体で使用するシンプルな Docker Compose ファイルを作成します。現在のディレクトリに docker-compose.yml という名前のファイルを作成し、Nginx をベースにした基本的な Web サービスを定義します。
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 ファイルでは以下を定義しています。
- Nginx イメージを使用した Web サービス
- Redis を使用したデータベースサービス
- 永続データストレージ用の2つの名前付きボリューム
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 Down の理解と使用
このステップでは、実行中の Docker Compose サービスを使用して、docker-compose down コマンドとその効果的な使い方を学びます。
Docker Compose Down とは?
docker-compose down コマンドは、docker-compose up によって作成されたコンテナ、ネットワーク、ボリューム、イメージを停止および削除するために使用されます。このコマンドは、リソースが不要になったときや環境をリセットしたいときに、クリーンアップを行うための重要なコマンドです。
Docker Compose Down の基本的な使い方
最もシンプルなコマンドの形式は以下の通りです。
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 ファイルで定義されたすべての実行中コンテナを停止
- すべてのコンテナを削除
- Docker Compose によって作成されたネットワークを削除
ただし、デフォルトではボリュームは削除されません。これは重要な点です。ボリュームはコンテナのライフサイクルを超えて存続し、データを保持するように設計されているためです。
リソースが削除されたことの確認
コンテナとネットワークが削除されたことを確認します。
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 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
出力がないはずです。これでボリュームが削除されたことが確認できました。
イメージの削除
もう一つの便利なオプションは、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
今回はイメージも削除されました。
不要なコンテナ(Orphan Containers)の削除
Docker Compose によって作成されたものの、現在の docker-compose.yml ファイルには定義されていないコンテナが存在することがあります。これらは「オーファンコンテナ(孤立したコンテナ)」と呼ばれます。
これを実演するために、db サービスを削除するように Docker Compose ファイルを修正してみましょう。
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 down を使用して、Docker Compose 環境を終了する際にどのリソースを削除するかを制御する方法を理解できました。
ベストプラクティスと実用的なシナリオ
このステップでは、docker-compose down コマンドとそのオプションを理解した上で、このコマンドを効果的に使用するためのベストプラクティスと実用的なシナリオを探ります。
より複雑な Docker Compose 環境の作成
実用的な使用例を示すために、より複雑な 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 "Docker 環境をクリーンアップ中..."
## コンテナ、ネットワーク、ボリューム、イメージを停止・削除
docker-compose down --volumes --rmi all --remove-orphans
## ぶら下がっている(dangling)ボリュームを削除
echo "ぶら下がっているボリュームを削除中..."
docker volume prune -f
## ぶら下がっているイメージを削除
echo "ぶら下がっているイメージを削除中..."
docker image prune -f
echo "クリーンアップ完了!"
保存してエディタを終了します。
スクリプトを実行可能にします。
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 のインストールとシンプルな Docker Compose 環境の作成
docker-compose downの基本と、デフォルトでコンテナとネットワークが削除される仕組みの理解--volumes、--rmi、--remove-orphansなどの高度なオプションを使用して、削除するリソースを正確に制御する方法- 実用的なシナリオにおけるベストプラクティスの実装:
- 環境固有の設定ファイルの使用
- クリーンアップスクリプトの作成
- リソースの選択的削除
- リソース使用量の監視
docker-compose down コマンドを習得したことで、クリーンな Docker 環境を維持し、リソースリークを防ぎ、開発ワークフローを最適化する知識が身につきました。
重要なポイントを覚えておきましょう:
- 基本の
docker-compose downコマンドはコンテナとネットワークを削除しますが、ボリュームは保持します。 - データをリセットしたい場合は
--volumesを使用してボリュームを削除します。 - ディスク容量を解放したい場合は
--rmiを使用してイメージを削除します。 - Compose ファイルで定義されなくなったコンテナをクリーンアップするには
--remove-orphansを使用します。 - 必要に応じてこれらのオプションを組み合わせて、完全なクリーンアップを行います。
これらのスキルを活用して、プロジェクトで Docker Compose 環境を効率的に管理してください。



