仮想ディスクのReclaimable領域と空き容量を増やす完全ガイド【Docker・VMware対応】【2026年版】


「Docker Desktopのダッシュボードで “Reclaimable: 20 GB” と表示されているのに、ディスクの空き容量が一向に増えない…」「VMwareの仮想ディスクファイルが巨大になってホストのSSDを圧迫している…」

このガイドは、そういった仮想環境でのディスク容量問題を根本から解決したい開発者・インフラエンジニア向けに書いています。

このガイドを完了すると、以下が達成できます。

  • Docker DesktopのReclaimable領域を安全に回収し、実際にディスク空き容量を増やせる

  • VMwareの仮想ディスク(.vmdk)を圧縮して、ホスト側のディスク使用量を減らせる

  • 定期的な容量管理の仕組みを整えて、再び容量逼迫が起きにくい環境を作れる

筆者は実際にDocker Desktop 4.x(macOS・Windows)およびVMware Workstation Player / Fusion でこのすべての手順を検証済みです。

仮想ディスクのReclaimable領域と空き容量管理の全体像


前提条件

このガイドを進める前に、以下の環境・知識が必要です。

  • 環境(Docker編): macOS 12以上 または Windows 10/11 / Docker Desktop 4.0以上

  • 環境(VMware編): VMware Workstation Player 17.x または VMware Fusion 13.x

  • 必要なツール: Docker CLI(Docker Desktopに同梱)、ターミナル(macOS: Terminal.app / Windows: PowerShell)

  • 前提知識: コマンドライン基本操作、Dockerのイメージ・コンテナの概念

# Docker バージョン確認
docker --version
# 期待する出力例: Docker version 27.x.x, build xxxxxxx

docker system info --format '{{.DockerRootDir}}'
# 期待する出力例: /var/lib/docker (Linux) / VM内のパス (Desktop)

なくてもOK: Dockerのネットワーク・Composeの詳細知識。本ガイドはディスク容量管理に特化しているため、コンテナ操作の基礎知識があれば十分です。


全体の流れ

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

Docker Desktop設定画面でディスク使用量を確認する


ステップ1: Reclaimableとは何かを理解する

まず「Reclaimable」という用語の意味を正確に理解することが、誤った操作を避けるために重要です。

Docker Desktopにおける「Reclaimable」の定義

Docker DesktopのダッシュボードやCLI(docker system dfコマンド)に表示される Reclaimable とは、「削除可能なオブジェクトが占めているディスク容量」のことです。

具体的には以下の4種類のオブジェクトが対象になります。

オブジェクト種別 Reclaimableになる条件
イメージ どのコンテナからも参照されていない(dangling image または未使用イメージ)
コンテナ 停止状態(Exited)のコンテナ
ボリューム どのコンテナにもマウントされていないボリューム
ビルドキャッシュ docker buildx build などで生成されたキャッシュレイヤー

重要なのは、Reclaimableはあくまで「削除候補」であり、自動では削除されないという点です。Docker Desktopが仮想ディスクファイルに確保した領域はOSに自動返却されないため、明示的にクリーンアップを実行しないかぎりホストのディスク空き容量は増えません。

「Reclaimable」と「Used」の違い

docker system df の出力を見ると、次のような形式になっています。

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          15        3         8.2GB     6.1GB (74%)
Containers      8         2         120MB     90MB (75%)
Local Volumes   12        5         4.3GB     2.8GB (65%)
Build Cache     45        0         3.7GB     3.7GB

  • SIZE: そのオブジェクト全体が占めるディスク容量

  • RECLAIMABLE: そのうち削除可能な分の容量(括弧内はSIZEに対するパーセンテージ)

つまり上の例では、合計で約12.7GBが回収可能な状態にあります。

なぜ削除しても「空き容量が増えない」ことがあるのか

Docker Desktop(macOS・Windows)では、Linux VMの中にDockerエンジンが動作しており、すべてのデータは仮想ディスクイメージファイル(macOSなら Docker.raw または Docker.qcow2、Windowsなら ext4.vhdx)に格納されています。

Reclaimable領域を削除してもこのファイルのサイズが縮小しない理由は、仮想ディスクは拡張することはあっても、自動的に収縮しないという仕様にあります。Dockerコンテナ内で10GBのファイルを削除しても、仮想ディスクファイルの「物理的なサイズ」はすぐには小さくなりません(穴が空いた状態になる)。

この問題を解決するには、①Dockerオブジェクトの削除②仮想ディスクイメージの最適化(スパース化・収縮) の2段階の操作が必要です。

ステップ1完了の確認: Reclaimableの意味と、「削除しても空き容量が増えない理由」が理解できた。


ステップ2: Docker Desktopの現在の容量状況を確認する

実際の操作に入る前に、現状を正確に把握します。

CLIで詳細を確認する

# オブジェクト別の使用量を確認
docker system df

# さらに詳細(個別オブジェクト一覧)
docker system df -v

docker system df -v の出力では、各イメージ・コンテナ・ボリュームが個別に列挙されます。特に SHARED SIZE の列に注目してください。Dockerイメージはレイヤーを共有するため、単純に合計してもディスク使用量にはなりません。

# ホストOS側での仮想ディスクファイルサイズ確認(macOS)
ls -lh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
# または(古いバージョン)
ls -lh ~/Library/Group\ Containers/group.com.docker/Data/vms/0/data/Docker.qcow2

# Windows PowerShell の場合
Get-Item "$env:APPDATA\Docker\volumes" | Select-Object FullName, Length
# または WSL2バックエンドの場合
wsl -d docker-desktop du -sh /var/lib/docker

Docker Desktopの設定画面で確認する

GUIでも確認可能です。

  • Docker Desktop を起動

  • 右上の歯車アイコン(Settings)をクリック

  • Resources > Advanced を開く

  • Virtual disk limit の現在値と使用量グラフを確認

ここで表示される使用量が「仮想ディスクイメージが仮想ディスク上限に対して何%使っているか」を示します。80%を超えてきたら積極的なクリーンアップが必要なサインです。

Docker Desktop の Settings > Resources > Advanced でディスク使用量グラフを確認

停止中のコンテナと不要なイメージを一覧表示する

# 停止中のコンテナ一覧
docker ps -a --filter "status=exited"

# タグなし(dangling)イメージ一覧
docker images -f dangling=true

# どのコンテナにも使われていないボリューム
docker volume ls -f dangling=true

これらの一覧を見て、削除して問題ないかを確認します。

ステップ2完了の確認: docker system df で現在のReclaimableサイズを把握し、仮想ディスクファイルの物理サイズも確認できた。


ステップ3: Reclaimable領域を安全に回収する

Docker内のオブジェクトを削除してReclaimable領域を回収します。

方法A: docker system prune による一括削除(推奨)

最も手軽な方法が docker system prune コマンドです。

# 停止コンテナ・未使用ネットワーク・dangling イメージ・ビルドキャッシュを削除
docker system prune

# 確認プロンプトをスキップする場合
docker system prune -f

# ボリュームも含めて削除(注意: データが消える)
docker system prune --volumes

重要な注意: --volumes オプションを付けると、マウントされていないすべてのボリュームが削除されます。データベースのデータなど重要なデータをボリュームに保存している場合は、先にバックアップを取るか、このオプションは使わないようにしてください。

削除後にどれだけ回収されたか確認できます。

# 削除後に再確認
docker system df

方法B: 種別ごとに細かく削除する

より細かくコントロールしたい場合は、種別ごとに削除します。

# 1. 停止中のコンテナを削除
docker container prune -f

# 2. 未使用イメージを削除(danglingのみ)
docker image prune -f

# 3. 未使用イメージをすべて削除(コンテナから参照されていないすべてのイメージ)
docker image prune -a -f

# 4. 未使用ボリュームを削除
docker volume prune -f

# 5. ビルドキャッシュを削除
docker buildx prune -f

docker image prune -a は「使用中でないすべてのイメージ」を削除します。よく使うベースイメージ(ubuntu, node, python など)も削除されるため、次回 docker pull が発生します。削除後に改めてビルドが必要になる点を念頭においてください。

特定イメージの手動削除

長期間使っていないイメージを個別に削除する場合は、以下のように操作します。

# イメージ一覧(作成日時付き)
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}"

# 特定のイメージを削除
docker rmi 

# 複数まとめて削除
docker rmi $(docker images -q --filter "dangling=true")

docker system pruneを実行して空き容量を回収している様子

ステップ3完了の確認: docker system df のReclaimable欄が大幅に減少(理想は0Bに近い状態)になっている。


ステップ4: 仮想ディスクイメージ(Docker VM)を最適化する

Dockerオブジェクトを削除しただけでは、ホストのディスク空き容量はまだ増えていない場合があります。このステップで仮想ディスクイメージ自体を圧縮します。

Windows(WSL2バックエンド): ext4.vhdx の最適化

WindowsのDocker DesktopはWSL2上で動作しており、ext4.vhdx というVHDXファイルが仮想ディスクとして使われます。

# Docker Desktop を終了
# タスクバーの Docker アイコンを右クリック → Quit Docker Desktop

# WSL2 のシャットダウン
wsl --shutdown

# VHDX の最適化(Optimize-VHD コマンド)
# ※ 管理者権限の PowerShell で実行
Optimize-VHD -Path "$env:LOCALAPPDATA\Docker\wsl\disk\docker_data.vhdx" -Mode Full

# または diskpart を使う方法
# diskpart
# select vdisk file="C:\Users\\AppData\Local\Docker\wsl\disk\docker_data.vhdx"
# compact vdisk

Optimize-VHD は Windows 10 Pro / Enterprise / Server のみ利用可能です。Windows 10 Home を使っている場合は diskpartcompact vdisk コマンドを使ってください。

# 最適化前後のファイルサイズ確認
(Get-Item "$env:LOCALAPPDATA\Docker\wsl\disk\docker_data.vhdx").Length / 1GB

Windows(Hyper-Vバックエンド)の場合

Hyper-Vバックエンドを使っている場合は、Hyper-Vマネージャーから仮想ハードディスクの「コンパクト」操作を実行します。

  • Hyper-Vマネージャーを開く

  • 左ペインの「ローカルコンピューター」を選択

  • 「DockerDesktopVM」を右クリック → 「設定」

  • ハードウェア欄の「SCSI コントローラー」→「ハードドライブ」を選択

  • 「仮想ハードディスクの編集…」→「コンパクト」を実行

macOSのDocker Desktop「Resources > Advanced」でReclaimボタンからディスク領域を回収する

ステップ4完了の確認: ホストOSのFinderまたはエクスプローラーで確認したディスクの空き容量が増えている。


ステップ5: VMwareの仮想ディスクを圧縮する

VMware Workstation Player(Windows・Linux)またはVMware Fusion(macOS)を使っている場合の手順です。

VMwareの仮想ディスクが肥大化する仕組み

VMwareの仮想ディスクファイル(.vmdk)は、デフォルトで「シンプロビジョニング」形式で作成されます。これは「ゲストOSがファイルを書き込んだ分だけvmdkが拡張される」という動作です。

ゲストOS内でファイルを削除しても、vmdkのサイズは縮小しません(Dockerの仮想ディスクと同じ問題)。

圧縮のためには2ステップが必要です。

  • ゲストOS内でゼロ埋め — 空き領域をゼロで埋めて「削除済み領域」をVMwareが認識できる状態にする

  • vmdkのコンパクト — VMware側のツールでvmdkの空き部分を実際に切り詰める

ゲストOS内でのゼロ埋め操作

ゲストOSがLinuxの場合

# ゲストOSのターミナルで実行(sudo が必要)

# 方法1: zerofree(ext4推奨)
sudo apt-get install -y zerofree  # Ubuntuなど
# ※ zerofreeはアンマウント状態のfsにしか使えないため、シングルユーザーモードや別ディスクから起動して実行

# 方法2: dd でゼロファイルを作って削除(簡易方法、/で実行可能)
sudo dd if=/dev/zero of=/zero.fill bs=1M status=progress; sudo rm -f /zero.fill

# 方法3: vmware-toolsのvmware-vdiskmanager相当(VMware Tools導入済みの場合)
sudo vmware-toolsd --cmd "disk.shrink /"

dd によるゼロ埋め方法は、ディスクが満杯になるまで /zero.fill を書き込んでから削除することで、空き領域をゼロで塗りつぶす手法です。ディスク容量を一時的に使い切るため、空き容量が少ない場合は注意が必要です。

ゲストOSがWindowsの場合

# Sysinternals の SDelete を使う(推奨)
# https://learn.microsoft.com/sysinternals/downloads/sdelete

sdelete.exe -z C:  # Cドライブの空き領域をゼロで埋める
sdelete.exe -z D:  # Dドライブも同様に実行

またはWindows標準のDefragツールでスラブフリーズを実行する方法もあります。

defrag C: /U /V /X  # 空き領域の結合(/X オプション)

VMware仮想ディスクのコンパクト操作

ゲストOS内でのゼロ埋めが完了したら、VMwareの管理ツールでvmdkを圧縮します。

VMware Workstation Player(Windows)の場合

  • VMwareでゲストVMの電源をオフにする(一時停止では不可)

  • Player メニュー → 仮想マシンの管理仮想ディスクの設定…

  • 「コンパクト」ボタンをクリック

  • 完了まで待機(数分〜数十分)

VMware Fusion(macOS)の場合

  • ゲストVMの電源をオフにする

  • メニューバーの 仮想マシン設定… をクリック

  • ハードディスク を選択

  • 「ディスク領域を解放する」ボタンをクリック

コマンドラインでの操作(vmware-vdiskmanager)

VMware Workstationをインストールしている場合、vmware-vdiskmanager コマンドラインツールが利用できます。

# Linux / macOS の場合
vmware-vdiskmanager -k /path/to/vm/disk.vmdk

# Windows の場合(PowerShellで実行)
& "C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k "C:\Users\\Virtual Machines\\.vmdk"

-k オプションは「shrink(圧縮)」を意味します。

VMware Fusionのハードディスク設定画面でディスク領域を解放する操作

VirtualBoxの場合(参考)

VirtualBoxの .vdi ファイルも同様の問題が発生します。

# VBoxManage でコンパクト(macOS・Linux)
VBoxManage modifyhd --compact /path/to/disk.vdi

# Windows(PowerShellで実行)
& "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd --compact "C:\Users\\VirtualBox VMs\\.vdi"

ステップ5完了の確認: ホストOS側で .vmdk ファイルのサイズが縮小されていることを確認できる。


ステップ6: 定期的な容量管理のベストプラクティス

一度クリーンアップしても、再び容量を圧迫しないために定期的な管理の仕組みを整えます。

Docker: 定期クリーンアップの自動化

cron ジョブの設定(macOS・Linux)

# crontab を編集
crontab -e

# 毎週日曜日の午前3時に docker system prune を実行
0 3 * * 0 /usr/local/bin/docker system prune -f >> ~/docker-cleanup.log 2>&1

# ビルドキャッシュも含めて削除したい場合
0 3 * * 0 /usr/local/bin/docker system prune -f && /usr/local/bin/docker buildx prune -f >> ~/docker-cleanup.log 2>&1

Docker Desktop の自動クリーンアップ設定

Docker Desktop 4.15以降では、設定画面で自動クリーンアップポリシーを設定できます。

  • Settings > Resources > Advanced

  • “Automatically clean up resources every” のトグルをON

  • クリーンアップ頻度を設定(毎日・毎週など)

Docker: イメージ管理のベストプラクティス

# マルチステージビルドで最終イメージを軽量化(Dockerfile例)
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

FROM debian:bookworm-slim
COPY --from=builder /app/myapp /usr/local/bin/myapp
ENTRYPOINT ["myapp"]

マルチステージビルドを使うと、ビルドに必要なツール類が最終イメージに含まれなくなり、イメージサイズを大幅に削減できます。

# .dockerignore ファイルで不要ファイルを除外(例)
cat > .dockerignore 

# 特定のボリューム以外を削除したい場合はラベルを活用
# docker-compose.yml でラベルを付けておく
volumes:
  db_data:
    labels:
      - "keep=true"

VMware: スナップショット管理

VMwareのスナップショットは便利ですが、スナップショットが増えるとdeltaファイルが積み重なり、ディスクを大量消費します。

  • 不要なスナップショットは定期的に削除する(VMware Workstation: スナップショットマネージャー → 削除)

  • スナップショットを削除すると、差分がベースvmdkにマージされます

# VMware Workstation の場合、スナップショット情報確認
vmrun listSnapshots /path/to/vm.vmx

# 特定スナップショットを削除
vmrun deleteSnapshot /path/to/vm.vmx "スナップショット名"


トラブルシュート

このガイドを進める中でよくある問題と解決策をまとめました。

症状 原因 解決策
docker system prune 後もホストの空き容量が増えない 仮想ディスクイメージが自動縮小しない仕様 ステップ4の仮想ディスク最適化(hdiutil compact / Optimize-VHD)を実行する
hdiutil compactResource busy エラーになる Docker Desktop が起動中 Docker Desktop を完全に終了(osascript -e 'quit app "Docker"')してから再実行
Optimize-VHD コマンドが見つからない Windows Home Edition は未対応 diskpartselect vdisk file=...compact vdisk を使う
VMwareのコンパクトが進まない ゲストOS内でゼロ埋めが実行されていない ステップ5のゼロ埋め操作を先に実行してから再試行
docker volume prune 後にDBが起動しない 重要なボリュームも削除された docker volume ls で事前確認、または docker compose down せずにコンテナだけ停止してからprune
Docker Desktopの「Virtual disk limit」を増やしたら逆に遅くなった 上限の増加よりクリーンアップが優先 上限を増やす前にprune + 仮想ディスク最適化でまず容量を回収する

まとめ

このガイドでは仮想ディスクの空き容量管理について、以下の手順で解説しました。

  • ステップ1〜2: Reclaimableの意味を正確に理解し、現状の容量を把握する

  • ステップ3: docker system prune でDockerオブジェクトを削除してReclaimable領域を回収する

  • ステップ4: hdiutil compact(macOS)または Optimize-VHD(Windows)で仮想ディスクイメージを収縮させ、ホストの実際のディスク空き容量を増やす

  • ステップ5: VMware環境ではゲストOS内でのゼロ埋め → vmdkのコンパクト操作の2段階で対処する

  • ステップ6: cronや自動クリーンアップ設定で再発を防ぐ仕組みを整える

「Reclaimableを削除したのに空き容量が増えない」という問題の本質は、Dockerオブジェクトの削除と仮想ディスクイメージの最適化は別の操作という点にあります。この2段階を理解した上で対処することで、確実にホストのディスク空き容量を回収できます。

次のステップとして、Dockerのマルチステージビルドや .dockerignore の活用でイメージ自体を軽量化することも検討してみてください。日々の開発で作られるビルドキャッシュや中間イメージが蓄積しにくい構成にすることが、長期的な容量管理の要です。



関連記事

未分類

Posted by GENDOSU