はじめに
この実験では、docker image prune コマンドを使用して未使用の Docker イメージを削除することで、ディスク領域を効果的に管理する方法を学びます。まず、このコマンドの目的と、対象となる未使用イメージの種類(特にダングリング・イメージとすべての未使用イメージ)を理解します。
実践的な演習を通じて、ダングリング・イメージの削除を練習し、その後、すべての未使用イメージを削除する方法を学びます。さらに、docker image prune でフィルタリング・オプションを使用して、作成時間やラベルなどの条件に基づいてイメージを選択的に削除する方法を探索し、イメージのクリーンアップ・プロセスを細かく制御できるようになります。
docker image prune の目的を理解する
このステップでは、docker image prune コマンドの目的を理解します。Docker を使用する際には、システム上に未使用のイメージが蓄積されることは避けられません。これらのイメージは大量のディスク領域を占有する可能性があります。docker image prune コマンドは、これらの未使用イメージを削除してディスク領域を解放するために使用されます。
docker image prune が対象とする未使用イメージには、主に 2 種類あります。
- ダングリング・イメージ(dangling images):これらはタグが付けられておらず、どのコンテナからも参照されていないイメージです。基本的には不要になった中間レイヤーです。
- すべての未使用イメージ:これにはダングリング・イメージのほか、タグが付けられていてもどのコンテナからも参照されていないイメージも含まれます。
まずは、いくつかのダングリング・イメージを作成して、docker image prune がどのように動作するかを確認しましょう。ubuntu イメージのいくつかの異なるバージョンを取得し、そのうちの 1 つをベースに新しいイメージをビルドします。このプロセスでは、しばしばダングリング・イメージが残ります。
まず、ubuntu:latest と ubuntu:18.04 イメージを取得します。
docker pull ubuntu:latest
docker pull ubuntu:18.04
イメージが取得されていることを示す出力が表示されるはずです。
次に、ubuntu:latest をベースにしたシンプルなイメージをビルドしましょう。~/project ディレクトリに Dockerfile という名前のファイルを作成し、以下の内容を記述します。
FROM ubuntu:latest
RUN echo "Hello, Docker!" >/app/hello.txt
この Dockerfile は、ubuntu:latest イメージから始めて、/app ディレクトリに hello.txt という名前のファイルを追加するだけです。
次に、docker build コマンドを使用してイメージをビルドします。このイメージにはタグを付けません。これにより、ダングリング・イメージが作成されます。
docker build -t my-ubuntu-app ~/project
ビルドプロセスを示す出力が表示されるはずです。ビルドが完了したら、中間イメージを含むすべてのイメージをリストアップして、ダングリング・イメージがあるかどうかを確認しましょう。
docker images -a
REPOSITORY 列と TAG 列に <none> が表示されているイメージを探します。これらがダングリング・イメージです。
docker image prune コマンドは、デフォルトでこれらのダングリング・イメージを削除するように設計されています。次のステップでは、このコマンドを使用して、先ほど作成したダングリング・イメージをクリーンアップします。
docker image prune を使用してダングリング・イメージを削除する
前のステップでは、特定のタグを付けずにイメージをビルドすることで、いくつかのダングリング・イメージを作成しました。このステップでは、docker image prune コマンドを使用してこれらのダングリング・イメージを削除します。
デフォルトでは、docker image prune はダングリング・イメージのみを削除します。これは、現在実行中のコンテナに関連付けられていなくても、まだ必要なイメージを誤って削除することなく、未使用のイメージ・レイヤーをクリーンアップする最も安全な方法です。
ダングリング・イメージを削除するには、単に docker image prune コマンドを実行します。
docker image prune
このコマンドを実行すると、Docker は削除するダングリング・イメージのリストを表示し、確認を求めます。
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
y と入力して Enter キーを押すと、削除が実行されます。
コマンドが完了すると、解放された総ディスク容量が報告されます。
次に、中間イメージを含むすべてのイメージを再度リストアップして、ダングリング・イメージが削除されたことを確認しましょう。
docker images -a
docker image prune を実行する前に存在していた REPOSITORY 列と TAG 列に <none> が表示されているイメージはもう表示されないはずです。ubuntu:latest、ubuntu:18.04、および my-ubuntu-app イメージは、ダングリング・イメージではないため、引き続き存在しているはずです。
これにより、docker image prune を使用してダングリング・イメージを削除する基本的な使い方がわかります。これは、Docker ホストのディスク領域を定期的に解放するための良い方法です。
docker image prune -a を使用してすべての未使用イメージを削除する
前のステップでは、docker image prune を使用してダングリング・イメージを削除する方法を学びました。ダングリング・イメージを削除することは役に立ちますが、システム上には現在どのコンテナからも使用されていないが、ダングリングではない(つまり、タグが付けられている)イメージが存在する場合があります。これらのイメージも削除するには、docker image prune とともに -a(または --all)フラグを使用します。
docker image prune -a コマンドは、ダングリング・イメージだけでなく、すべての未使用イメージを削除します。これはより積極的なクリーンアップであり、現在実行中のコンテナに関連付けられていないすべてのイメージを削除するため、注意して使用する必要があります。
これがどのように動作するか見てみましょう。まず、現在持っているイメージをリストアップします。
docker images
ubuntu:latest、ubuntu:18.04、および my-ubuntu-app が表示されるはずです。これらのイメージは現在実行中のコンテナから使用されていませんが、タグが付けられているため、ダングリングではありません。
次に、docker image prune -a コマンドを実行します。
docker image prune -a
前のステップと同様に、Docker は削除するイメージのリストを表示し、確認を求めます。
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]
y と入力して Enter キーを押して削除を実行します。
コマンドが完了すると、解放された総ディスク容量が報告されます。
次に、イメージを再度リストアップして、どのイメージが残っているかを確認します。
docker images
現在実行中のコンテナに関連付けられていないすべてのイメージが削除されているはずです。実行中のコンテナがある場合、それらのコンテナで使用されているイメージは削除されません。
docker image prune -a を使用すると、大量のディスク領域を解放することができますが、現在使用されていないすべてのイメージが削除されることを忘れないでください。
作成時間に基づいて削除するイメージをフィルタリングする
すべての未使用イメージを削除するだけでなく、docker image prune を使うと、様々な基準に基づいて削除対象とするイメージをフィルタリングできます。有用なフィルタリング方法の 1 つは、イメージの作成時間に基づくものです。これにより、特定の時点より前に作成されたイメージを削除できます。
--filter フラグはフィルタを適用するために使用されます。作成時間でフィルタリングするには、until フィルタを使用します。until フィルタは、タイムスタンプまたは期間を値として取ります。指定された時間 以降 に作成されたイメージは保持され、指定された時間 以前またはその時点で 作成されたイメージは削除対象となります。
まず、作成時間の異なるいくつかのイメージを取得しましょう。alpine:latest と centos:latest を取得します。
docker pull alpine:latest
docker pull centos:latest
次に、イメージをリストアップして、それらの作成時間を確認しましょう。
docker images
各イメージの CREATED 列に注目してください。
時間でのフィルタリングをデモンストレーションするために、基準時点が必要です。例えば、5 分以上前に作成されたイメージを削除したいとしましょう。until フィルタに 5m のような期間を指定できます。
docker image prune -a --filter "until=5m"
このコマンドは、5 分以上前に作成されたすべての未使用イメージを削除対象とします。Docker は実行前に再度確認を求めます。
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]
y と入力して Enter キーを押して確認します。
削除処理の後、再度イメージをリストアップします。
docker images
イメージを取得してから削除コマンドを実行するまでの時間によっては、一部のイメージが削除されているかもしれません。過去 5 分以内に作成されたイメージは残っているはずです。
また、様々な形式で特定のタイムスタンプを指定することもできます。たとえば、特定の日付と時刻より前に作成されたイメージを削除するには、"2023-10-27T10:00:00" のような形式を使用できます。
作成時間でのフィルタリングは、クリーンアップタスクを自動化するのに役立ち、システム上に比較的新しいイメージのみを保持することができます。
ラベルに基づいて削除するイメージをフィルタリングする
この最後のステップでは、docker image prune のもう 1 つの強力なフィルタリングオプション、ラベルに基づくフィルタリングを探索します。ラベルは、イメージを含む Docker オブジェクトにメタデータを追加するために付けることができるキーと値のペアです。これらのラベルを使用して、Docker リソースをフィルタリングし管理することができます。
label キーを指定した --filter フラグを使用すると、イメージのラベルに基づいて、削除対象に含めるまたは除外するイメージを指定できます。
まず、異なるラベルを持ついくつかのイメージを作成しましょう。簡単な Dockerfile を使用して、異なるラベルを持つ 2 つのイメージをビルドします。
~/project ディレクトリに Dockerfile.labeled という名前のファイルを作成し、以下の内容を記述します。
FROM alpine:latest
LABEL environment="development"
LABEL version="1.0"
RUN echo "This is a labeled image" >/app/info.txt
この Dockerfile から 2 つのイメージをビルドします。ビルドプロセス中に --label フラグを使用して異なるラベルを適用します。
docker build -t my-labeled-app:dev --label project=myapp --label stage=dev ~/project -f Dockerfile.labeled
docker build -t my-labeled-app:prod --label project=myapp --label stage=prod ~/project -f Dockerfile.labeled
これで、同じ Dockerfile をベースにしたが、異なる stage ラベルを持つ 2 つのイメージ my-labeled-app:dev と my-labeled-app:prod がビルドされました。
イメージをリストアップし、それらのラベルを確認しましょう。
docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"
イメージとそれに関連付けられたラベルが表示されるはずです。
次に、docker image prune を使用して、ラベルに基づいてイメージを削除しましょう。stage=dev というラベルを持つすべての未使用イメージを削除したいとします。--filter フラグに label=stage=dev を指定します。また、ダングリング・イメージだけでなく、すべての未使用イメージを対象とするために -a フラグも使用します。
docker image prune -a --filter "label=stage=dev"
Docker はフィルタに一致するイメージを表示し、削除することを示します。y と入力して確認します。
削除処理の後、再度イメージをリストアップします。
docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"
my-labeled-app:dev イメージが削除され、my-labeled-app:prod はフィルタに一致しなかったため残っていることがわかるはずです。
また、label!=key=value 構文を使用して、特定のラベルまたはラベル値を 持たない イメージを削除することもできます。たとえば、stage=prod というラベルを 持たない すべての未使用イメージを削除するには、次のようにします。
docker image prune -a --filter "label!=stage=prod"
このコマンドは、my-labeled-app:dev(まだ存在する場合)と、stage=prod ラベルを持たない他のすべての未使用イメージを削除します。
ラベルによるフィルタリングは、独自に定義したメタデータに基づいてイメージを柔軟に管理およびクリーンアップする方法を提供します。
まとめ
この実験では、docker image prune コマンドを使用して、未使用の Docker イメージを削除することでディスク容量を管理する方法を学びました。まず、このコマンドの目的と、対象となる未使用イメージの種類(ダングリング・イメージ(タグ付けされていない、参照されていないイメージ)と、すべての未使用イメージ(タグ付けされているが参照されていないイメージを含む))を理解しました。その後、基本的な docker image prune コマンドを使用して、ダングリング・イメージを特定し削除する練習を行いました。
さらに、-a フラグを使用してすべての未使用イメージを削除する方法を学ぶことで、docker image prune の機能を深く探りました。最後に、作成時間やラベルなどの基準に基づいてイメージを選択的に削除するためのフィルタリングオプションの使い方を学び、イメージのクリーンアップをより細かく制御する方法を見つけました。



