はじめに
この実験では、docker compose rm コマンドを使用して停止したコンテナを削除する方法を学びます。まず、Docker Compose をインストールし、基本的な Web サービスを定義する docker-compose.yml ファイルを作成するなど、シンプルな Docker Compose プロジェクトの準備から始めます。
プロジェクトのセットアップ後、サービスのコンテナを停止する練習を行います。この実験の核心は、停止したコンテナを削除するために docker compose rm を使用することにあり、ボリュームなしの場合、匿名ボリュームがある場合、そして最後にコンテナの強制削除の方法を実演します。
シンプルな Docker Compose プロジェクトの準備
このステップでは、シンプルな Docker Compose プロジェクトを準備します。LabEx 環境には Docker Compose がプリインストールされていないため、まずインストールを行います。Docker Compose はマルチコンテナ Docker アプリケーションを定義・実行するためのツールです。Compose では YAML ファイルを使用してアプリケーションのサービスを設定し、単一のコマンドで設定からすべてのサービスを作成・起動できます。
まず、Docker Compose をインストールしましょう。最新の安定版リリースをダウンロードし、実行可能にします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
インストール後、バージョンを確認してインストールを検証します。
docker-compose --version
出力にバージョン番号が表示されれば、Docker Compose が正しくインストールされたことが確認できます。
次に、シンプルな Docker Compose プロジェクトを作成します。プロジェクト用のディレクトリを作成し、その中にdocker-compose.ymlファイルを作成します。このファイルではnginxイメージを使用したシンプルな Web サービスを定義します。
プロジェクトディレクトリに移動します。
cd ~/project
プロジェクト用の新しいディレクトリ(例:my-web-app)を作成します。
mkdir my-web-app
cd my-web-app
nanoエディタを使用してdocker-compose.ymlファイルを作成します。
nano docker-compose.yml
docker-compose.ymlファイルに以下の内容を追加します:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
このdocker-compose.ymlファイルはwebという名前の 1 つのサービスを定義しています。このサービスはnginx:latest Docker イメージを使用し、ホストのポート 80 をコンテナのポート 80 にマッピングします。
Ctrl + X、次にY、そしてEnterを押してファイルを保存します。
これで、docker-compose upコマンドを使用してdocker-compose.ymlファイルで定義されたサービスを起動できます。-dフラグはコンテナをデタッチドモード(バックグラウンド)で実行します。
docker-compose up -d
このコマンドはnginx:latestイメージを(まだ存在しない場合)プルし、webサービスのコンテナを起動します。
docker psコマンドで実行中のコンテナの状態を確認できます。
docker ps
my-web-app_web_1(またはディレクトリ名に応じて類似の名前)というコンテナが実行中で、ポート 80 を転送しているのが確認できるはずです。
Web サーバーが実行中か確認するには、curlでアクセスします。
curl http://localhost
出力に Nginx のデフォルトウェルカムページの HTML が表示されれば、シンプルな Docker Compose プロジェクトが正しくセットアップされ実行されていることが確認できます。
サービスコンテナの停止
前のステップでは、docker-compose up -dを使用してシンプルな Web サービスを起動しました。コンテナは現在バックグラウンドで実行されています。このステップでは、Docker Compose を使用して実行中のサービスコンテナを停止する方法を学びます。
docker-compose.ymlファイルで定義された実行中のコンテナを停止するには、docker-compose stopコマンドを使用します。このコマンドはコンテナにSIGTERMシグナルを送信し、適切にシャットダウンできるようにします。
docker-compose.ymlファイルがある~/project/my-web-appディレクトリにいることを確認してください。
cd ~/project/my-web-app
次に、docker-compose stopコマンドを実行します。
docker-compose stop
コンテナが停止していることを示す出力が表示されます。
stopコマンドを実行した後、コンテナは停止しますが削除されません。停止したコンテナも含めてすべてのコンテナをリスト表示するdocker ps -aコマンドでこれを確認できます。
docker ps -a
my-web-app_web_1コンテナがExitedのステータスで表示されるはずです。これでコンテナが正常に停止したことが確認できます。
再度curlで Web サーバーにアクセスしようとすると、コンテナが停止しているため失敗します。
curl http://localhost
接続拒否エラーが表示され、Web サービスが実行されていないことがわかります。
コンテナの停止は、設定やデータを削除せずに一時的にサービスを停止する必要がある場合に便利です。次のステップでは、これらの停止したコンテナを削除する方法を探ります。
ボリュームなしで停止したサービスコンテナを削除
前のステップでは、docker-compose stopを使用して実行中のコンテナを停止しました。コンテナは現在Exited状態です。このステップでは、Docker Compose を使用してこれらの停止したコンテナを削除する方法を学びます。
docker-compose.ymlファイルで定義された停止したコンテナを削除するには、docker-compose rmコマンドを使用します。デフォルトでは、このコマンドは停止したサービスコンテナのみを削除します。ボリュームやネットワークは削除されません。
docker-compose.ymlファイルがある~/project/my-web-appディレクトリにいることを確認してください。
cd ~/project/my-web-app
次に、docker-compose rmコマンドを実行します。削除の確認を求められるので、yと入力してEnterを押してください。
docker-compose rm
コンテナが削除されていることを示す出力が表示されます。
rmコマンドを実行した後、コンテナは削除されているはずです。停止したコンテナも含めてすべてのコンテナをリスト表示するdocker ps -aコマンドでこれを確認できます。
docker ps -a
リストにmy-web-app_web_1コンテナが表示されなくなっているはずです。これでコンテナが正常に削除されたことが確認できます。
停止したコンテナを削除すると、システムをクリーンアップし、リソースを解放するのに役立ちます。次のステップでは、コンテナを削除する際のボリュームの扱い方を探ります。
匿名ボリューム付きの停止済みサービスコンテナを削除
前のステップでは、停止したコンテナを削除しました。ここでは、関連する匿名ボリュームと共にコンテナを削除する方法を説明します。匿名ボリュームとは、docker-compose.ymlファイルで明示的に名前が付けられていないボリュームのことです。Docker はこれらにランダムな名前を自動的に割り当てます。
まず、docker-compose.ymlファイルを修正して匿名ボリュームを含めるようにします。webサービスにボリュームを追加します。
~/project/my-web-appディレクトリにいることを確認してください。
cd ~/project/my-web-app
docker-compose.ymlファイルを編集します。
nano docker-compose.yml
webサービスの定義にvolumesセクションを追加します。コンテナ内の/usr/share/nginx/htmlに匿名ボリュームをマウントします。これは Nginx がデフォルトコンテンツを提供する場所です。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- /usr/share/nginx/html
Ctrl + X、次にY、そしてEnterを押してファイルを保存します。
サービスを再度起動します。これにより新しいコンテナと匿名ボリュームが作成されます。
docker-compose up -d
docker volume lsコマンドを使用して、Docker によって作成されたボリュームを一覧表示できます。プロジェクトに関連付けられた長いランダム生成名のボリュームが表示されるはずです。
docker volume ls
再度サービスコンテナを停止します。
docker-compose stop
docker ps -aを使用してコンテナが停止していることを確認します。
docker ps -a
my-web-app_web_1コンテナがExited状態で表示されるはずです。
停止したコンテナとそれに関連する匿名ボリュームを削除するには、-vフラグを付けたdocker-compose rmコマンドを使用します。
docker-compose rm -v
削除の確認を求められるので、yと入力してEnterを押してください。
コマンド実行後、docker ps -aを使用してコンテナが削除されたことを確認します。
docker ps -a
my-web-app_web_1コンテナはもう表示されないはずです。
再度docker volume lsでボリュームを確認します。
docker volume ls
webサービス用に作成された匿名ボリュームも削除されているはずです。これにより、-vフラグがコンテナと共に匿名ボリュームも削除することが実証されました。
停止済みサービスコンテナの強制削除
前のステップでは、コンテナを停止して削除しました。時には、コンテナがまだ実行中であっても削除する必要がある場合があります。そのような場合に便利なのが強制削除オプションです。
まず、サービスを再度起動しましょう。
~/project/my-web-appディレクトリにいることを確認してください。
cd ~/project/my-web-app
デタッチドモードでサービスを起動します。
docker-compose up -d
docker psを使用してコンテナが実行中であることを確認します。
docker ps
my-web-app_web_1コンテナがUp状態で表示されるはずです。
ここで、まず停止せずに実行中のコンテナを削除しようとします。実行中のコンテナに対してdocker-compose rmを試みると失敗します。
docker-compose rm
コンテナが実行中で削除できないことを示すエラーメッセージが表示されます。
実行中のコンテナを強制的に削除するには、-fフラグを付けたdocker-compose rmコマンドを使用します。このフラグは確認を求めず、コンテナを正常に停止せずに強制的に削除します。
docker-compose rm -f
コンテナが削除されていることを示す出力が表示されます。今回は確認を求められなかったことに注意してください。
コマンド実行後、docker ps -aを使用してコンテナが削除されたことを確認します。
docker ps -a
my-web-app_web_1コンテナはもう表示されないはずです。これにより、コンテナが実行中であっても強制的に削除されたことが確認できます。
強制削除オプションは慎重に使用する必要があります。明示的に管理されていないボリュームにデータを書き込んでいるコンテナの場合、データ損失を引き起こす可能性があるためです。
これで Docker Compose サービスコンテナの削除についての説明は終了です。コンテナを停止する方法、ボリュームなしで停止したコンテナを削除する方法、匿名ボリューム付きで停止したコンテナを削除する方法、そして実行中のコンテナを強制的に削除する方法を学びました。
まとめ
この実験では、docker compose rmコマンドを使用して停止したコンテナを削除する方法を学びました。まず、Docker Compose のインストールと Nginx イメージを使用した基本的な Web サービスを定義するdocker-compose.ymlファイルの作成を含む、シンプルな Docker Compose プロジェクトの準備から始めました。
次に、サービスコンテナを停止し、その後docker compose rmを使用してそれらを削除する練習を行いました。ボリュームなしで停止したコンテナを削除する方法、匿名ボリューム付きで停止したコンテナを削除する方法、そして強制オプションを使用してコンテナを削除する方法など、さまざまなシナリオを検討しました。この実践的な経験を通じて、Docker Compose プロジェクト内のコンテナライフサイクルを管理するためのdocker compose rmコマンドの実用的な応用方法を実証しました。



