🐳

Docker image, containerのお掃除方法

2023/02/20に公開

概要

  • 開発環境でDockerを利用していると知らない間にゴミが溜まってきたりするので掃除する方法を紹介します。
  • Dockerに割り当てられているディスク容量が足りなくなったり、PC自体のディスク容量が不足すると no space left on device といったエラーが出るようになります。

掃除前

docker system df コマンドでどのくらいのディスク容量を使っているかを表示できます。

% docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          95        53        55.52GB   36.55GB (65%)
Containers      571       0         6.355GB   6.355GB (100%)
Local Volumes   95        38        9.812GB   1.456GB (14%)
Build Cache     927       0         19.06GB   19.06GB

約89GB使っています。

掃除方法

必要に応じて実行してください。下に行けば行くほどより強力な掃除になります。

(コマンド体系はBSHです)

コンテナから参照されていないボリュームを削除

% docker volume rm $(docker volume ls -qf dangling=true)

1週間以上使っていないコンテナの削除をします。

% docker container prune --force --filter "until=168h"

1週間以上前に停止したコンテナの削除

% docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

宙ぶらりんなイメージを削除

タグが打たれていなかったり、ビルド途中でエラーになってしまったイメージを削除します。

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

Build cacheの削除

ビルド途中の中間イメージの削除

% docker builder prune

全コンテナの削除

※実行注意

$ docker rm $(docker ps -aq)

全イメージの削除

※実行注意

以下のいずれかを実行します。同義です。イメージを消すためには関連するコンテナが存在しない状態でなければ消せません。

% docker rmi $(docker images -q)
% docker image prune

全てのデータを削除

※実行注意

停止中のコンテナ、ボリューム、ネットワーク、イメージを一括削除するコマンドです。

ほぼDockerのリセットと同義です。

% docker system prune 

掃除後

% docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          61        5         37.26GB   36.23GB (97%)
Containers      13        0         78.64MB   78.64MB (100%)
Local Volumes   38        6         8.356GB   4.673GB (55%)
Build Cache     405       0         0B        0B

約35GBになりました。

まとめ

  • 半年ぐらい運用した手元の環境ではDockerの使用容量が89GBから35GBになりました。
  • 最後の3つのコマンド以外を実行しています。
    • 以下のコマンドをシェルスクリプトにして、定期的に実行するとかしておけば良いかなと思います。
#!/usr/bin/env bash

set -Eeuo pipefail

docker volume rm $(docker volume ls -qf dangling=true)
docker container prune --force --filter "until=168h"
docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
docker rmi $(docker images -f "dangling=true" -q)
docker builder prune
株式会社マインディア テックブログ

Discussion