未使用 Docker オブジェクトの取り除き

読む時間の目安: 2 分

Docker では未使用となったオブジェクトを取り除くために、従来どおりの(”ガベージコレクション” と呼ばれる)方法をとっています。 オブジェクトは、イメージ、コンテナー、ボリューム、ネットワークなどです。 こういったオブジェクトは、Docker に対して明示的に削除の指示を出さない限り、普通は削除されません。 こういった場合、Docker が余計なディスク容量を消費することにもつながります。 そこで Docker では、オブジェクトごとにpruneコマンドが提供されています。 さらにdocker system pruneを使えば、複数タイプのオブジェクトを一度に取り除くことができます。 ここでは、そういったpruneコマンドの利用方法について示します。

イメージの取り除き

docker image pruneコマンドは未使用イメージを取り除くものです。 デフォルトでdocker image prune「浮いている」(dangling)イメージのみを対象とします。 ここで「浮いている」イメージとは、タグづけがされておらず、どのコンテナーからも参照されていないものを指します。 「浮いている」イメージを削除するには以下を行います。

$ 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フラグによるフィルター表現を指定することができます。 たとえば、生成されてから 24 時間以上経過したイメージを対象とする場合は、以下のようにします。

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

フィルター表現は他にもあります。 さまざまな例については docker image 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リファレンス を参照してください。

ボリュームの取り除き

ボリュームは複数のコンテナーにおいて利用できるものです。 したがって 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リファレンス を参照してください。

ネットワークの取り除き

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リファレンス を参照してください。

すべての取り除き

docker system pruneコマンドは、イメージ、コンテナー、ネットワークを取り除くコマンドを合わせたものです。 ボリュームはデフォルトでは取り除かれません。 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

ボリュームも取り除きたい場合は--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フラグを用います。

pruning, prune, images, volumes, containers, networks, disk, administration, garbage collection