20分で読める

開発者のためのディスク容量削減ガイド — node_modules・Docker・WSL2・キャッシュを一掃する

技術解説 Docker Node.js 開発環境 パフォーマンス WSL

はじめに

「また容量が足りない…」

開発者なら誰もが経験するこの悩み。気づけばSSDの空き容量が数GBしかなく、ビルドが止まったり、新しいプロジェクトをクローンできなくなったり。

主な原因は以下の通りです。

  • node_modules: プロジェクトごとに数百MB〜数GB
  • Dockerイメージ・キャッシュ: 数十GBに膨らむことも珍しくない
  • WSL2 仮想ディスク: 自動拡張するが縮小しない隠れた容量泥棒
  • 各種キャッシュ: npm、pip、Homebrew、IDE…

この記事では、開発環境のディスク容量を数十GB単位で削減できる実践的なテクニックを紹介します。


現状把握:何が容量を食っているか

まずは敵を知ることから。容量を圧迫している原因を特定しましょう。

Mac / Linux

# ホームディレクトリ配下の容量確認
du -sh ~/* 2>/dev/null | sort -hr | head -20

# 隠しフォルダも含めて確認
du -sh ~/.* 2>/dev/null | sort -hr | head -10

Windows (PowerShell)

# ユーザーフォルダの容量確認
Get-ChildItem $env:USERPROFILE -Directory |
  ForEach-Object {
    $size = (Get-ChildItem $_.FullName -Recurse -Force -ErrorAction SilentlyContinue |
      Measure-Object -Property Length -Sum).Sum / 1GB
    [PSCustomObject]@{Name=$_.Name; SizeGB=[math]::Round($size,2)}
  } | Sort-Object SizeGB -Descending

GUI ツール

コマンドラインが苦手な場合は、視覚的にディスク使用状況を確認できるツールが便利です。

OSツール特徴
WindowsWinDirStat, TreeSizeツリーマップで視覚化
MacGrandPerspective, DaisyDisk美しいUI、直感的操作
LinuxBaobab (GNOME Disk Analyzer)標準搭載されていることが多い

node_modules の容量削減

問題の規模

典型的なフロントエンドプロジェクトの node_modules は 300MB〜1GB になることも珍しくありません。10個のプロジェクトがあれば、それだけで数GB〜10GB です。

解決策1: 不要なプロジェクトの node_modules を削除

アクティブでないプロジェクトの node_modules は削除してしまいましょう。必要になったら npm install すればいいだけです。

# 特定ディレクトリ配下の全 node_modules を検索
find ~/projects -name "node_modules" -type d -prune

# 容量も一緒に表示
find ~/projects -name "node_modules" -type d -prune -exec du -sh {} \;

# 一括削除(危険!確認してから実行)
find ~/projects -name "node_modules" -type d -prune -exec rm -rf {} \;

解決策2: pnpm への移行

pnpm は node_modules をグローバルストアでシンボリックリンク管理します。同じパッケージを複数プロジェクトで使っていても、実体は1つだけ

# pnpm のインストール
npm install -g pnpm

# 既存プロジェクトで pnpm に移行
cd your-project
rm -rf node_modules package-lock.json
pnpm install

効果: モノレポや複数プロジェクトを扱う環境では、50%以上のディスク容量削減が報告されています。

解決策3: npm キャッシュのクリア

npm はダウンロードしたパッケージをキャッシュしています。これが 500MB〜2GB になることも。

# キャッシュサイズの確認
npm cache ls 2>/dev/null | wc -l
du -sh ~/.npm

# キャッシュのクリア
npm cache clean --force

Docker の容量削減

Docker は最も容量を消費しやすいツールの一つです。放置すると 数十GB〜100GB以上 になることも。

現状確認

# Docker が使用している容量を確認
docker system df

# 詳細表示
docker system df -v

出力例:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          45        5         12.5GB    8.2GB (65%)
Containers      8         2         1.2GB     850MB (70%)
Local Volumes   12        3         4.5GB     3.1GB (68%)
Build Cache     -         -         8.3GB     8.3GB

解決策1: 不要なリソースの一括削除

# 安全な一括削除(停止コンテナ、未使用ネットワーク、dangling イメージ、ビルドキャッシュ)
docker system prune

# より強力な削除(未使用イメージも全て削除)
docker system prune -a

# ボリュームも含めて全削除(データ消失注意!)
docker system prune -a --volumes

推奨: 開発環境では docker system prune週1回程度 実行するのがおすすめです。

解決策2: ビルドキャッシュの削除

# ビルドキャッシュのみ削除
docker builder prune

# 古いキャッシュのみ削除(24時間以上前)
docker builder prune --filter "until=24h"

WSL2 仮想ディスクの圧縮(Windows)

Windows で WSL2(Docker Desktop を含む)を使っている場合、仮想ディスク(ext4.vhdx)は自動で拡張されますが、ファイルを削除しても自動では縮小されません。これがディスク容量を圧迫する大きな原因になります。

なぜ縮小されないのか

WSL2 は仮想ハードディスク(VHD)形式でLinuxファイルシステムを管理しています。内部でファイルが増えると VHD は自動拡張されますが、ファイルを削除しても VHD のサイズは元に戻りません。つまり、一度膨らんだ ext4.vhdx は手動で圧縮しない限り、ずっとそのサイズのままです。

VHDXファイルの場所を確認

WSL2 の仮想ディスクは、インストール方法やバージョンによって保存場所が異なります。以下のパターンを確認してください。

パターン1: Microsoft Store版(従来型)

C:\Users\<ユーザー名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu<バージョン>_<ID>\LocalState\ext4.vhdx

パターン2: 新しいWSL2ストア形式(GUIDフォルダ)

最近のWSL2では、GUIDフォルダ内に保存されることがあります:

C:\Users\<ユーザー名>\AppData\Local\wsl\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\ext4.vhdx

パターン3: Docker Desktop

C:\Users\<ユーザー名>\AppData\Local\Docker\wsl\data\ext4.vhdx
C:\Users\<ユーザー名>\AppData\Local\Docker\wsl\distro\ext4.vhdx

パターン4: 新しいDocker Desktop

C:\Users\<ユーザー名>\AppData\Local\DockerDesktop\vm-data\ext4.vhdx

確実にVHDXを見つける方法

保存場所がわからない場合は、PowerShellでWindows全体を検索します:

# AppData\Local 配下を検索(高速)
Get-ChildItem -Path "C:\Users\$env:USERNAME\AppData\Local" -Recurse -Filter "*.vhdx" -ErrorAction SilentlyContinue

# 見つからない場合はCドライブ全体を検索(5分程度かかる)
Get-ChildItem -Path "C:\" -Recurse -Filter "*.vhdx" -ErrorAction SilentlyContinue

または、レジストリからWSLディストリビューションのパスを取得:

# ディストリビューション名を指定してパスを取得
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss |
  Where-Object { $_.GetValue("DistributionName") -eq 'Ubuntu' }).GetValue("BasePath") + "\ext4.vhdx"

GUIDフォルダへのアクセス方法

PowerShellでは {} を含むフォルダ名は特殊扱いされるため、引用符で囲む必要があります:

# 間違い(エラーになる)
cd C:\Users\taiko\AppData\Local\wsl\8ff0ed39-1e39-48df-99c6-3f9267ac2022

# 正しい(引用符で囲む)
cd "C:\Users\taiko\AppData\Local\wsl\{8ff0ed39-1e39-48df-99c6-3f9267ac2022}"

# 中身を確認
ls

VHDXファイルのサイズ確認

# サイズをGB単位で表示
(Get-Item "C:\Users\<ユーザー名>\AppData\Local\wsl\{GUID}\ext4.vhdx").Length / 1GB

75GB以上になっている場合は、かなり肥大化している状態です。

Step 1: 圧縮前の準備(重要)

圧縮前に WSL 内と Windows 側で不要なデータを削除しておくと、より多くの容量を回収できます。私の実体験では、この準備をしっかり行うことで圧縮率が大きく向上しました。

Windows 側の一時ファイル削除:

# Windows の一時ファイルを削除(管理者権限で実行)
Remove-Item -Recurse -Force C:\Users\$env:USERNAME\AppData\Local\Temp\*

WSL 内のクリーンアップ:

# Docker の不要リソースを削除
docker container prune -f
docker image prune -a -f
docker volume prune -f
docker builder prune -a -f
docker system prune -a --volumes -f

# APT キャッシュの削除(Ubuntu/Debian系)
sudo apt clean
sudo apt autoclean
sudo apt autoremove -y

# システムログの削除(7日以上前)
sudo journalctl --vacuum-time=7d

# 一時ファイルの削除
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

Step 1.5: fstrim の実行(推奨)

WSL2 内で fstrim を実行すると、未使用ブロックが解放され、圧縮効果が大幅に向上します。

# 未使用ブロックを解放(圧縮前に実行推奨)
sudo fstrim /

あるユーザーの報告では、fstrim 実行後に圧縮したところ、85GB から 60GB まで縮小できたとのことです。この一手間で圧縮効果が大きく変わることがあります。

Step 2: サービスの停止

圧縮を実行する前に、WSL と Docker を完全に停止する必要があります。

# Docker Desktop を終了(タスクトレイから終了)

# WSL をシャットダウン
wsl --shutdown

# 完全に停止したか確認(何も表示されなければOK)
wsl --list --running

Step 3-A: Optimize-VHD で圧縮(Windows Pro / Enterprise)

Windows Pro 以上をお使いの場合は、Hyper-V の Optimize-VHD コマンドが最も簡単です。

事前準備: Hyper-V 機能の有効化

  1. 「設定」→「アプリ」→「オプション機能」→「Windowsのその他の機能」を開く
  2. 以下の両方にチェックを入れる:
    • Hyper-V 管理ツール
    • Hyper-V プラットフォーム
  3. PC を再起動

圧縮の実行:

# 管理者権限で PowerShell を起動

# Docker Desktop の VHD を圧縮
Optimize-VHD -Path "C:\Users\<ユーザー名>\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode Full

# WSL Ubuntu の VHD を圧縮
Optimize-VHD -Path "C:\Users\<ユーザー名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_xxxxx\LocalState\ext4.vhdx" -Mode Full

Step 3-B: diskpart で圧縮(Windows Home)

Windows Home では Hyper-V が使えないため、diskpart コマンドを使用します。

# 管理者権限でコマンドプロンプトまたはPowerShellを起動
diskpart

以下のコマンドを順に入力:

select vdisk file="C:\Users\<ユーザー名>\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

compact vdisk の実行には 20〜30分以上 かかることがあります。進捗表示がないため、完了まで待ちましょう。

Step 3-C: 自動化ツール「WSL2 Compacter」

複数の WSL ディストリビューションを使っている場合は、WSL2 Compacter が便利です。システム内のすべての vhdx を自動検出して圧縮してくれます。

# スクリプトをダウンロードして実行(管理者権限で)
.\compact-wsl2-disk.ps1

圧縮効果の実例

以下は実際に圧縮を行った結果です。最初の行は私自身の実体験です:

ケース圧縮前圧縮後削減量
筆者の環境(WSL Ubuntu)75GB52GB23GB
Docker + ビルドキャッシュ蓄積100GB22GB78GB
開発環境 1年使用後70GB25GB45GB
docker system prune 後に圧縮50GB15GB35GB
fstrim 実行後に圧縮85GB60GB25GB

WSL本体とDocker Desktop の両方を圧縮すると、合計で 30GB〜100GB以上 の容量を回収できることがあります。

よくあるトラブルと解決法

PowerShell で GUID フォルダにアクセスできない

{} を含むパスは PowerShell で特殊扱いされます。必ず引用符で囲んでください:

# NG: 波括弧なしや引用符なしはエラー
cd C:\Users\taiko\AppData\Local\wsl\8ff0ed39-1e39-48df-99c6-3f9267ac2022

# OK: 波括弧を含むパス全体を引用符で囲む
cd "C:\Users\taiko\AppData\Local\wsl\{8ff0ed39-1e39-48df-99c6-3f9267ac2022}"

Optimize-VHD が見つからない

Windows Home エディションでは Hyper-V が利用できないため、Optimize-VHD コマンドは使えません。代わりに diskpart を使用してください(Step 3-B 参照)。

圧縮しても効果が少ない

圧縮前に以下を確認してください:

  1. docker system prune -a --volumes -f を実行したか
  2. sudo fstrim / を実行したか
  3. WSL が完全にシャットダウンされているか(wsl --list --running で確認)

注意事項

  • 必ずバックアップを取る: 万が一の破損に備え、ext4.vhdx をコピーしておく
  • すべてのWSL関連アプリを停止: Docker Desktop、VS Code Remote WSL 等も終了する
  • 処理中は中断しない: compact vdisk 実行中に中断すると破損の恐れ
  • 定期的に実行: 月1回程度の実行を推奨

その他のキャッシュ削除

Homebrew (Mac)

# キャッシュ削除
brew cleanup

# 古いバージョンも削除
brew cleanup -s

# 削除されるファイルの確認(dry-run)
brew cleanup -n

pip (Python)

# キャッシュ場所の確認
pip cache dir

# キャッシュ削除
pip cache purge

IDE・エディタ

ツールキャッシュ場所
VS Code~/.vscode/extensions (不要な拡張機能を削除)
JetBrains~/Library/Caches/JetBrains (Mac)
Xcode~/Library/Developer/Xcode/DerivedData

Git

# リポジトリの GC(ガベージコレクション)
git gc --aggressive --prune=now

# 不要なリモートブランチの参照を削除
git remote prune origin

自動化のすすめ

毎回手動でクリーンアップするのは面倒です。定期的に実行されるようにしましょう。

シェルスクリプト例

#!/bin/bash
# ~/scripts/cleanup-dev.sh

echo "🧹 開発環境クリーンアップを開始..."

# npm キャッシュ
echo "📦 npm キャッシュを削除..."
npm cache clean --force 2>/dev/null

# Docker(起動している場合のみ)
if command -v docker &> /dev/null && docker info &> /dev/null; then
    echo "🐳 Docker の不要リソースを削除..."
    docker system prune -f
    docker builder prune -f
fi

# Homebrew(Mac のみ)
if command -v brew &> /dev/null; then
    echo "🍺 Homebrew キャッシュを削除..."
    brew cleanup -s
fi

echo "✅ クリーンアップ完了!"

cron で定期実行(Linux/Mac)

# 毎週日曜の深夜3時に実行
0 3 * * 0 ~/scripts/cleanup-dev.sh >> ~/logs/cleanup.log 2>&1

まとめ

開発環境のディスク容量削減は、以下の4つに集中するのが効果的です。

対象削減効果頻度
WSL2 仮想ディスク30GB〜100GB+月1回
Docker10GB〜50GB+週1回
node_modules5GB〜20GBプロジェクト整理時
各種キャッシュ1GB〜5GB月1回

特に Windows ユーザーの場合、WSL2 仮想ディスクの圧縮が最も効果が大きいことが多いです。Docker と WSL2 は放置すると際限なく膨らむため、定期的なメンテナンスを習慣にすることをおすすめします。

ディスク容量に余裕ができると、ビルドの高速化や新プロジェクトへの着手がスムーズになり、開発体験が大きく向上します。ぜひ今日から実践してみてください。


参考リンク