docker-compose down コマンドの効果的な活用

DockerBeginner
オンラインで実践に進む

はじめに

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 コンテナとリソースを効果的に管理する方法を学びました。達成した内容は以下の通りです。

  1. Docker Compose のインストールとシンプルな Docker Compose 環境の作成
  2. docker-compose down の基本と、デフォルトでコンテナとネットワークが削除される仕組みの理解
  3. --volumes--rmi--remove-orphans などの高度なオプションを使用して、削除するリソースを正確に制御する方法
  4. 実用的なシナリオにおけるベストプラクティスの実装
    • 環境固有の設定ファイルの使用
    • クリーンアップスクリプトの作成
    • リソースの選択的削除
    • リソース使用量の監視

docker-compose down コマンドを習得したことで、クリーンな Docker 環境を維持し、リソースリークを防ぎ、開発ワークフローを最適化する知識が身につきました。

重要なポイントを覚えておきましょう:

  • 基本の docker-compose down コマンドはコンテナとネットワークを削除しますが、ボリュームは保持します。
  • データをリセットしたい場合は --volumes を使用してボリュームを削除します。
  • ディスク容量を解放したい場合は --rmi を使用してイメージを削除します。
  • Compose ファイルで定義されなくなったコンテナをクリーンアップするには --remove-orphans を使用します。
  • 必要に応じてこれらのオプションを組み合わせて、完全なクリーンアップを行います。

これらのスキルを活用して、プロジェクトで Docker Compose 環境を効率的に管理してください。