はじめに
Cドライブの空きが1.2GBまで減った原因と、68GB回収するまでの手順。
| Before | After | |
|---|---|---|
| docker_data.vhdx | 97.35 GB | 40.4 GB |
| Cドライブ空き | 1.2 GB | 68.5 GB |
何が起きるのか
WSL上でDockerを使って開発していると、いつの間にかCドライブの空きが消える。実際にDockerが使っているデータは数GBなのに、ディスク上では数十〜100GB近く使用している、という状況になる。
犯人は docker_data.vhdx というファイル。DockerのWSLディストリビューションが使う仮想ディスクイメージで、これが 膨張したまま縮まない。
C:\\Users\\<ユーザー名>\\AppData\\Local\\Docker\\wsl\\disk\\docker_data.vhdxなぜ肥大化するのか
原因は2つ。
① Docker のゴミが溜まる
- ビルドキャッシュ —
docker compose buildするたびに古いレイヤーが残る - 未使用イメージ — タグが外れた古いイメージがそのまま
- 停止済みコンテナ — 明示的に
rmしないと残る - 未使用ボリューム —
docker compose downだけではボリュームは消えない
② VHDXは自動で縮まない
VHDXファイルは「データが増えたら拡張する」が、「データを消しても縮小しない」。つまりDocker内でファイルを消しても、Windows上のVHDXファイルサイズはそのまま。手動で圧縮する必要がある。
現状を確認する
WSL内のディスク使用量
df -h /Dockerのディスク使用量
docker system dfVHDXファイルのサイズ(PowerShell)
# Docker の VHDX
Get-ChildItem "$env:LOCALAPPDATA\\Docker\\wsl\\disk\\docker_data.vhdx" |
Select-Object @{N='GB';E={[math]::Round($_.Length/1GB,2)}}
# Cドライブの空き
Get-PSDrive C |
Select-Object @{N='FreeGB';E={[math]::Round($_.Free/1GB,1)}}対処手順
Step 1: Docker内の不要データを削除
WSL 内で実行する。
# イメージとビルドキャッシュを削除(ボリュームは残す)
docker image prune -a -f
docker builder prune -a -f ⚠ 注意: docker system prune -a --volumes を使うとボリュームも消える。DBデータなどが入っている場合はイメージとキャッシュだけに絞ること。 Step 2: Docker Desktop を停止
タスクトレイのDockerアイコンから Quit Docker Desktop する。バックグラウンドでWSLを再起動してしまうため、先に止める。
Step 3: WSLをシャットダウン
PowerShell で実行する。
wsl --shutdown
# 完全に止まったか確認(何も表示されなければOK)
wsl --list --runningまだ動いていたら:
# Docker のプロセスを強制終了
Get-Process *docker* | Stop-Process -Force
# 再度シャットダウン
wsl --shutdownStep 4: VHDXを圧縮
管理者権限の PowerShell で実行する。
diskpartdiskpart が開いたら 1行ずつ 実行:
select vdisk file="C:\\Users\\<ユーザー名>\\AppData\\Local\\Docker\\wsl\\disk\\docker_data.vhdx"compact vdiskdetach vdiskexitcompact vdisk は数分かかることがある。100%になるまで待つ。
※ detach vdisk で「既にデタッチされています」と出ても問題ない。 結果
| Before | After | 回収 | |
|---|---|---|---|
| VHDX サイズ | 97 GB | 40 GB | 57 GB |
| Cドライブ空き | 1.2 GB | 68.5 GB | 67 GB |
今後の予防
定期的にゴミ掃除する
# ビルド後にこまめに
docker image prune -f
# 週1くらいで全掃除(ボリューム以外)
docker image prune -a -f
docker builder prune -a -fdocker compose down の使い分け
| コマンド | ボリューム | 用途 |
|---|---|---|
docker compose down | 残る | 普段使い |
docker compose down -v | 消える | まっさらにしたい時だけ |
.dockerignore を確認
node_modules や .git などが含まれていないと、ビルドコンテキストが無駄に大きくなり、キャッシュも肥大化する。
node_modules
.git
.svelte-kit
dist
.env*- 環境: Windows 11 / WSL2 (Ubuntu) / Docker Desktop / SvelteKit 開発中に遭遇