suin.io

Dockerの不要なコンテナ・イメージを一括削除する方法

suin2016年7月29日

Dockerを使っていると不必要なコンテナやイメージが溜まってきます。もちろん、それらを放置していても問題はありません。しかし、コンテナやイメージの容量によってはディスクを圧迫するため、使わないものは一括して削除するメンテナンスをときどき行ないたいところです。

「Docker イメージ 削除」などで検索すれば、イメージをまとめて消去する方法が出てきますが、今となっては一括削除の方法がドキュメントにも載っているのに1、古いDockerバージョンを想定したgrepawkを使う方法が出てきたりと、情報が錯綜しているのが現状かと思います。

また、紹介されているコマンドが自分の目的にあっていなくて、残したいものまで削除したり、消したいものが消せてなかったりします。

本稿では、できるだけ公式ドキュメント等の最新情報に注意しつつ、目的に応じた削除方法をいくつか紹介したいと思います。なお、Dockerバージョンは1.12.0を想定しています。

削除は「まずコンテナ、次にイメージ」の順序で

最近のDockerでは、いきなりイメージを削除しようとしても、そのイメージをコンテナが使っていると削除できません。コンテナが使っているとは、そのイメージを指定して起動したコンテナがあるかどうかで、コンテナが起動している・停止しているは関係ありません。

停止したコンテナはdocker psコマンドに-aオプションを追加することで見ることができますが、オプションを省くと隠れてしまうので、停止したコンテナの存在は忘れがちです。

参照されているイメージを削除しようとするとエラーになります。従って、不要なものの削除は「まずコンテナ、次にイメージ」の順序で行うのが、エラーに遭遇することが少なくスムーズに作業できると言えます。

停止しているコンテナをすべて削除する

docker container prune

Docker 1.13以降のバージョンでは上のコマンドを実行するだけです。それより古いバージョンは:

docker rm $(docker ps -a -q)

このコマンドはコンテナのうち、プロセスが終了したもの、docker stopで停止されたものをまとめて削除します。起動中のコンテナやpausedステータスのコンテナは、エラーになり削除されません。このとき表示されるエラーは無視して構いません。

使われていないボリュームをすべて削除する

docker volume prune

Docker 1.13以降であれば、どのコンテナからも使われていないボリュームの削除はこれでできます。

コンテナをすべて削除する

docker rm -f $(docker ps -a -q)

すべてのコンテナが「不要」だと判断した場合に使えるコマンドです。このコマンドは、コンテナを問答無用で全て削除します。起動しているコンテナも削除されるので注意が必要です。

コンテナが使っていないイメージをすべて削除する

docker image prune

Docker 1.13以降のバージョンでは上のコマンドを実行するだけです。それより古いバージョンは:

docker rmi $(docker images -q)

コンテナに使われていないイメージのみ一括削除するコマンドです。走っている・止まっているに関係なくコンテナが参照しているイメージは削除されません。このとき削除されないイメージについてはエラーになりますが、このエラーは無視して構いません。

タグがついていないイメージをすべて削除する

docker rmi $(docker images -f 'dangling=true' -q)

ビルドを繰り返すことでタグが外れたイメージは、docker imagesコマンドで<none>:<none>で表示されますが、このコマンドはそれらイメージのうちコンテナからも参照されていないものを削除します。

Docker 0.12.0までは-f(--filter)オプションが無かったため、タグが外れたイメージを絞り込むのにawkgrepで頑張る必要がありましたが、最近のDockerではその必要はありません。

消えない<none>:<none>イメージはコンテナを先に削除する

タグがついていないイメージでも、コンテナが参照している場合があります。ひとつでもコンテナに参照されているイメージは、docker rmiしてもError response from daemon: conflict: unable to delete b63d4920177f (must be forced) - image is being used by stopped container a2ec6ad23d0bのようなエラーが発生して削除することができません。この場合は、先に参照しているコンテナを削除しておきます。

停止コンテナ・未利用イメージ・未利用ボリュームを一括削除する

docker system prune

Docker 1.13以降では上のコマンドで次を一括削除できます。

  • 停止しているコンテナすべて
  • どのコンテナからも使われていないボリュームコンテナすべて
  • どのコンテナとも紐付いていないイメージすべて

おわり

Dockerで目的別にコンテナやイメージの一括削除方法を紹介しました。

RELATED POSTS