
Docker容量削減の完全ガイド【system prune・イメージ削除・ボリューム掃除】
Dockerを使い続けると、気づかないうちにディスク容量が逼迫していく。「MacBookのSSDがいっぱいになってきた」「docker system dfを見たら20GB以上も消費している」という経験をしたことがあるエンジニアは多いはずだ。
このガイドでは、Dockerによるディスク圧迫を安全に・確実に解消するための手順を体系的に解説する。闇雲にdocker system pruneを実行して必要なコンテナを消してしまった失敗談も含めながら、段階的なアプローチを紹介する。
筆者自身、以前は28イメージ・32コンテナが溜まり、合計約20GBを消費していた状態から、この手順で不要な約10GBを安全に回収した実績がある。

前提条件
このガイドを進める前に、以下の確認をしておこう。
-
OS: macOS / Linux(WindowsのWSL2でも同様)
-
必要なツール: Docker Desktop または Docker Engine
-
前提知識: コマンドライン基本操作
# Dockerバージョン確認
docker --version
# 期待する出力: Docker version 24.0.0 以上推奨
# Docker動作確認
docker ps
重要な前提: docker system pruneは停止中のコンテナ・未使用ネットワーク・ダングリングイメージをまとめて削除する強力なコマンド。開発中データがコンテナ内にある場合は必ずバックアップを取ること。
全体の流れ
このガイドは以下の4ステップで構成されている。
-
現状把握:何がどれだけ使っているか確認 — 5分
-
コンテナのお掃除 — 5〜10分
-
イメージのお掃除 — 5〜10分
-
ボリューム・ビルドキャッシュの掃除 — 5分
ステップ1: 現状把握 — docker system df
まず現状を把握することが大切だ。「何がどれだけディスクを使っているか」を知らずに削除を進めると、必要なものまで消してしまうリスクがある。
docker system df で全体像を確認
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 28 18 13.94GB 8.228GB (59%)
Containers 32 0 310.6MB 310.6MB (100%)
Local Volumes 18 15 6.053GB 55.67MB (0%)
Build Cache 0 0B 0B
この出力の読み方は以下の通り:
|
カラム
| 意味
|
| TOTAL
| 存在するリソースの総数
|
| ACTIVE
| 現在稼働中・使用中のリソース数
|
| SIZE
| 実際に消費しているディスク容量
|
| RECLAIMABLE
| 削除可能な容量(不要リソース分)
|
上の例では:
– Images: 28枚中10枚が未使用(RECLAIMABLE = 8.228GB)
– Containers: 32個中32個が停止済み(全部削除候補)
– Volumes: 18個中3個が未使用(ただし55.67MBとわずか)
より詳細な情報を確認
-v(verbose)オプションを付けると、各イメージ・コンテナ・ボリュームの詳細が出る。
$ docker system df -v
出力が長くなるため、パイプでlessに渡すと見やすい:
$ docker system df -v | less
✅ ステップ1完了の確認: RECLAIMABLEの数値を確認し、どのカテゴリに余分な容量があるか把握できた。
ステップ2: コンテナのお掃除
コンテナを先に掃除しないとイメージの削除ができないケースがある。イメージは使用中のコンテナが参照していると削除できないためだ。
停止中コンテナを確認する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
f79dce728424 testimage "./entrypoint.sh fo…" 3 days ago Exited (0) 13 hours ago testimage_main_1
76872818483a postgres:9.6.8 "docker-entrypoint.s…" 5 days ago Exited (0) 9 hours ago testimage_postgres_1
568ea94a14ce ruby:latest "bash" 7 seconds ago Exited (0) 4 seconds ago quizzical_keller
ゴミコンテナの見分け方:
– STATUSがExited(停止済み)になっている
– NAMESがランダムな英単語の組み合わせ(例: quizzical_keller)— docker run時に--nameを指定しなかった場合に自動付与される
– 自分のプロジェクトに関係ないイメージ名(ruby:latestをさっと試した等)
ゴミコンテナを個別に削除
# 1つずつ削除(確実に不要なものだけ)
docker rm quizzical_keller
# 複数同時削除
docker rm quizzical_keller nervous_turing hopeful_darwin
# コンテナIDで削除(IDの最初の数文字でOK)
docker rm 568ea
停止中コンテナを一括削除
すべての停止中コンテナが不要な場合は一括削除が便利:
# 停止中コンテナを全部削除
docker container prune
# WARNING! This will remove all stopped containers.
# Are you sure you want to continue? [y/N] y
# Deleted Containers:
# 568ea94a14ce...
# Total reclaimed space: 310.6 MB
注意: docker container pruneは停止中の全コンテナを削除する。開発中でデータをコンテナ内に持つ場合(ボリュームを使っていない場合)はデータが消える。
✅ ステップ2完了の確認: docker ps -aで停止中コンテナが減っていることを確認。
ステップ3: イメージのお掃除
イメージはDockerリソースの中で最も容量を食う。1つのイメージで1GB以上になることも珍しくない。
現在のイメージ一覧を確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gendosu/ruby-for-rails-51 latest d965e266133e 3 days ago 1.51GB
gendosu/ruby-for-rails latest ff582c44e421 3 days ago 1.13GB
ruby latest 677dc4db9b8f 3 days ago 869MB
9b8b253b1050 7 weeks ago 245MB
postgres 9.6.8 ee7bf928a9ff 2 months ago 266MB
postgres latest 30121e967865 2 months ago 289MB
debian latest 2b98c9851a37 2 months ago 100MB
削除候補の見分け方:
– REPOSITORYがのもの — **ダングリングイメージ**と呼ばれるゴミ。`docker build -t`で新しいイメージを作る際、同じタグを使い回すと古いイメージがタグを失ってになる
– 古い日付のもので使っていないもの
– 古いpostgresバージョン(postgres:9.6.8など)で本番では使っていないもの
ダングリングイメージを一括削除
# ダングリングイメージ(のもの)を一括削除
$ docker images -f 'dangling=true' -q | xargs -n 1 docker rmi
Deleted: sha256:c4a0d4e62e283edb45934825783689238f13f1c46a676f198e48ad3312f6b731
Deleted: sha256:0983a6ff44939438b44f20b2e90a39fe5d57c32863acf509696fdbf5c2ec3aa3
Deleted: sha256:ae872920f79994777b850b58ca0bc9d7650edbb303d649e5ba0198bcd2c32206
# ...(続く)
このコマンドの解説:
– docker images -f 'dangling=true' — “イメージのみを絞り込み
– -q — IMAGE IDのみを出力
– xargs -n 1 docker rmi — 1つずつdocker rmiに渡して削除
使っていないイメージを個別に削除
# リポジトリ名:タグで指定
docker rmi postgres:9.6.8
# IMAGE IDで指定(最初の数文字でOK)
docker rmi ee7bf9
# 複数同時削除
docker rmi postgres:9.6.8 debian:latest
よくあるエラー: Error response from daemon: conflict: unable to delete... image is being used by running container
→ そのイメージを使っているコンテナが起動中。先にコンテナを停止(docker stop)してから削除する。
未使用イメージを一括削除(より強力)
# コンテナから参照されていない全イメージを削除
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]

✅ ステップ3完了の確認: docker imagesでイメージ一覧を確認し、`が消えていることを確認。docker system df`で回収容量が増えていることを確認。
ステップ4: ボリューム・ビルドキャッシュの掃除
ボリュームの掃除
ボリュームは永続化データのため、削除には注意が必要。コンテナから参照されていない孤立ボリュームのみ削除する。
# 未使用ボリューム一覧を確認
$ docker volume ls
DRIVER VOLUME NAME
local myapp_postgres_data
local myapp_redis_data
local 3f8a2c1d... ← コンテナ名なし = 孤立ボリューム候補
# 孤立ボリュームを削除
docker volume prune
# WARNING! This will remove anonymous local volumes not used by at least one container.
# Are you sure you want to continue? [y/N]
重要: docker volume pruneはコンテナから未参照のボリュームを削除するが、DBデータ等が入っている場合は消えてしまう。削除前にdocker volume inspectで中身を確認することを強く推奨する。
ビルドキャッシュの掃除
docker build時に作成されるキャッシュ。古いキャッシュは安全に削除できる。
# ビルドキャッシュの削除
docker builder prune
# 全ビルドキャッシュを削除(より徹底的)
docker builder prune -a
✅ ステップ4完了の確認: docker system dfを再実行し、全体の容量が削減されていることを確認。
応用編: docker system pruneで一括掃除
段階的な削除が面倒な場合、docker system pruneで一括掃除できる。ただし、リスクを理解した上で使用すること。
基本的なdocker 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
削除対象:
– 全停止中コンテナ
– 未使用ネットワーク
– ダングリングイメージ(“のもの)
– ダングリングビルドキャッシュ
注意: デフォルトでは未使用イメージは削除しない(ダングリングのみ)。
より徹底的な掃除(–allオプション)
$ docker system prune -a
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all images without at least one container associated to them
- all build cache
-aを付けるとコンテナから参照されていない全イメージも削除される。ローカル開発環境のクリーンアップに最適だが、プルに時間がかかるイメージも消えてしまう。
ボリュームも含めて全部消す
$ docker system prune -a --volumes
# 上記 + 未使用ボリュームも全て削除
⚠️ 最大の注意点: --volumesを付けるとDBデータなど永続化データも削除される。本当にクリーンな状態からやり直したい場合以外は使わないこと。
alias登録で日常的なメンテナンスを楽にする
定期的にDockerを掃除したい場合、よく使うコマンドをaliasに登録しておくと便利だ。
# ~/.bashrc または ~/.zshrc に追記
# ダングリングイメージを削除
alias docker-clean-images="docker images -f 'dangling=true' -q | xargs -n 1 docker rmi"
# 停止コンテナを削除
alias docker-clean-containers="docker container prune -f"
# ディスク使用量を確認
alias docker-df="docker system df"
# 全部まとめて(停止コンテナ + ダングリングイメージ + 未使用NW)
alias docker-clean="docker system prune -f"
設定反映:
source ~/.bashrc # または source ~/.zshrc
トラブルシュート
|
症状
| 原因
| 解決策
|
| image is being used by running containerでイメージ削除できない
| コンテナが起動中
| docker stopで停止後に削除
|
| volume is in useでボリューム削除できない
| ボリュームを使用するコンテナが存在する
| docker ps -aでコンテナを確認し削除してからボリューム削除
|
| docker system prune後にビルドが遅くなった
| ビルドキャッシュが消えた
| 初回は時間がかかるが次回から通常速度に戻る
|
| docker system dfでBuild Cacheが大きい
| マルチステージビルドのキャッシュ蓄積
| docker builder pruneでキャッシュのみ削除
|
まとめ
このガイドでは、Dockerのディスク容量を安全に削減するための手順を解説した。
-
ステップ1 (現状把握):
docker system dfでRECLAIMABLE容量を確認 -
ステップ2 (コンテナ掃除):
docker ps -aでゴミコンテナを特定しdocker rmまたはdocker container pruneで削除 -
ステップ3 (イメージ掃除): ダングリングイメージを
docker images -f 'dangling=true' -q | xargs docker rmiで削除 -
ステップ4 (ボリューム・キャッシュ):
docker volume pruneとdocker builder pruneで残りを整理
まずはdocker system dfで現状を確認することから始めよう。段階的な削除で安全に空き容量を回収できる。
慣れてきたら定期的にdocker system pruneを実行する習慣をつけると、ディスク圧迫問題が起きにくくなる。





