Docker Compose down コマンドの効果的な使用方法

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

はじめに

Docker Compose の down コマンドは、Docker コンテナ管理において不可欠なツールです。この実験(Lab)では、docker-compose down を効果的に使用して、Docker コンテナ、ネットワーク、ボリューム、およびイメージを適切にシャットダウンし、クリーンアップする方法を説明します。このコマンドを習得することで、クリーンな Docker 環境を維持し、開発ワークフローを最適化することができます。

Docker Compose のインストールとサンプルプロジェクトの作成

docker-compose down コマンドを使用する前に、Docker Compose が正しくインストールされていることを確認し、操作するサンプル Docker Compose プロジェクトを作成する必要があります。

Docker Compose のインストール確認

まず、セットアップ中に Docker Compose が正常にインストールされたかどうかを確認しましょう。

docker-compose version

次のような出力が表示されるはずです。

Docker Compose version v2.18.1

簡単な Docker Compose ファイルの作成

次に、この実験全体で使用する簡単な 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+OEnter の順に押してファイルを保存し、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

このコマンドは次のことに注意してください。

  1. Docker Compose ファイルで定義されたすべての実行中のコンテナを停止します。
  2. すべてのコンテナを削除します。
  3. 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

出力が表示されないはずです。これは、ボリュームが削除されたことを確認しています。

イメージの削除

もう 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

このコマンドは次のことを行います。

  1. すべてのコンテナを停止して削除します。
  2. すべての名前付きボリュームを削除します。
  3. すべてのサービスで使用されているすべてのイメージを削除します。
  4. オーファンコンテナを削除します。

これは、環境を完全にリセットする場合や、Docker Compose の構成に大幅な変更を加える準備をしている場合に特に役立ちます。

追加オプションの探索

docker-compose down コマンドで使用できるすべてのオプションは、ヘルプフラグを使用して確認できます。

docker-compose down --help

利用可能なオプションとその説明を確認してください。

これで、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 "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

ベストプラクティス:リソースの選択的削除

特定のリソースのみを削除したい場合があります。たとえば、ボリューム(データを保持するため)は保持し、コンテナ、ネットワーク、およびイメージを削除したい場合があります。

さまざまなシナリオへのアプローチは次のとおりです。

  1. コンテナとネットワークのみを削除する(ボリュームとイメージを保持する):

    docker-compose down
  2. コンテナ、ネットワーク、およびイメージを削除する(ボリュームを保持する):

    docker-compose down --rmi all
  3. コンテナ、ネットワーク、およびボリュームを削除する(イメージを保持する):

    docker-compose down --volumes
  4. ローカルイメージのみを削除する(レジストリからプルされていないもの):

    docker-compose down --rmi local

リソースを選択的に削除することにより、特定のニーズに基づいてワークフローを最適化できます。

ベストプラクティス:リソース使用量の監視

docker-compose down を実行する前と後に、Docker リソースの使用状況を監視すると役立つことがよくあります。これにより、適切にクリーンアップされていないリソースを特定できます。

いくつかの便利なコマンドを次に示します。

  1. すべてのコンテナを一覧表示する(停止したものを含む):

    docker ps -a
  2. すべてのネットワークを一覧表示する:

    docker network ls
  3. すべてのボリュームを一覧表示する:

    docker volume ls
  4. すべてのイメージを一覧表示する:

    docker image ls
  5. システム全体の情報を取得する:

    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 を使用するためのベストプラクティスを実装しました。これには以下が含まれます。
    • 環境固有の構成ファイルの使用
    • クリーンアップスクリプトの作成
    • リソースの選択的削除
    • リソース使用量の監視

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

これらの重要なポイントを覚えておいてください。

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

これらのスキルにより、プロジェクトで Docker Compose 環境を効率的に管理するための準備が整いました。