Docker容量削減の完全ガイド【system prune・イメージ削除・ボリューム掃除】

2018年5月29日


Dockerを使い続けると、気づかないうちにディスク容量が逼迫していく。「MacBookのSSDがいっぱいになってきた」「docker system dfを見たら20GB以上も消費している」という経験をしたことがあるエンジニアは多いはずだ。

このガイドでは、Dockerによるディスク圧迫を安全に・確実に解消するための手順を体系的に解説する。闇雲にdocker system pruneを実行して必要なコンテナを消してしまった失敗談も含めながら、段階的なアプローチを紹介する。

筆者自身、以前は28イメージ・32コンテナが溜まり、合計約20GBを消費していた状態から、この手順で不要な約10GBを安全に回収した実績がある。

Dockerのディスク使用量管理ツール - docker system dfコマンドのイメージ図


前提条件

このガイドを進める前に、以下の確認をしておこう。

  • OS: macOS / Linux(WindowsのWSL2でも同様)

  • 必要なツール: Docker Desktop または Docker Engine

  • 前提知識: コマンドライン基本操作

# Dockerバージョン確認
docker --version
# 期待する出力: Docker version 24.0.0 以上推奨

# Docker動作確認
docker ps

重要な前提: docker system pruneは停止中のコンテナ・未使用ネットワーク・ダングリングイメージをまとめて削除する強力なコマンド。開発中データがコンテナ内にある場合は必ずバックアップを取ること。


全体の流れ

このガイドは以下の4ステップで構成されている。


ステップ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

ゴミコンテナの見分け方:

STATUSExited(停止済み)になっている

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]

ダングリングイメージの削除前後比較 - docker images コマンドのビフォーアフター

ステップ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 prunedocker builder pruneで残りを整理

まずはdocker system dfで現状を確認することから始めよう。段階的な削除で安全に空き容量を回収できる。

慣れてきたら定期的にdocker system pruneを実行する習慣をつけると、ディスク圧迫問題が起きにくくなる。


関連記事