はじめに
この実験では、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ファイルに貼り付けます。このファイルはwebとredisの 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-networkwebサービスをapp-networkに接続
redis:redisという名前のサービスimage: redis:latest最新のredisイメージを使用networks: - app-networkredisサービスをapp-networkに接続
networks:サービスが使用するネットワークを定義app-network:app-networkという名前のネットワークdriver: bridgeデフォルトのブリッジドライバを使用
Ctrl + X、Y、Enterの順でファイルを保存します。
サービスを起動する前に、必要な Docker イメージをプルします。nginx:latestとredis: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 は以下の処理を行います:
docker-compose.ymlファイルで定義されたapp-networkを作成nginx:latestイメージを使用してwebサービスのコンテナを作成redis:latestイメージを使用してredisサービスのコンテナを作成- 両方のコンテナを
app-networkに接続 - 両方のコンテナを起動
ネットワークとコンテナが作成・起動されていることを示す出力が表示されます。
コンテナが実行中か確認するには、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 down は up で作成されたコンテナとデフォルトネットワークを削除します。
~/project/my-compose-app ディレクトリにいることを確認してください。
cd ~/project/my-compose-app
以下のコマンドを実行してサービスを停止・削除します。
docker-compose down
このコマンドを実行すると、Docker Compose は以下の処理を行います:
- 実行中のコンテナ (
webとredis) を停止 - 停止したコンテナを削除
docker compose upで作成されたネットワーク (my-compose-app_app-network) を削除
コンテナとネットワークが停止・削除されていることを示す出力が表示されます。
コンテナが削除されたことを確認するには、docker ps -a コマンドを使用します。-a フラグは停止中のコンテナも含めてすべて表示します。
docker ps -a
出力に my-compose-app_web_1 と my-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
web と redis コンテナは表示されていないはずです。
ネットワークが削除されたことを確認するには、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
nginx と redis イメージが表示されるはずです(システム上に他のイメージがある場合も表示されます)。
では、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
web と redis コンテナは表示されていないはずです。
ネットワークが削除されたことを確認するには、docker network ls を使用します。
docker network ls
my-compose-app_app-network は表示されていないはずです。
ボリュームが削除されたことを確認するには、docker volume ls を使用します。
docker volume ls
このプロジェクトに関連するボリュームは表示されていないはずです。
最後に、イメージが削除されたことを確認するには、docker images を使用します。
docker images
サービスで使用されていた nginx と redis イメージは、他のコンテナで使用されていたり他のタグが付いていたりしない限り、出力に表示されなくなっているはずです。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コマンドの柔軟性を実証しました。



