はじめに
この実験では、docker container prune コマンドを使用して停止したコンテナを効果的に管理する方法を学びます。まず、実際のシナリオを想定して複数のコンテナを作成・停止します。その後、停止したコンテナを削除するさまざまな方法を探求します。具体的には、すべての停止コンテナを削除する方法、特定の時間より前に作成されたコンテナを削除する方法、ラベルに基づいて選択的にコンテナを削除する方法などを扱います。このハンズオン体験を通じて、Docker システムをクリーンかつ最適化された状態に保つスキルを習得できます。
複数のコンテナを作成して停止する
このステップでは、Docker コンテナを作成・停止する方法を学びます。Docker コンテナは軽量でポータブルな自己完結型のユニットであり、アプリケーションを実行するために必要なすべてを含んでいます。
まず、コンテナ作成に使用する Docker イメージを取得します。ここでは最小限の Ubuntu OS であるubuntuイメージを使用します。
docker pull ubuntu
イメージがダウンロードされることを示す出力が表示されます。
Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
イメージを取得したので、これからコンテナを作成・実行します。docker runコマンドを使用します。-dフラグはコンテナをデタッチモード(バックグラウンド)で実行し、--nameフラグはコンテナに名前を割り当てます。
docker run -d --name my-ubuntu-container ubuntu sleep infinity
このコマンドはubuntuイメージからmy-ubuntu-containerという名前のコンテナを作成し、内部でsleep infinityコマンドを実行します。sleep infinityコマンドはコンテナを無期限に実行し続けます。
出力としてコンテナ ID(長い文字列)が表示されます。
<container_id>
コンテナが実行中か確認するには、docker psコマンドを使用します。
docker ps
このコマンドは実行中のコンテナを一覧表示します。my-ubuntu-containerが表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" X seconds ago Up X seconds my-ubuntu-container
次に、別のコンテナを作成しますが、今回は特定の名前を付けません。Docker が自動的に名前を生成します。
docker run -d ubuntu sleep infinity
再びコンテナ ID が出力されます。
<container_id>
docker psを再度実行して、両方の実行中コンテナを確認します。
docker ps
2 つのコンテナが表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" X seconds ago Up X seconds my-ubuntu-container
<container_id> ubuntu "sleep infinity" X seconds ago Up X seconds <random_name>
次に、my-ubuntu-containerという名前のコンテナを停止します。docker stopコマンドに続けてコンテナ名または ID を指定します。
docker stop my-ubuntu-container
コンテナ名が出力され、停止したことが確認できます。
my-ubuntu-container
再度docker psを実行します。my-ubuntu-containerは表示されなくなります。docker psは実行中のコンテナのみ表示するためです。
docker ps
停止したコンテナも含めてすべてのコンテナを表示するには、docker ps -aコマンドを使用します。
docker ps -a
両方のコンテナが表示され、my-ubuntu-containerのステータスがExitedになっているはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" X minutes ago Exited (0) X seconds ago my-ubuntu-container
<container_id> ubuntu "sleep infinity" X minutes ago Up X minutes <random_name>
最後に、2 番目のコンテナをその ID を使用して停止します。ID はdocker ps -aの出力から確認できます。<container_id>を実際の 2 番目のコンテナの ID に置き換えてください。
docker stop <container_id>
コンテナ ID が出力されます。
<container_id>
最後にdocker ps -aを実行して、両方のコンテナが停止したことを確認します。
docker ps -a
両方のコンテナのステータスがExitedになっているはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" X minutes ago Exited (0) X seconds ago my-ubuntu-container
<container_id> ubuntu "sleep infinity" X minutes ago Exited (0) X seconds ago <random_name>
停止済みコンテナを一括削除
前のステップでは 2 つのコンテナを作成し停止しました。停止したコンテナは依然としてディスクスペースとリソースを消費します。このステップでは、docker container pruneコマンドを使用して停止済みコンテナをすべて削除する方法を学びます。
まず、削除対象となるコンテナを確認するため、停止済みのものも含めすべてのコンテナを一覧表示します。
docker ps -a
前のステップで停止した 2 つのコンテナが表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" X minutes ago Exited (0) X minutes ago my-ubuntu-container
<container_id> ubuntu "sleep infinity" X minutes ago Exited (0) X minutes ago <random_name>
次に、停止済みコンテナを一括削除します。docker container pruneコマンドはすべての停止済みコンテナを削除します。
docker container prune
Docker はコンテナ削除前に確認を求めます。yと入力し Enter キーを押して続行します。
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
削除されたコンテナと回収された総ディスク容量を示す出力が表示されます。
Deleted Containers:
<container_id>
<container_id>
Total reclaimed space: XMB
停止済みコンテナが削除されたことを確認するため、再度すべてのコンテナを一覧表示します。
docker ps -a
今度は何も表示されず、コンテナ(実行中も停止中も)が残っていないことがわかります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
指定時間以前に作成された停止済みコンテナを削除
前のステップでは、すべての停止済みコンテナを削除する方法を学びました。場合によっては、特定の時刻以前に作成された停止済みコンテナのみを削除したいことがあります。これは新しいコンテナを保持しながら古いコンテナをクリーンアップするのに便利です。このステップでは、docker container pruneコマンドに--filterフラグとuntilフィルタを組み合わせて、特定時刻以前に作成された停止済みコンテナを削除する方法を学びます。
まず、削除対象となるいくつかのコンテナを作成して停止します。
docker run -d --name container-old-1 ubuntu sleep infinity
docker run -d --name container-old-2 ubuntu sleep infinity
数秒待ってから、別のコンテナを作成します。これが「新しい」コンテナになります。
sleep 5
docker run -d --name container-new-1 ubuntu sleep infinity
次に、すべてのコンテナを停止します。
docker stop container-old-1 container-old-2 container-new-1
すべてのコンテナを一覧表示して、ステータスと作成時刻を確認します。
docker ps -a --format "{{.Names}}\t{{.Status}}\t{{.CreatedAt}}"
作成時刻が異なる以下のような出力が表示されます:
container-old-1 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC
container-old-2 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC
container-new-1 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC
ここで、特定時刻以前に作成された停止済みコンテナを削除します。docker container pruneコマンドにuntilフィルタを使用します。untilフィルタはタイムスタンプまたは期間を指定できます。この例では期間を使用し、10 秒以上前に作成されたコンテナを削除します。
docker container prune --filter "until=10s"
Docker は確認を求めます。yと入力し Enter キーを押します。
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
古いコンテナが削除されたことを示す出力が表示されます。新しいコンテナは削除対象としてリストされていないはずです。
Deleted Containers:
<container_id_old_1>
<container_id_old_2>
Total reclaimed space: XMB
古いコンテナのみが削除されたことを確認するため、再度すべてのコンテナを一覧表示します。
docker ps -a --format "{{.Names}}\t{{.Status}}"
container-new-1のみがExitedステータスで表示されるはずです。
container-new-1 Exited (0) X seconds ago
特定ラベルが付いた停止済みコンテナを削除
これまでのステップでは、すべての停止済みコンテナと作成時刻に基づく停止済みコンテナの削除方法を学びました。このステップでは、ラベルを使用して削除対象のコンテナをフィルタリングする便利な方法を探ります。ラベルは Docker オブジェクト(コンテナを含む)に付与できるキーと値のペアで、整理や管理に役立ちます。
まず、異なるラベルが付いたいくつかのコンテナを作成します。
docker run -d --name container-label-app --label app=frontend ubuntu sleep infinity
docker run -d --name container-label-env --label env=development ubuntu sleep infinity
docker run -d --name container-no-label ubuntu sleep infinity
次に、すべてのコンテナを停止します。
docker stop container-label-app container-label-env container-no-label
すべてのコンテナとそのラベルを一覧表示し、適用したラベルを確認します。
docker ps -a --format "{{.Names}}\t{{.Labels}}"
以下のような出力が表示されます:
container-label-app app=frontend
container-label-env env=development
container-no-label
ここで、app=frontendラベルが付いた停止済みコンテナのみを削除します。--filterフラグとlabelフィルタを使用します。
docker container prune --filter "label=app=frontend"
Docker は確認を求めます。yと入力し Enter キーを押します。
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
app=frontendラベルが付いたコンテナが削除されたことを示す出力が表示されます。
Deleted Containers:
<container_id_app_frontend>
Total reclaimed space: XMB
app=frontendラベルが付いたコンテナのみが削除されたことを確認するため、再度すべてのコンテナを一覧表示します。
docker ps -a --format "{{.Names}}\t{{.Labels}}"
env=developmentラベルが付いたコンテナとラベルのないコンテナのみが表示されるはずです。
container-label-env env=development
container-no-label
特定のラベルが付いていないコンテナを削除するには、ラベルフィルタに!プレフィックスを使用します。env=developmentラベルが付いていないコンテナを削除してみましょう。
docker container prune --filter "label!=env=development"
yと入力し Enter キーを押して削除を確認します。
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
env=developmentラベルが付いていないコンテナが削除されたことを示す出力が表示されます。
Deleted Containers:
<container_id_no_label>
Total reclaimed space: XMB
最後にすべてのコンテナを一覧表示し、env=developmentラベルが付いたコンテナのみが残っていることを確認します。
docker ps -a --format "{{.Names}}\t{{.Labels}}"
container-label-envのみが表示されるはずです。
container-label-env env=development
まとめ
この実験では、docker runおよびdocker stopコマンドを使用して Docker コンテナを作成・停止する方法と、docker psで実行中のコンテナを一覧表示する方法を学びました。さらに、docker container pruneコマンドを使用して停止済みコンテナを効率的に削除する方法を探求しました。具体的には、以下の操作を実践しました:
- すべての停止済みコンテナを削除
--filter untilオプションを使用して特定時刻以前に作成された停止済みコンテナを削除--filter labelオプションを使用してラベルに基づき停止済みコンテナを選択的に削除
これらのステップを通じて、Docker 環境における停止済みコンテナの管理とクリーンアップの実用的な方法を実証しました。



