はじめに
Dockerを普通に使っていると、停止状態のコンテナやdanglingなイメージ(REPOSITORYやTAGが<none>になっているもの)がたまっていきます。
これらを一括削除する方法をまとめてみました。
実行コマンド
不要なリソースすべて削除する (docker system prune)
何も考えずに、使われていないと思われるリソースを削除します。ローカルの開発環境であればこれが一番簡単です。
docker system prune | Docker Documentation
https://docs.docker.com/engine/reference/commandline/system_prune/
$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
d75069ae85738508edbbcb7027d0caff3174ac09629089462f7bdcafd0a56223
b342fa0ac8d3d5e75e403ad77940045a71e221865cb866f46140d1633249d6ba
Total reclaimed space: 8.402MB
Docker imageで不要なものを削除する (docker image prune)
どのコンテナからも参照されておらず、且つdanglingなイメージを削除します。
docker image prune | Docker Documentation
https://docs.docker.com/engine/reference/commandline/image_prune/
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
docker image pruneがなかった時代は、以下のようにコマンドを組み合わせていましたが、今となっては不要でしょう。
xargsの代わりに、シェルのコマンド置換(「$()」若しくはバッククォート「``」)を組み合わせたパターンもよく見ました。
$ docker images --filter "dangling=true" -q | xargs docker rmi
$ docker rmi `docker images --fileter "dangling=true" -q`
$ docker rmi $(docker images --fileter "dangling=true" -q)
停止状態のDocker containerをすべて削除する (docker container prune)
停止状態のコンテナ(STATUSがExitedかDeadのもの?)をすべて削除します。
docker container prune | Docker Documentation
https://docs.docker.com/engine/reference/commandline/container_prune/
Description
Remove all stopped containers
「stoppped」の定義が見つからなかったのですが、コマンドの挙動からおそらくSTATUSがExitedとDeadのコンテナが対象になるのではと思います。
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ba802702150e13e1b95d4868b1eabee1c929d37b38da548786b6f4872be056b4
3dbd0f7d84f6d918473e6e90b971af3bf1b0eb2ce3e524a5db1f00061517859f
Total reclaimed space: 4.201MB
docker container pruneがなかった時代は、以下のようなコマンドがよく使われていたと思います。
これも、xargsの代わりにシェルのコマンド置換(「$()」若しくはバッククォート「``」)を組み合わせたバリエーションがあります。
$ docker ps -q -a| xargs docker rm
$ docker rm `docker ps -q -a`
$ docker rm $(docker ps -q -a)
「-a」オプションをつけると、停止状態のコンテナも実行中のコンテナもすべて出力され、docker rmコマンドの対象となります。
実行中のコンテナを削除しようとしてもエラーになるので、結果として停止状態のコンテナのみが削除される、という動きになります。
補足:docker image/docker containerに関するコマンドの詳細
最近のdockerコマンドは、第一引数に「container」や「image」、「network」などを指定して実行できるように整理されており、何を対象とした操作なのかわかりやすくなっています。
「docker ps」や「docker container ls」は実質的に同じことを実行します。
しかしながら、公式ドキュメントは古いほうのコマンドの説明しか詳細に書いていなかったりするので、探すときには注意が必要です。
Docker image lsの詳細
「docker images」に詳細が記載してあります。
docker images | Docker Documentation
https://docs.docker.com/engine/reference/commandline/images/
Docker container lsの詳細
「docker ps」に詳細が記載してあります。
docker ps | Docker Documentation
https://docs.docker.com/engine/reference/commandline/ps/