スキップしてメイン コンテンツに移動

【Day 15】不要なコンテナ・イメージの一括掃除(docker system prune) 〜肥大化したSSD容量を劇的に回復〜

Day 15 アイキャッチ
▲ Day 15: 不要なコンテナ・イメージの一括掃除(docker system prune)
🐳
皆さん、こんにちは! Docker/コンテナ実践講座の専任講師です。
前回【Day 14】では、docker exec -it による稼働中コンテナへの潜入デバッグと、C#アプリケーションの内部検証術をマスターしました。
第3部の締めくくりとなる本日は、コンテナ開発を意気揚々と進めるベテランエンジニアが必ずぶち当たる壁――「なぜかSSD(Cドライブ)の空き容量がどんどん消えていく…!?」という恐怖を一発で解消するメンテナンスの極意「docker system prune」を徹底解説します!
肥大化した未使用キャッシュや停止中コンテナを一掃し、大切な開発環境を常にクリーン&爆速に保つノウハウをお届けします!

① 導入・本日の達成目標

Dockerを使い始めると、その手軽さゆえに docker run や docker build を何十回、何百回と繰り返します。
しかしある日突然、Windowsのタスクバーに「ディスクの空き領域が不足しています」という警告が表示されて青ざめることになります。

「不要なコンテナは docker rm したはずなのに、なぜ数十GBもディスクが減っているのか?」
その原因は、ビルドの中間層(レイヤーキャッシュ)や、タグが外れた古いイメージ(dangling images)、孤立したボリュームにあります。
本日の講義を終える頃には、以下の3つの目標を完全にマスターできます。

  • docker system df により、Dockerが消費しているディスク容量の4大要素(イメージ・コンテナ・ボリューム・ビルドキャッシュ)と回収可能容量(RECLAIMABLE)を正確に把握できる。
  • docker system prune(および -a オプション)の安全設計を理解し、稼働中のコンテナを保護しながら不要なゴミファイルを一発で一括削除できる。
  • --volumes フラグの危険性を熟知し、C#/.NET開発やGitブランチ運用における定期メンテナンスの黄金ルーチンを確立できる。

② VM / Windowsサーバー技術者のためのパラダイムシフト

長年Hyper-VやVMwareを管理してきたベテランエンジニアにとって、「ディスク容量の回収」といえば悪夢のような重労働でした。

ディスク消費の確認
▲ 【図解①】docker system df によるディスク消費の内訳確認と可視化

Hyper-Vの可変容量仮想ハードディスク(.vhdx)は、ゲストOS内でファイルを削除してもホスト側のVHDXファイルサイズは自動では小さくなりません。
ディスクを縮小するには、わざわざ仮想マシンをシャットダウンし、Hyper-Vマネージャーから「ディスクの編集」を開いて「最適化(Compact)」を実行するか、PowerShellで Optimize-VHD コマンドを叩く必要がありました。

これに対し、Dockerコンテナは「OSそのものを抱え込まない」ため、ディスク管理の設計思想が極めて洗練されています。
Dockerエンジンはすべてのイメージレイヤーやキャッシュをハッシュ値で一元管理しており、稼働中のシステムを一切止めることなく、オンラインのまま不要なブロックだけをコマンド1発で瞬時に解放できるのです!

📊 仮想マシン(VHDX)と Docker のディスクメンテナンス対比

比較項目 従来の仮想マシン (Hyper-V / VMware) 現代のコンテナ (Docker)
容量確認の方法 VHDXのプロパティやエクスプローラーを目視確認 docker system df で内訳と回収可能量を即座に表示
縮小時の停止要否 VMの完全停止(オフライン作業)が必須 稼働中コンテナを動かしたままオンラインで実行可能
作業の手間 ゼロ埋め(sdelete)+VHDX圧縮ウィザードの数ステップ docker system prune を1回叩くだけ
所要時間 数十GBの圧縮に30分〜数時間 わずか数秒〜十数秒で完了

③ 容量確認の極意:docker system df

いきなり掃除を始める前に、まずは「何がどれくらいディスクを食っているのか」を把握しましょう。
Linuxのディスク確認コマンド df(disk free)に由来する docker system df を実行します。

docker system df

実行すると、以下のような美しい集計表が出力されます:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        3         4.82GB    3.15GB (65%)
Containers      8         2         215MB     180MB (83%)
Local Volumes   5         2         1.45GB    850MB (58%)
Build Cache     42        0         8.92GB    8.92GB (100%)

4大要素と出力項目の見方

  • Images(イメージ): Docker Hubから取得したベースイメージやビルド済みイメージ。現在どのコンテナからも使われていないイメージは回収対象になります。
  • Containers(コンテナ): コンテナの読み書きレイヤー。停止中(Exited)のコンテナはそのままディスクを占有しています。
  • Local Volumes(ローカルボリューム): データベースや設定ファイルをホストに永続化している領域。
  • Build Cache(ビルドキャッシュ): docker build の高速化のためにBuildKitが保持している中間層。C#アプリを頻繁にビルドしていると、ここが平気で10GB〜20GBに膨れ上がります!
  • RECLAIMABLE(回収可能容量): 「今すぐ安全に削除できる容量」を示しています。上記の例では、合計で約13GBものディスクが回収可能であることが一目で分かります!

④ 一括掃除の決定版:docker system prune の仕組みと安全設計

回収可能容量を確認したら、いよいよ一括クリーンアップを実行します。
使うコマンドは docker system prune です。

一括掃除の仕組みと対象
▲ 【図解②】docker system prune の掃除対象(削除されるもの vs 安全に保護されるもの)

1. デフォルトの prune が削除する対象

引数なしで docker system prune を実行すると、以下の「安全に消せるゴミ」だけが自動的に選別されて削除されます:

  • ✅ 停止中のすべてのコンテナ(docker ps -a で Exited になっているもの)
  • ✅ タグなしイメージ(dangling images): ビルドのやり直し等で名前が <none>:<none> になった孤立イメージ
  • ✅ 未使用のカスタムネットワーク: どのコンテナにも接続されていない自作ブリッジネットワーク
  • ✅ 未使用のビルドキャッシュ: ビルドで参照されなくなった古い中間キャッシュ

2. 稼働中コンテナは絶対に消えない「安全設計」

「本番や開発で今まさに動いているコンテナが巻き込まれて消えたらどうしよう…」と不安になるかもしれませんが、心配無用です!
Dockerは「現在ステータスが Up(稼働中)のコンテナ」および「その稼働中コンテナが使っているイメージ」は絶対に削除しません。
WebサーバーやDBコンテナを動かしたままでも、安心して実行できます。

3. さらに徹底的に掃除する:-a (--all) オプション

docker system prune -a

-a を付けると、タグなしイメージだけでなく、「現在どのコンテナからも参照されていないすべてのイメージ」が一括削除されます。
過去に検証のためにお試しで pull して放置していた巨大なイメージ(UbuntuやNode.js、古い.NET SDKなど)を一掃したい時に絶大な効果を発揮します!

⑤ 最重要警戒ポイント:--volumes フラグの危険性と安全対策

ここで、Dockerメンテナンスにおいて最も重大な注意点をお伝えします。

ボリューム削除の注意点
▲ 【図解③】ボリューム削除オプション(--volumes)の注意点と安全運用

デフォルトの docker system prune では、ボリューム(Volumes)は絶対に削除されません。
なぜなら、ボリュームにはデータベース(SQL Server / PostgreSQL / MySQL)の実データや、アプリケーションの永続化ファイルが保存されているからです。

しかし、ネットの記事などで紹介されている以下のコマンドを安易にコピペして実行すると、取り返しのつかない悲劇が起きます:

# ⚠️ 超厳重警戒コマンド(初心者の不用意な実行厳禁!)
docker system prune --volumes

--volumes フラグを付与すると、「現在動いているコンテナにマウントされていないすべてのボリューム」が問答無用で全消去されます!
開発用のDBコンテナを一旦停止(docker stop)していた場合、その中に蓄積されていた大事な検証用テストデータやマスターデータが跡形もなく消え去ってしまいます。

💡 現場の鉄則ルール:
日常のメンテナンスでは、絶対に --volumes を付けずに docker system prune(または docker system prune -a)を使用してください。ボリュームの掃除が必要な場合は、docker volume ls で確認した上でピンポイントに docker volume rm <名前> で個別削除するのが安全です。

⑥ C# / .NET 開発現場での実践:ビルドキャッシュとGitブランチ運用

C#/.NETエンジニアの日常開発において、ディスク消費が最も激しくなるシチュエーションと、その対策ルーチンを見ていきましょう。

CSharp開発現場の定期メンテナンス
▲ 【図解④】C#/.NET 開発現場での定期メンテナンスとGitブランチ切替時のクリーンアップ

1. Visual Studio の F5 デバッグで増え続けるビルドキャッシュ

【Day 08】で解説した通り、Visual Studio 2022のコンテナツール拡張機能は、高速デバッグのために裏で頻繁に中間イメージやキャッシュレイヤーを作成します。
また、dotnet restore や dotnet publish を含むマルチステージビルドを繰り返すと、NuGetパッケージの展開キャッシュがBuildKit内に大量に積み上がります。
週末の退勤前やスプリントの終了時に docker system prune を実行する習慣をつけるだけで、開発PCのパフォーマンスを劇的に良好に保てます。

2. Gitブランチ切り替え後の残骸コンテナの整理

チーム開発では、feature/login-api や feature/order-service など、ブランチごとにコンテナを立ち上げて動作検証を行います。
Pull Requestがマージされて不要になったブランチの検証コンテナは、停止状態のまま放置されがちです。
作業ブランチを切り替えるタイミングで docker system prune を叩けば、過去のブランチの残骸コンテナが一掃され、クリーンな状態で次の機能開発に臨めます。

⑦ ハンズオン実習:SSD容量確認から一括掃除までの完全手順

それでは、手元のターミナル(PowerShell または WSL2 Ubuntu)を開いて、実際にクリーンアップの一連の流れを体験してみましょう!

# 1. 現在のDockerディスク使用量と回収可能容量を確認
docker system df

# 2. 実験用に一時コンテナを起動してすぐに停止(ゴミを作る)
docker run --name temp-clean-test nginx:alpine echo "掃除テスト完了"

# 3. 停止中コンテナが存在することを確認
docker ps -a --filter "name=temp-clean-test"

# 4. 一括掃除コマンドを実行(確認プロンプトが表示される)
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

# 5. 回収結果の確認(Deleted Containers や Total reclaimed space が表示される)
# Total reclaimed space: 15.2MB (環境によって異なります)

# 6. 強制実行(確認プロンプトをスキップして自動化したい場合)
docker system prune -f

# 7. 再び容量を確認してスッキリしたことを確認!
docker system df

⑧ ベテランが陥りやすい落とし穴・現場の知恵袋

⚠️ ディスクメンテナンスの3大現場トラブルと回避策

罠① docker system prune を実行したのに Windows の Cドライブ空き容量が増えない!?
Windows 11 + WSL2 環境で最も多い質問がこれです。
WSL2のバックエンド仮想ディスク(ext4.vhdx)は、内部でファイルを削除してもWindowsホスト側のVHDXファイルサイズは自動縮小されません(内部的に空き領域として再利用されるのみ)。
Windows側の実ディスク容量を物理的に即座に回復させたい場合は、WSLを一旦シャットダウン(wsl --shutdown)した上で、PowerShell(管理者)で wsl --manage Ubuntu --shrink(または diskpart の compact vdisk)を実行してください。

罠② CI/CDパイプラインで毎回 prune -a してしまいビルドが激遅になる
GitHub Actions Runner や Jenkins などのCIサーバーで、容量節約のために毎回のビルドジョブの先頭に docker system prune -a を仕込んでしまう失敗パターンです。
せっかくのベースイメージやNuGetキャッシュが毎回吹き飛ぶため、ビルドのたびに数GBを再ダウンロードすることになり、CI時間が3分から20分へと大悪化します。
CI環境では「日次または週次の深夜ジョブ」として定期実行するか、キャッシュ有効期限を設定して運用しましょう。

罠③ prune で消したくないコンテナがあるのに stop していた
「あとで再開して使いたい重要な検証用コンテナ」がある場合は、停止(stop)させたままにしておくと prune で消えてしまいます!
消したくないコンテナは事前に docker commit でイメージとして名前を付けて保存しておくか、稼働状態のままにしておくのが鉄則です。

📌 本日のまとめ & 明日へのステップ
  • 容量確認は docker system df。Images、Containers、Volumes、Build Cache の回収可能サイズを一目で把握できる。
  • 一括掃除は docker system prune。停止中コンテナ、タグなしイメージ、未使用ネットワーク、キャッシュを安全に一掃。
  • 稼働中(Up)のコンテナは絶対に消えない安全設計なので、稼働中でも安心して定期実行できる。
  • --volumes フラグの不用意な付与は厳禁!データベースの永続化データを守るため、日常メンテナンスではボリュームを残す。
  • C#開発では Visual Studio のビルドキャッシュ蓄積やGitブランチ切替時のクリーンアップに絶大な効果を発揮する。
次回【Day 16】予告:
『第4部突入!ASP.NET Core Web APIのコンテナ化(初めてのDockerfile作成)』〜FROM, WORKDIR, COPY, RUN, ENTRYPOINT の基本命令を完全マスター〜

コメント

このブログの人気の投稿

【Perfume】Perfume 3rd Tour 「JPN」さいたまスーパーアリーナに行って参りました~

Perfume 3rd Tour 「JPN」1月28日、29日の2daysで参戦して参りました。 ファンクラブ会員の選考抽選会に28日、29日の両日で申し込んでいたんですが、両方とも当選していたという嬉しい誤算。 仕事だぁ、なんだかんだと紆余曲折ありまして28日の参戦は危ぶまれていたのですが、なんとかかんとか28日は40分遅刻しながらも参戦、29日はフル参戦する事が出来ました(∩´∀`)∩

Perfume、2025年末で“コールドスリープ(活動休止)”へ──東京ドーム2daysの記録と、公式・各界・ファンの声

  1) 公式発表・基本情報 活動休止(コールドスリープ)を正式発表 2025年9月21日、公式サイト「 Perfumeより 」で、2026年から一度コールドスリープに入ると発表。再始動の意思(“新しいPerfume”として戻る)も明記。 Perfume Official Site 今後の運用告知(配信・上映など) 同21日付の「 今後のPerfumeに関して 」で、9/23(火・祝)東京ドーム公演の LIVESHIP全世界生配信 および 全国ディレイビューイング 決定を案内。特設サイトも併記。 Perfume Official Site +1 公式グッズ **「Perfume Calendar 2026」**発売決定(B2壁掛け/表紙+2カ月1枚×6枚+ポスター)。テーマは“フルーツ”。 Perfume Official Site 2) 東京ドーム2days(9/22・23)要点 公演タイトル: ZO/Z5 Anniversary “ネビュラロマンス” Episode TOKYO DOME 。日程・開場/開演・会場・物販等の実務情報は特設で公開。 Perfume Official Site 9/23公演を世界配信(LIVESHIP) /ディレイビューイング実施。 Perfume Official Site 海外向け報道(英語)も「 indefinite hiatus 」として広く配信。 The Times of India 国内英字メディアも速報。 朝日新聞 3) 現地レポ( メリ爺 )から見える空気 あなたの現地記録(9/24公開)を、ファクトと現場情景の両面で反映: 両日参戦 。22日は アリーナ 、23日は 1階席から俯瞰 。前日の発表を受け、開演前のザワつき→MC後に“いつもの一体感”へ。開演は22日 18:45 頃。オープニングは**P³ツアー東京ドーム(2020/2)**と同趣向で“回収”の演出。 メリ爺のゲーム万歳 MC所感 :解散ではなく前向きな休止で不安を和らげる内容。 かしゆか の涙、 のっち の気丈さ、 あ〜ちゃん の思い出語り──3人の結束と「 また戻る 」約束が強く刻まれた。 メリ爺のゲーム万歳 体感時間 : “3時間弱”級のボリューム ながら“過去一...

ニンテンドースイッチでオンラインゲームを遊ぶには?

モンスターハンターライズが発売になって、家族でモンハン楽しみたい人が増えたみたいですね。 某ブログの検索キーワードを調べると、モンハンを家族でやるにはどうしたらいいのか?を調べている人が沢山いるのがわかります。 ※これでも一部  家族で協力するにはSwitch2台、ソフトも2つ購入する必要があります。 1台のスイッチでは遊べませんし、ソフト1つでも遊べません。 でも、1台のスイッチで別々アカウントがあれば交代で遊ぶこともできますよ。セーブデータもしっかり分かれます。 Switchのオンラインゲームを家族で遊ぶ方法については以下の記事にまとめてますのでよろしければ参考にしてみてくださいね。 家族でモンスターハンターライズDL版のオンラインプレーを楽しむ方法