使用していない Docker オブジェクトの削除(prune)

Docker は使用していないオブジェクト、たとえばイメージ、コンテナ、ボリューム、ネットワークに対するクリーンアップには、慎重なアプローチをとっています。すなわち、各オブジェクトは Docker に対して明示的に削除を命令しない限り、削除されることはありません。その結果、Docker は巨大なディスク容量を使う事になりました。オブジェクトのタイプごとに、 Docker は prune (削除)コマンドを提供しています。さらに、 docker system prune を使えば、複数のオブジェクト・タイプを一度にクリーンアップできます。このトピックは各 prune コマンドをどのようにして使うか紹介します。

イメージの prune

docker image prune コマンドは、使っていないイメージをクリーンアップできます。デフォルトの docker image prune は、宙ぶらりんイメージ(dangling image)のみ削除します。宙ぶらりんイメージとは、タグを持たず、他のコンテナからも参照されないイメージです。宙ぶらりんイメージを削除するには、次のようにします。

$ docker image prune

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y

既存のコンテナ~使われていないイメージすべてを削除するには、 -a フラグを使います。

$ docker image prune -a

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y

デフォルトでは、作業を続行するかどうか尋ねます。この確認を飛ばすには、 -f--force フラグを使います。

--filter フラグでフィルタリング表現を使えば、削除するイメージに制限を設けられます。

$ docker image prune -a --filter "until=24h"

他のフィルタリング表現も利用できます。その他の例は docker image prune リファレンス をご覧ください。

コンテナの prune

コンテナを停止しても、 --rm フラグを付けて起動していなければ、コンテナは自動的に削除されません。Docker ホスト上で、停止しているコンテナも含めて全てを表示するには、 docker ps -a を使います。そうすると、こんなにも沢山のコンテナがあるのかと驚くでしょう。特に開発システム上ではなおさらです! 停止しているコンテナの書き込み可能なレイヤは、ディスク容量を消費し続けます。これらを綺麗に片付けるには、 docker container prune コマンドを使います。

$ docker container prune

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

デフォルトでは、確認プロンプトを表示します。このプロンプトを使わない場合は、 -f もしくは --force フラグを使います。

デフォルトでは、停止している全てのコンテナを削除します。 --filter フラグを使うと、範囲を制限できます。たとえば、以下のコマンドは24時間より以前に停止したコンテナのみを削除します。

$ docker container prune --filter "until=24h"

他にもフィルタリング表現が利用できます。その他の例は docker container prune リファレンス をご覧ください。

ボリュームの prune

ボリュームは1つもしくは複数のコンテナによって利用されるもので、Docker ホスト上で容量を使います。ボリュームの削除はデータの破棄にあたるため、決して自動的に削除されません。

$ docker volume prune

WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y

デフォルトでは、確認プロンプトを表示します。このプロンプトを使わない場合は、 -f もしくは --force フラグを使います。

デフォルトでは、未使用のボリュームを全て削除します。 --filter フラグを使うと、範囲を制限できます。たとえば、以下のコマンドは keep ラベルがないボリュームのみを削除します。

$ docker volume prune --filter "label!=keep"

他にもフィルタリング表現が利用できます。その他の例は docker volume prune リファレンス をご覧ください。

ネットワークの prune

Docker ネットワークはディスクスペースを消費しませんが、 iptables ルールを作成し、ブリッジ・ネットワークのデバイスや、ルーティング・テーブルのエントリも作成します。これらを綺麗に片付けるには、 docker network prune を使い、コンテナから使用されていないネットワークを片付けます。

$ docker network prune

WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y

デフォルトでは、確認プロンプトを表示します。このプロンプトを使わない場合は、 -f もしくは --force フラグを使います。

デフォルトでは、未使用ネットワークをすべて削除します。 --filter フラグを使うと、範囲を制限できます。たとえば、以下のコマンドは24時間より以前のネットワークのみを削除します。

$ docker network prune --filter "until=24h"

他にもフィルタリング表現が利用できます。その他の例は docker network prune リファレンス をご覧ください。

全てを prune

docker system prune コマンドは、イメージ、コンテナ、ネットワークを削除(prune)するショートカットです。 Docker 17.06.0 以下のバージョンでは、ボリュームも prune されました。Docker 17.06.1 以降では、 docker system prune でボリュームも削除するには --volumes フラグが必要になりました。

$ docker system prune

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N] y

Docker 17.06.1 以上でボリュームも削除したい場合は、 --volumes フラグを使います。

$ docker system prune --volumes

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N] y

デフォルトでは、確認プロンプトを表示します。このプロンプトを使わない場合は、 -f もしくは --force フラグを使います。

参考

Prune unused Docker objects
https://docs.docker.com/config/pruning/