はじめに
この実験では、未使用の Docker データを削除してディスク領域を回収するために、docker system prune コマンドを効果的に使用する方法を学びます。まず、docker system prune がデフォルトで削除するものについて理解します。これには、停止したコンテナ、ダングリングイメージ、ダングリングネットワークが含まれますが、ボリュームは含まれません。
その後、ボリュームを除外して未使用の Docker データを削除する方法を探り、次に匿名ボリュームを含むすべての未使用データを削除する方法を学びます。最後に、docker system prune でフィルターを使用して、削除するデータをより細かく制御する方法を学びます。
docker system prune がデフォルトで削除するものを理解する
このステップでは、docker system prune コマンドを調べ、デフォルトで削除する未使用の Docker データの種類を理解します。このコマンドは、ダングリングまたは未使用のオブジェクトを削除してディスク領域をクリーンアップするのに役立ちます。
まず、いくつかの未使用の Docker オブジェクトを作成しましょう。簡単なコンテナを実行してから停止します。これにより、停止したコンテナが残り、そのイメージが他のコンテナで使用されていない場合、ダングリングイメージが残る可能性があります。
LabEx 環境でターミナルを開きます。デフォルトのディレクトリは ~/project です。
簡単な hello-world コンテナを実行します。
docker run hello-world
Docker デーモンが hello-world イメージを取得し、コンテナを実行したことを示す出力が表示されるはずです。コンテナはメッセージを表示した後すぐに停止します。
次に、停止したコンテナを含むすべてのコンテナを一覧表示します。
docker ps -a
hello-world コンテナが「Exited」の状態で一覧に表示されるはずです。
次に、イメージを一覧表示しましょう。
docker images
hello-world イメージが表示されるはずです。
ここで、オプションを指定せずに docker system prune コマンドを実行します。これにより、ダングリングイメージ、ダングリングコンテナ、ダングリングネットワークが削除されます。デフォルトでは、ボリュームは削除されません。
docker system prune -f
-f フラグを使用して、確認プロンプトを表示せずに強制的に削除します。
コマンドを実行した後、削除された内容を示す出力が表示されます。
次に、再度コンテナを確認しましょう。
docker ps -a
停止した hello-world コンテナは削除されているはずです。
再度イメージを確認します。
docker images
hello-world イメージは、「ダングリング」と見なされない場合(たとえば、最近取得された場合)、まだ存在する可能性があります。ただし、他のダングリングイメージがあれば、それらは削除されています。
ここでの重要なポイントは、docker system prune はデフォルトで、停止したコンテナ、ダングリングイメージ、ダングリングネットワークをクリーンアップすることです。明示的に指示しない限り、ボリュームは削除されません。
ボリュームを削除せずに未使用の Docker データを削除する
前のステップで、docker system prune はデフォルトでボリュームを削除しないことを確認しました。ボリュームは、Docker コンテナが生成し、使用するデータを永続化するために使用されます。意図せずにボリュームを削除すると、データが失われる可能性があります。
このステップでは、ボリュームを削除せずに docker system prune がどのように機能するかを示します。ボリュームを作成し、それを使用するコンテナを実行し、コンテナを停止してからシステムを削除します。削除後もボリュームが残っていることを確認します。
まず、名前付きボリュームを作成しましょう。名前付きボリュームは、Docker によって明示的に作成および管理されます。
docker volume create myvolume
作成されたボリュームの名前が出力として表示されるはずです。
次に、このボリュームを使用する簡単なコンテナを実行しましょう。ubuntu イメージを使用します。ローカルにイメージがない場合、Docker はそれを取得します。
docker run -d --name mycontainer -v myvolume:/app ubuntu sleep 60
このコマンドは、ubuntu コンテナをデタッチドモード (-d) で実行し、mycontainer という名前を付け、myvolume をコンテナ内の /app ディレクトリにマウントし、sleep 60 コマンドを使用してコンテナを 60 秒間実行し続けます。
コンテナが実行中であることを確認します。
docker ps
mycontainer が一覧に表示されるはずです。
次に、コンテナを停止します。
docker stop mycontainer
コンテナは停止しますが、停止状態でまだ存在します。
コンテナが停止していることを確認します。
docker ps -a
mycontainer が「Exited」の状態で表示されるはずです。
次に、ボリュームを一覧表示しましょう。
docker volume ls
myvolume が一覧に表示されるはずです。
ここで、再度 docker system prune を実行します。デフォルトでは、ボリュームは削除されません。
docker system prune -f
出力を確認します。停止したコンテナが削除されたことが表示されるはずですが、ボリュームの削除については言及されないはずです。
コンテナが削除されたことを確認します。
docker ps -a
mycontainer はもう一覧に表示されないはずです。
最後に、ボリュームがまだ存在することを確認します。
docker volume ls
myvolume がまだ一覧に表示されるはずです。これにより、docker system prune はデフォルトでボリュームを保持することが確認されます。
匿名ボリュームを含むすべての未使用 Docker データを削除する
前のステップで、docker system prune はデフォルトでボリュームを削除しないことを学びました。しかし、コンテナと関連付けられなくなったボリュームを含む、すべての未使用の Docker データを削除したい場合があります。これは、ボリューム名を明示的に指定せずにコンテナ内のディレクトリをマウントしたときに作成される匿名ボリュームをクリーンアップするのに特に有用です。
ボリュームを含むすべての未使用の Docker データを削除するには、docker system prune とともに -a フラグを使用できます。-a フラグは「all(すべて)」を表し、削除プロセスにボリュームも含まれます。
ボリューム名を指定せずにディレクトリをマウントしてコンテナを実行することで、匿名ボリュームを作成しましょう。
docker run -d --name anothercontainer -v /data ubuntu sleep 60
このコマンドは、anothercontainer という名前の ubuntu コンテナを実行し、コンテナ内の /data ディレクトリに匿名ボリュームをマウントします。
コンテナが実行中であることを確認します。
docker ps
anothercontainer が一覧に表示されるはずです。
次に、コンテナを停止します。
docker stop anothercontainer
コンテナは停止し、停止状態のコンテナになります。
コンテナが停止していることを確認します。
docker ps -a
anothercontainer が「Exited」の状態で表示されるはずです。
次に、ボリュームを一覧表示しましょう。
docker volume ls
前のステップで作成した myvolume と、長いランダムな名前の新しいボリュームが表示されます。これが匿名ボリュームです。
ここで、-a フラグを使用して docker system prune を実行し、ボリュームを含むすべての未使用のデータを削除します。
docker system prune -a -f
-a を使用してボリュームを含め、-f を使用して確認プロンプトを表示せずに強制的に削除します。
出力を注意深く確認します。停止したコンテナが削除されたことが表示され、削除された匿名ボリュームも一覧表示されるはずです。前のステップで作成した名前付きボリューム myvolume も、コンテナによって使用されなくなったため削除されるはずです。
すべてのコンテナが削除されたことを確認します。
docker ps -a
コンテナが一覧に表示されないはずです。
最後に、すべてのボリュームが削除されたことを確認します。
docker volume ls
ボリュームが一覧に表示されないはずです。これにより、docker system prune -a が名前付きボリュームと匿名ボリュームの両方を含むすべての未使用の Docker データを削除することが確認されます。
フィルタを使用して Docker データを削除する
すべての未使用データを削除するだけでなく、docker system prune を使うとフィルタを使用して Docker オブジェクトを選択的に削除することができます。これにより、削除対象をより細かく制御することができます。
フィルタはさまざまな種類のオブジェクトに適用できます。docker system prune では、オブジェクトの作成時間などの条件に基づいてフィルタを適用できます。
フィルタリングを実演するために、いくつかの Docker オブジェクトを作成しましょう。いくつかのコンテナを実行してから停止させます。
最初のコンテナを実行します。
docker run -d --name oldcontainer ubuntu sleep 10
このコンテナは 10 秒間実行された後に終了します。
2 番目のコンテナを実行します。
docker run -d --name newcontainer ubuntu sleep 20
このコンテナは 20 秒間実行された後に終了します。
両方のコンテナが終了するのを待ちます。docker ps -a でそれらの状態を確認できます。
docker ps -a
oldcontainer と newcontainer の両方が「Exited」状態で表示されるはずです。
ここで、特定の時間より古いオブジェクトのみを削除するためにフィルタを使用しましょう。until フィルタに時間を指定して使用できます。たとえば、5 秒より古いオブジェクトを削除するには、until=5s を使用します。
15 秒より古いオブジェクトを削除してみましょう。これにより、oldcontainer が削除され、newcontainer は残るはずです(oldcontainer が終了し、newcontainer がまだ終了していないのを十分に待ったと仮定します)。
docker system prune -f --filter "until=15s"
出力を確認します。oldcontainer が削除されたことが表示され、newcontainer は残っているはずです。
コンテナを確認します。
docker ps -a
newcontainer が一覧に表示され、oldcontainer は削除されているはずです。
次に、再度削除操作を行います。今度は 30 秒より古いオブジェクトを削除します。これにより、newcontainer も削除されるはずです。
docker system prune -f --filter "until=30s"
出力を確認します。newcontainer が削除されたことが表示されるはずです。
再度コンテナを確認します。
docker ps -a
コンテナが一覧に表示されないはずです。
フィルタは削除プロセスをカスタマイズする強力な手段です。削除対象のオブジェクトの種類(コンテナ、イメージ、ボリューム、ネットワーク)に応じて、異なるフィルタキーを使用できます。until フィルタは、特定の期間使用されていないオブジェクトをクリーンアップするためによく使用されます。
まとめ
この実験では、未使用の Docker データを削除してディスク容量を回復するために docker system prune コマンドを使用する方法を学びました。まず、docker system prune のデフォルトの動作を理解しました。これは、停止したコンテナ、ダングリングイメージ(dangling images)、ダングリングネットワーク(dangling networks)を削除します。停止したコンテナを作成してから削除することでこれを実証しました。
次に、削除するデータを制御するためのオプションを使用して docker system prune を使う方法を調べました。ボリュームを削除せずに未使用のデータを削除する方法と、削除プロセスに匿名ボリュームを含める方法を学びました。最後に、特定の条件に基づいて Docker データを選択的に削除するためにフィルタを使用する方法に触れました。この実験は、Docker 環境でディスク容量を効果的に管理するために docker system prune を使用する実践的な経験を提供しました。



