WSL2・Dockerで容量が逼迫したときのクリーンアップ方法【VHDX最適化】

スポンサーリンク
thumb_WSL+Docker WSL
thumb_WSL+Docker
スポンサーリンク

SSD256GB環境で発生した深刻な容量不足

今回のトラブルが深刻だった理由は、
SSD256GBという比較的容量の小さい環境でWSL2+Dockerを運用していた点です。

ディスクが逼迫した結果、

  • WSLが頻繁にクラッシュする
  • 開発用コンテナが起動しない
  • Windows Updateが容量不足で失敗する
  • セキュリティソフトの定義ファイル更新すら行えない

という、Windows全体の運用に支障が出る状態に陥っていました。


今回のWSLクラッシュの原因

原因は複合的でした。

  • メモリ16GB環境でのメモリ不足
  • WSL2・Dockerが使用するVHDXファイルの肥大化
  • EC-CUBEエンタープライズ版特有の環境設定による負荷増大の可能性

特にVHDXの肥大化は気づきにくく、
SSD256GB環境では致命的になりやすいと感じました。


VHDX肥大化を解消する全体の流れ

今回行ったクリーンアップは、次の3ステップです。

  1. Windows側の一時ファイル削除
  2. WSL/Docker内部の不要データ削除
  3. WSLを完全停止し、VHDXを物理的に最適化(圧縮)

手順① 一時ファイル(Temp)の削除

対象パス

PowerShell
C:\Users\[USER_NAME]\AppData\Local\Temp

DockerやWSL関連アプリを終了した状態で、
Windowsの「記憶域」設定から削除します。


手順② 仮想ディスク内部のクリーンアップ

Dockerを起動

Bash
sudo systemctl start docker

ゾンビファイルの削除

空き領域を「e」で埋め尽くす一時ファイルを作成:不要データが大きいと数十分かかります。メモリも圧迫されるので実行タイミングは業務終了前などご検討ください。

Bash
sudo dd if=/dev/zero of=/var/tmp/zero.fill bs=1M status=progress

作成した一時ファイルを削除

Bash
sudo rm /var/tmp/zero.fill

Docker(docker_data.vhdx)

Bash
docker system prune -a --volumes

未使用のコンテナ・イメージ・ボリュームを削除します。


WSL2(ext4.vhdx)

Bash
sudo apt autoremove -y && sudo apt Clean

不要なパッケージとキャッシュを削除し、
VHDX内部に空き領域を作ります。

Docker停止

Bash
sudo systemctl stop docker

手順③ DockerとWSL完全停止とVHDXの最適化

管理者権限のPowerShellで以下を実行します。

PowerShell
# Docker Desktopの主要プロセスを強制終了
Stop-Process -Name "Docker Desktop" -Force -ErrorAction SilentlyContinue
Stop-Process -Name "com.docker.backend" -Force -ErrorAction SilentlyContinue
Stop-Process -Name "com.docker.service" -Force -ErrorAction SilentlyContinue
PowerShell
wsl --shutdown

停止確認:

PowerShell
wsl --list --running

注意点
wsl --shutdown を実行する際、VS Code などで WSL 内のディレクトリを開いたままにしていると、WSL が自動的に再起動されてしまいます。

VHDX の最適化を確実に行うためには、

  • VS Code(Remote – WSL 接続)
  • WSL を参照しているターミナルやエクスプローラー

これらをすべて閉じた状態で wsl --shutdown を実行する必要があります。VScodeなどでWLS内のディレクトリを開いている場合は、wslが再起動されるので閉じる必要がある。

DockerのVHDXを圧縮する場合

PowerShell
Optimize-VHD -Path "C:\Users\[USER_NAME]\AppData\Local\Docker\wsl\disk\docker_data.vhdx" -Mode Full

WSL2のVHDXを圧縮する場合

PowerShell
Optimize-VHD -Path "C:\Users\[USER_NAME]\AppData\Local\Packages\<ディストリ名>\LocalState\ext4.vhdx" -Mode Full

大容量ファイルの洗い出し

以下のディレクトリへ移動します。

PowerShell
cd C:\Users\[USER_NAME]\AppData\

5GB以上のファイルを一覧表示します。

PowerShell
Get-ChildItem -Recurse -File |
Where-Object { $_.Length -gt 5GB } |
Select-Object FullName, LastWriteTime,
@{N='Size(GB)';E={[math]::Round($_.Length / 1GB, 2)}} |
Sort-Object 'Size(GB)' -Descending |
Format-Table -AutoSize

定期メンテナンスの重要性

今回の対応で、
SSD256GB環境でも実用レベルまで復旧できました。

ただし、DockerとWSLを使い続ける限り、
VHDXは再び肥大化します。

  • 月1回のDockerクリーン
  • WSL完全停止+VHDX最適化

この2点は、
SSD容量が小さい環境ほど必須だと感じました。


まとめ

  • ゾンビファイルの削除が一番有用かもしれません。
  • WSL2のVHDXは117GBまで肥大化していた
  • Optimize-VHDにより約88GB削減できた
  • SSD256GB環境では放置するとWindows全体に影響する
  • クラッシュ後ではなく、定期的な最適化が重要

WSLが重くなったと感じた時点で対応することが、
結果的に一番楽だと思います。

タイトルとURLをコピーしました