docker compose down コマンドでリソースを停止・削除する方法

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

はじめに

この実験では、Docker Compose ファイルで定義されたリソースを停止・削除するためにdocker compose downコマンドを効果的に使用する方法を学びます。まず、2 つのサービスと 1 つのネットワークを含むシンプルな Compose ファイルを準備します。

セットアップ後、docker compose upを使用してこれらのサービスを起動する練習を行います。実験の核心部分では、docker compose downを使用してデフォルトのリソースを停止・削除し、その後-vオプションでボリュームを削除、--rmi allでイメージを削除するなど、さまざまなレベルのリソースクリーンアップを実践します。

サービスとネットワークを含むシンプルな Compose ファイルを準備する

このステップでは、2 つのサービスと 1 つのネットワークを定義するシンプルな Compose ファイルを準備します。開始前に、環境にプリインストールされていないため Docker Compose をインストールする必要があります。

まず、Docker Compose バイナリをダウンロードします。プリインストールされている Docker バージョンと互換性のある 1.29.2 バージョンをダウンロードします。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

このコマンドは、公式 GitHub リリースページから Docker Compose バイナリをダウンロードし、/usr/local/bin/docker-composeに保存します。$(uname -s)$(uname -m)の部分は、OS とアーキテクチャを自動検出して適切なバイナリをダウンロードします。

次に、ダウンロードしたバイナリに実行権限を付与します。

sudo chmod +x /usr/local/bin/docker-compose

インストールを確認するために、Docker Compose のバージョンを確認します。

docker-compose --version

コンソールにバージョン情報が表示されれば、Docker Compose が正しくインストールされています。

Docker Compose がインストールされたので、プロジェクト用のディレクトリを作成し移動します。~/projectディレクトリ内にmy-compose-appというディレクトリを作成します。

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

このディレクトリ内にdocker-compose.ymlファイルを作成します。このファイルでサービスとネットワークを定義します。nanoエディタを使用してファイルを作成・編集します。

nano docker-compose.yml

以下の内容をdocker-compose.ymlファイルに貼り付けます。このファイルはwebredisの 2 つのサービス、およびapp-networkというネットワークを定義しています。

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - app-network
  redis:
    image: redis:latest
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

このdocker-compose.ymlファイルの内容を解説します:

  • version: '3.8' Docker Compose ファイルフォーマットのバージョンを指定
  • services: アプリケーションを構成するサービスを定義
    • web: webという名前のサービス
      • image: nginx:latest 最新のnginxイメージを使用
      • ports: - "80:80" ホストマシンのポート 80 をコンテナのポート 80 にマッピング
      • networks: - app-network webサービスをapp-networkに接続
    • redis: redisという名前のサービス
      • image: redis:latest 最新のredisイメージを使用
      • networks: - app-network redisサービスをapp-networkに接続
  • networks: サービスが使用するネットワークを定義
    • app-network: app-networkという名前のネットワーク
      • driver: bridge デフォルトのブリッジドライバを使用

Ctrl + XYEnterの順でファイルを保存します。

サービスを起動する前に、必要な Docker イメージをプルします。nginx:latestredis:latestイメージをプルします。

docker pull nginx:latest
docker pull redis:latest

これらのコマンドは、指定されたイメージを Docker Hub からローカルマシンにダウンロードします。

docker compose up でサービスを起動

このステップでは、docker compose up コマンドを使用して docker-compose.yml ファイルで定義したサービスを起動します。このコマンドはサービスのコンテナをビルド、(再) 作成、起動し、アタッチします。

docker-compose.yml ファイルを作成した ~/project/my-compose-app ディレクトリにいることを確認してください。

cd ~/project/my-compose-app

次に、以下のコマンドを実行してサービスを起動します。-d フラグを使用してコンテナをデタッチドモードで実行し、バックグラウンドで動作させてターミナルをブロックしないようにします。

docker-compose up -d

このコマンドを初めて実行すると、Docker Compose は以下の処理を行います:

  1. docker-compose.yml ファイルで定義された app-network を作成
  2. nginx:latest イメージを使用して web サービスのコンテナを作成
  3. redis:latest イメージを使用して redis サービスのコンテナを作成
  4. 両方のコンテナを app-network に接続
  5. 両方のコンテナを起動

ネットワークとコンテナが作成・起動されていることを示す出力が表示されます。

コンテナが実行中か確認するには、docker ps コマンドを使用します。

docker ps

このコマンドは実行中のすべてのコンテナをリスト表示します。web サービス (nginx イメージベース) と redis サービス (redis イメージベース) の 2 つのコンテナが表示されるはずです。コンテナ名には通常、ディレクトリ名 (この場合は my-compose-app) とサービス名 (例:my-compose-app_web_1, my-compose-app_redis_1) がプレフィックスとして付きます。

docker network ls コマンドを使用して、Docker Compose が作成したネットワークを確認することもできます。

docker network ls

docker-compose.yml ファイルの app-network 定義に基づいて作成された my-compose-app_app-network という名前のネットワークが表示されるはずです。

最後に、web サービスのポート 80 をホストのポート 80 にマッピングしたので、Web ブラウザで LabEx VM の IP アドレスにアクセスするか、ターミナルから curl を使用してデフォルトの Nginx ウェルカムページにアクセスできます。

curl localhost

出力にデフォルトの Nginx ウェルカムページの HTML コンテンツが表示されれば、web サービスが正常に実行されアクセス可能であることが確認できます。

docker compose down でデフォルトリソースを停止・削除

このステップでは、docker compose down コマンドを使用して docker compose up で作成されたコンテナとネットワークを停止・削除します。デフォルトでは、docker compose downup で作成されたコンテナとデフォルトネットワークを削除します。

~/project/my-compose-app ディレクトリにいることを確認してください。

cd ~/project/my-compose-app

以下のコマンドを実行してサービスを停止・削除します。

docker-compose down

このコマンドを実行すると、Docker Compose は以下の処理を行います:

  1. 実行中のコンテナ (webredis) を停止
  2. 停止したコンテナを削除
  3. docker compose up で作成されたネットワーク (my-compose-app_app-network) を削除

コンテナとネットワークが停止・削除されていることを示す出力が表示されます。

コンテナが削除されたことを確認するには、docker ps -a コマンドを使用します。-a フラグは停止中のコンテナも含めてすべて表示します。

docker ps -a

出力に my-compose-app_web_1my-compose-app_redis_1 コンテナが表示されなくなっているはずです。

docker network ls コマンドを使用してネットワークが削除されたことも確認できます。

docker network ls

my-compose-app_app-network は出力に表示されなくなっているはずです。

docker compose down はデフォルトではボリュームやイメージを削除しないことに注意してください。これらを削除する方法は次のステップで説明します。

docker compose down -v でボリュームを含めて停止・削除

前のステップでは、docker compose down がコンテナとネットワークを削除するがボリュームは削除しないことを確認しました。このステップでは、docker compose down-v フラグを追加してボリュームも含めたリソースを削除する方法を学びます。

まず、削除対象のリソースを作成するため、再度サービスを起動します。~/project/my-compose-app ディレクトリにいることを確認してください。

cd ~/project/my-compose-app

docker compose up -d コマンドを実行してサービスをデタッチドモードで起動します。

docker-compose up -d

これによりコンテナとネットワークが再作成されます。

次に、ボリュームが作成されているか確認しましょう。docker-compose.yml では明示的にボリュームを定義していませんが、redis などのイメージはデフォルトでデータを永続化するために匿名ボリュームを作成する場合があります。docker volume ls コマンドでボリュームを確認できます。

docker volume ls

my-compose-app_redisdata のような名前のボリュームが表示されるかもしれません(正確な名前は Docker Compose のバージョンや設定によって若干異なりますが、プロジェクト名とサービス名がプレフィックスとして付きます)。これは redis コンテナによって作成された匿名ボリュームです。

では、docker compose down -v を使用してサービス、ネットワーク、およびボリュームを停止・削除しましょう。

docker-compose down -v

-v フラグは、docker-compose.yml ファイルの volumes セクションで宣言されたすべてのボリュームと、コンテナにアタッチされた匿名ボリュームを削除するよう Docker Compose に指示します。

コンテナ、ネットワーク、ボリュームが停止・削除されていることを示す出力が表示されます。

コンテナが削除されたことを確認するには、docker ps -a を使用します。

docker ps -a

webredis コンテナは表示されていないはずです。

ネットワークが削除されたことを確認するには、docker network ls を使用します。

docker network ls

my-compose-app_app-network は表示されていないはずです。

最後に、ボリュームが削除されたことを確認するには、docker volume ls を使用します。

docker volume ls

以前表示されていたボリューム(例:my-compose-app_redisdata)は出力に表示されなくなっているはずです。

docker compose down --rmi all でイメージを停止・削除

前のステップでは、docker compose down を使用してコンテナ、ネットワーク、ボリュームを停止・削除する方法を学びました。デフォルトでは、docker compose down はコンテナ作成に使用された Docker イメージを削除しません。このステップでは、docker compose down--rmi all フラグを追加してイメージを削除する方法を学びます。

まず、再度サービスを起動しましょう。~/project/my-compose-app ディレクトリにいることを確認してください。

cd ~/project/my-compose-app

docker compose up -d コマンドを実行してサービスをデタッチドモードで起動します。

docker-compose up -d

これによりコンテナとネットワークが再作成されます。

次に、docker images コマンドを使用してシステム上の Docker イメージを確認します。

docker images

nginxredis イメージが表示されるはずです(システム上に他のイメージがある場合も表示されます)。

では、docker compose down --rmi all を使用してサービス、ネットワーク、ボリューム、およびイメージを停止・削除しましょう。

docker-compose down --rmi all -v

ボリュームも確実に削除するため、-v フラグも含めています。--rmi all フラグは、docker-compose.yml ファイル内のサービスで使用されたすべてのイメージを削除するよう Docker Compose に指示します(タグが付いていない場合も含みます)。

コンテナ、ネットワーク、ボリューム、イメージが停止・削除されていることを示す出力が表示されます。

コンテナが削除されたことを確認するには、docker ps -a を使用します。

docker ps -a

webredis コンテナは表示されていないはずです。

ネットワークが削除されたことを確認するには、docker network ls を使用します。

docker network ls

my-compose-app_app-network は表示されていないはずです。

ボリュームが削除されたことを確認するには、docker volume ls を使用します。

docker volume ls

このプロジェクトに関連するボリュームは表示されていないはずです。

最後に、イメージが削除されたことを確認するには、docker images を使用します。

docker images

サービスで使用されていた nginxredis イメージは、他のコンテナで使用されていたり他のタグが付いていたりしない限り、出力に表示されなくなっているはずです。docker compose down --rmi all は他のコンテナで使用されていないイメージのみを削除します。

まとめ

この実験では、Docker Compose ファイルで定義されたリソースを停止・削除するためにdocker compose downコマンドを使用する方法を学びました。まず、Docker Compose のインストールとdocker-compose.ymlファイルの作成を行い、2 つのサービスと 1 つのネットワークを含むシンプルな Compose ファイルを準備しました。

docker compose upでサービスを起動した後、docker compose downの様々な使用方法を探求しました。最初に基本的なコマンドを使用してデフォルトのリソース(コンテナとネットワーク)を停止・削除しました。その後、-vフラグを使用してボリュームを削除する方法と、--rmi allフラグを使用してイメージを削除する方法を学び、Docker Compose アプリケーションのライフサイクル管理におけるdocker compose downコマンドの柔軟性を実証しました。