DockerDocker [ドッカー]コンテナ型仮想化プラットフォームを使って日々の開発や検証を続けていると、マシンのディスク容量が急速に消費され、空き容量不足(no space left on device など)に直面することがあります。
これは、停止したコンテナやビルドの過程で生成された中間イメージ、不要になったボリュームやビルドキャッシュがローカル環境に蓄積されることが主な原因です。
このような不要なリソースを安全かつ効率的にクリーンアップする仕組みが、Docker標準の docker prune コマンド です。本記事では、システム全体を一括削除する docker system prune の使い方から、リソース別の個別削除、誤削除を防ぐフィルタリングや安全運用のポイントまで詳しく解説します。
Dockerの容量確認:pruneを実行する前に現状を把握する
不要リソースを削除する前に、まずどのリソースがどれだけの容量を消費しているかを確認することが重要です。
docker system df でリソース別の使用量を確認
Docker全体のディスク消費状況を確認するには、 docker system df コマンドを使用します。
docker system dfコマンドを実行すると、以下のようにリソース別の合計サイズや解放可能容量(RECLAIMABLE)が出力されます。
TYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 12 3 4.82GB 3.15GB (65%)Containers 8 2 215MB 180MB (83%)Local Volumes 5 2 1.24GB 850MB (68%)Build Cache 42 0 2.10GB 2.10GB (100%)各列の意味は次のとおりです。
- TYPE: リソースの種類(Images: イメージ、Containers: コンテナ、Local Volumes: ボリューム、Build Cachecache [キャッシュ]データを一時的に保存しアクセスを高速化する仕組み: ビルドキャッシュ)
- TOTAL: Dockerが管理しているリソースの総数
- ACTIVE: アクティブなリソースの数
- SIZE: リソースが使用している容量
- RECLAIMABLE: Dockerが削除可能と判定している容量の目安と割合
上記例では、Build Cache や未使用イメージだけで 5GB 以上のディスク領域が解放可能であることがわかります。
docker system df -v で詳細一覧を表示
どのイメージやコンテナが肥大化しているかを個別に特定したい場合は、詳細表示オプション -v(verboseverbose [バーボース]詳細なログ出力モード。または冗長なコード)を付与します。
docker system df -vイメージの作成日時やサイズ、共有サイズ、固有サイズ、イメージのタグ一覧などに加え、コンテナの作成日時やサイズなども詳細に出力されるため、削除対象の見極めに役立ちます。
イメージの詳細表示では、共有レイヤーの容量(SHARED SIZE)とそのイメージ固有の容量(UNIQUE SIZE)も確認できます。複数のイメージがレイヤーを共有している場合、SIZE の単純合計は実際のディスク使用量とは一致しません。
docker system prune の使い方(不要リソースを一括削除)
docker system prune は、使われていない複数のDockerリソースをまとめて一括削除する最も手軽なコマンドです。ただし、オプションによって削除される範囲が大きく異なるため、仕様を正確に把握しておく必要があります。
デフォルトの 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 - unused build cache
Are you sure you want to continue? [y/N]キーボードで y を入力して Enter を押すと、削除処理が実行され、解放された合計サイズが表示されます。
デフォルトの docker system prune で削除されるリソースは以下の4つです。
- すべての停止中のコンテナ(stopped containers)
- どのコンテナにも使用されていないネットワーク(unused networks)
- ダングリングイメージ(dangling images): タグが付いておらず、どのコンテナからも参照されていないイメージ。新しいビルドなどで既存のタグが別のイメージに付け替えられた場合に発生することがあります
- 未使用のビルドキャッシュ(unused build cache)
注意: デフォルトの実行では、 タグ名が付いている未使用イメージ や ボリューム(Volume) は削除されません。
docker system prune -a(—all)で未使用の全イメージも削除
ベースイメージ(UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューションやNode.jsなど)をダウンロードしたものの、現在はどのコンテナからも利用していないタグ付きイメージを削除したい場合は、 -a(または --all)オプションを指定します。
docker system prune -aこのオプションを付与すると、ダングリングイメージだけでなく、 「現在稼働中・停止中のいずれのコンテナからも参照されていないすべてのイメージ」 が削除されます。
長期間メンテナンスしていない環境で数GB〜数十GBの空き容量を回復させたい場合に効果的です。ただし、次回 docker compose up や docker run を実行する際にイメージの再ダウンロード(pull)が必要になる点に留意してください。
docker system prune --volumes で未使用の匿名ボリュームも削除
デフォルトでは、Dockerのボリュームは prune の対象外です。検証用に作成した不要な匿名ボリュームも削除したい場合は、 --volumes オプションを追加します。
docker system prune --volumesこのオプションで削除されるのは、 どのコンテナからも参照されていない匿名ボリューム です。未使用の名前付きボリュームも含めて削除したい場合は、後述の docker volume prune -a を使用します。
未使用イメージ( -a )と未使用の匿名ボリューム( --volumes )をまとめて削除したい場合は、両方のオプションを併用します。
docker system prune -a --volumesWARNING! This will remove: - all stopped containers - all networks not used by at least one container - all anonymous volumes not used by at least one container - all images without at least one container associated to them - all build cache
Are you sure you want to continue? [y/N]警告:
--volumesを指定すると、いずれのコンテナからも参照されていない匿名ボリューム内のデータはすべて消去されます。なお、どのコマンドでもコンテナ(稼働中・停止中を含む)から参照されているボリュームは削除されませんが、実行前に削除対象をよく確認してください。
-f(—force)で確認プロンプトをスキップする
CI/CDCI/CD [シーアイシーディー]継続的インテグレーション/継続的デリバリーパイプラインやシェルスクリプトなどの自動バッチ処理で確認プロンプト([y/N])を止めずに実行したい場合は、 -f(または --force)オプションを付与します。
docker system prune -f対話なしで即座に削除処理が実行されるため、スクリプトに組み込む際は指定オプションに間違いがないか事前に十分確認してください。
リソース別の個別 prune コマンド
「停止中コンテナだけを消したい」「ビルドキャッシュだけを削除したい」といった場合は、リソースごとの prune サブコマンドを使用します。対象を絞ることで、安全かつピンポイントにディスク容量を整理できます。
停止済みコンテナのみ削除:docker container prune
停止状態(Exited)になっているコンテナのみを一括削除します。実行中のコンテナには一切影響を与えません。
docker container prune未使用イメージのみ削除:docker image prune
コンテナから参照されていないイメージのみを削除します。
# タグが <none> のダングリングイメージのみ削除(デフォルト)docker image prune
# コンテナから参照されていないタグ付きイメージも含めて全削除docker image prune -a未使用ボリュームのみ削除:docker volume prune
現在どのコンテナからも参照されていない匿名ボリュームを削除します。名前付きボリュームも削除対象に含めたい場合は、 -a (または --all )オプションを指定します。
# 未使用の匿名ボリュームを削除docker volume prune
# 未使用の匿名・名前付きボリュームを削除docker volume prune -aなお、名前付きボリュームは、コンテナから参照されていなくてもデフォルトでは保持されます。docker compose down の際に -v を付け忘れて残ってしまった匿名ボリュームの掃除には docker volume prune が役立ちます。
※ -a ( --all )オプションは Docker Engine APIAPI [エーピーアイ]Application Programming Interface。異なるソフトウェア間の接続口 1.42 以降で利用できます。古いバージョンでは使用できない場合があります。
未使用ネットワークのみ削除:docker network prune
カスタム定義したブリッジネットワークなどで、現在どのコンテナにも接続されていないものを削除します。
docker network prune※Dockerが標準で用意しているシステムネットワーク(bridge、host、none)は削除対象になりません。
ビルドキャッシュのみ削除:docker builder prune
Dockerfileのビルド時に蓄積される中間レイヤーのキャッシュ(BuildKitキャッシュ)を削除します。
docker builder pruneソースコードの更新が頻繁でビルドキャッシュが数GB単位で肥大化している場合、イメージ本体を消さずにキャッシュ領域だけをクリアできます。
安全にpruneを行うための実践テクニック
無計画に prune を実行すると、必要な開発用データや設定が失われるリスクがあります。安全に運用するための実践的なテクニックを紹介します。
--filter オプションで期間やラベルを指定して削除
prune コマンドの多くは、 --filter オプションをサポートしています。フィルタを使用すると、作成日時やラベルなどの条件を指定して削除対象を絞り込めます。なお、 -f は --force の省略形であり、確認プロンプトをスキップするためのオプションです。
例1: 作成から24時間以上経過した停止中コンテナのみ削除
docker container prune --filter "until=24h"直前に停止したばかりのコンテナ(デバッグ中や再起動予定のもの)を残し、丸1日以上放置されている古いコンテナだけを自動クリーンアップできます。
例2: 特定のラベルが付いたリソースのみ削除
docker container prune --filter "label=environment=test"開発環境やテスト環境専用のコンテナにラベルを付与しておくことで、他の環境のリソースを巻き込まずに削除できます。
名前付きボリュームの管理とデータ保護
Dockerボリュームには、ハッシュ値のようなランダムな文字列が割り振られる「匿名ボリューム」と、ユーザーが明示的に名前を指定する「名前付きボリューム」があります。
データベースなどの永続化データには、名前付きボリュームを使用すると管理しやすくなります。ただし、名前付きボリュームであっても、 docker volume prune -a などによって削除される可能性があります。重要なデータは定期的にバックアップを取得し、バックアップから復元できることも確認しておきましょう。
volumes: db_data: name: my_app_db_data自動化スクリプトでの定期メンテナンス
開発マシンやステージングサーバーで定期的にクリーンアップを行う場合、croncron [クーロン / クロン]Unix系システムにおいて、設定したスケジュールで自動的にコマンドを実行するデーモン やタスクスケジューラに以下のようなコマンドを登録して運用することがあります。
# 72時間(3日)以上前に作成されたコンテナ・イメージ・ネットワークと未使用ビルドキャッシュを削除(ボリュームは対象外)docker system prune --all --force --filter "until=72h"docker system prune の until フィルタは、コンテナ・イメージ・ネットワークの作成日時を基準に削除対象を絞り込むために使用できます。ただし、 ビルドキャッシュにはこのフィルタが適用されません 。そのため、上記コマンドを実行すると、作成日時にかかわらず未使用のビルドキャッシュも削除対象になります。
なお、 docker system prune ではラベルによる絞り込みも可能ですが、ラベルフィルタの適用対象はコンテナ・イメージ・ネットワーク・ボリュームです。ビルドキャッシュには適用されません。
ビルドキャッシュを保持したい場合や、ビルドキャッシュのみ作成日時で絞り込みたい場合は、 docker system prune ではなく対象を個別に指定してクリーンアップする運用を検討してください。
# 72時間以上使用されていないビルドキャッシュを削除docker builder prune --filter "until=72h"
# すべての未使用ビルドキャッシュを対象にする場合は -a を併用docker builder prune -a --filter "until=72h"なお、 docker builder prune はデフォルトではダングリング状態のビルドキャッシュが対象です。すべての未使用ビルドキャッシュを対象にする場合は -a を併用します。
まとめ:適切なpruneでDocker環境を快適に保とう
Dockerの prune コマンドは、ディスク容量の逼迫を解消し、快適なコンテナ運用環境を維持するためのツールです。
最後に、主なコマンドと削除対象の違いを一覧表で整理します。
| コマンド | 停止中コンテナ | ダングリングイメージ | タグ付き未使用イメージ | 未使用匿名ボリューム | 未使用名前付きボリューム | ネットワーク | ビルドキャッシュ |
|---|---|---|---|---|---|---|---|
docker system prune | ◯ | ◯ | × | × | × | ◯ | ◯ |
docker system prune -a | ◯ | ◯ | ◯ | × | × | ◯ | ◯ |
docker system prune --volumes | ◯ | ◯ | × | ◯ | × | ◯ | ◯ |
docker system prune -a --volumes | ◯ | ◯ | ◯ | ◯ | × | ◯ | ◯ |
docker container prune | ◯ | × | × | × | × | × | × |
docker image prune | × | ◯ | × | × | × | × | × |
docker image prune -a | × | ◯ | ◯ | × | × | × | × |
docker volume prune | × | × | × | ◯ | × | × | × |
docker volume prune -a | × | × | × | ◯ | ◯ | × | × |
※ ◯は削除対象、×は対象外です。ボリュームは、いずれかのコンテナから参照されている場合は削除されません。
※ docker system prune のビルドキャッシュは、未使用のものが削除対象です。until フィルタによる期間指定は適用されません。
まずは docker system df で現状の使用量を確認し、目的に応じた適切なオプションを選んで安全に容量を解放しましょう。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
実践的な開発環境構築に特化。設定ファイルの書き方など、すぐに使える知識が豊富です。