イメージを掃除する - docker images / docker system prune
ローカルのイメージ一覧と、使われていないリソースの一括削除。ビルドを繰り返していると数十 GB に膨らむので、定期的に掃除する。
概念図
構文
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker system prune [OPTIONS]実例
リポジトリ名とサイズを表形式で表示
docker images --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}"確認なしで停止コンテナ・ぶら下がりイメージ等を削除
docker system prune -f使われていないイメージとボリュームまで含めて全削除
docker system prune -a --volumesイメージ一覧と容量
docker images はローカルのイメージを表示する。
REPOSITORY、TAG、IMAGE ID、CREATED、SIZE の列で、どのタグがどれだけディスクを食っているか一目でわかる。
-a を付けると中間レイヤーも表示されるが、実運用でそこまで見ることは少ない。
より正確な使用量は docker system df で確認する。
Images、Containers、Local Volumes、Build Cache の 4 カテゴリで TOTAL / ACTIVE / RECLAIMABLE を出す。
RECLAIMABLE は prune で回収できる量。
docker system df -v で個別のボリューム・イメージの内訳まで出せる。
docker images
docker system df
docker system df -v`docker system prune` で掃除
docker system prune は停止済みコンテナ、使われていないネットワーク、ぶら下がり(dangling)イメージ、未使用のビルドキャッシュをまとめて削除する。
-a を追加すると、どのコンテナからも参照されていないイメージまで消す(積極的に空き容量を作りたいとき向け)。
--volumes でボリュームも対象になる。
削除される「ぶら下がりイメージ」とは、タグが剥がれた(例: 同じタグで再ビルドした旧イメージ)ものを指す。
これは大半のケースで不要。
一方 -a で消えるのは「どのコンテナからも参照されていないイメージ」なので、開発中に docker run で一度も起動していないイメージが含まれる。
その場合、次回 pull 時間が延びる点に注意。
docker system prune
docker system prune -a
docker system prune -a --volumes自動削除の CI への組み込み
セルフホスト GitHub Actions Runner や Jenkins エージェントで Docker ビルドを繰り返すと、ディスクが即座に枯渇する。
ジョブの最後に docker system prune -f --volumes を仕込むか、ホストの cron で毎晩実行するのが定番。
--filter "until=24h" を付けると 24 時間より古いものだけ消せるので、直近のキャッシュは残せる。
Kubernetes 上の Runner を使う場合は、コンテナ内からホストの Docker を触る dind(Docker in Docker)のレイヤがホストに蓄積する点に注意。
containerd レベルでも crictl rmi --prune 等が必要になる。
どちらにせよ「気づいたら 500GB 埋まっていた」を防ぐには監視とアラートを設定する。
# GitHub Actions self-hosted cleanup step
- name: Prune Docker
if: always()
run: docker system prune -f --volumes --filter "until=24h"関連トピック
docker build- Dockerfile からイメージをビルドするコマンド。ビルドコンテキスト、`-f` の Dockerfile 指定、`-t` のタグ付け、BuildKit のキャッシュ最適化、`--target` によるマルチステージ制御を押さえる。 docker run- イメージから新しいコンテナを起動するコマンド。`-d` でバックグラウンド化、`-p` でポート公開、`-v` でボリュームマウント、`--name` で名前付けなど、日常的に使うオプションを押さえておく。 docker volume / bind mount- データ永続化の基本。Docker が管理する volume と、ホスト側の任意パスを使う bind mount の違い、`:ro` / `:z` / `:Z` オプション、パーミッション問題の対処を整理する。 