使用していない 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/