【ITニュース解説】Docker, Windows & chasing missing disk space
2025年09月17日に「Dev.to」が公開したITニュース「Docker, Windows & chasing missing disk space」について初心者にもわかりやすく解説しています。
ITニュース概要
WindowsでDockerやWSL2を使うと、仮想ディスク(.vhdx)が内部ファイルを消しても縮まず、容量を圧迫する。対策として、PowerShellでOptimize-VHDコマンドを使い、定期的に仮想ディスクを最適化し、ディスクスペースを解放できる。
ITニュース解説
現代のシステム開発において、効率的な環境構築は非常に重要である。DockerとWSL2(Windows Subsystem for Linux 2)は、Windows環境で開発を行うシステムエンジニアにとって、この環境構築を大きく助ける強力なツールである。Dockerはアプリケーションとその実行に必要なものをまとめて「コンテナ」と呼ばれる独立した環境で動かす技術であり、開発者はOSやライブラリのバージョンといった複雑な依存関係に悩まされることなく、どこでも同じように動作するアプリケーションを開発できる。WSL2は、Windows上で本格的なLinux環境を動かすための技術であり、これによりWindowsユーザーはLinuxの豊富な開発ツールや環境を、Windowsの使い慣れた操作感の中で利用できるようになる。これらを組み合わせることで、Windows PC上でLinuxベースのDockerコンテナを使って開発を進めることが可能になり、多くの開発現場で採用されている。
しかし、この便利な組み合わせには一つ注意すべき点がある。それは、WSL2とDocker DesktopがファイルをWindowsの標準的なファイルシステムであるNTFSに直接保存するのではなく、特殊な仮想ディスクファイルの中に保存する仕組みであることだ。具体的には、これらは.vhdxという拡張子を持つ仮想ハードディスクファイルを利用する。この.vhdxファイルは、Windowsの特定の場所、主にAppDataフォルダ内のDockerやWSL関連のディレクトリに格納されている。WSL2のUbuntuインスタンスやDockerコンテナが扱うデータは、すべてこの.vhdxファイルの中に構築されたLinuxファイルシステム(通常はext4)に保存される。
この仮想ディスクファイルの仕組みが原因で、時間の経過とともにPCのディスク容量が意図せず圧迫される問題が発生することがある。.vhdxファイルは、仮想ディスク内でデータが増えるにつれて自動的にサイズを拡張する特性を持っている。しかし、仮想ディスクの内部でファイルやデータを削除しても、その削除された領域が.vhdxファイル自体の物理的なサイズにすぐに反映されるわけではない。つまり、仮想ディスク内では空き領域が増えても、Windowsから見た.vhdxファイルのサイズはそのまま維持されるか、さらに拡張され続ける一方である。これは、まるで部屋の荷物を捨てても部屋の壁が内側に縮まらず、使わないスペースが増えるだけの状況に似ている。結果として、いくらLinux環境やDockerコンテナ内の不要なファイルを削除しても、Windowsのディスク容量が減らず、数百ギガバイトもの容量がAppDataフォルダ内の.vhdxファイルによって占有されてしまう事態となる。
この問題を解決し、肥大化した.vhdxファイルが占有しているディスク容量を解放するためには、「コンパクト化」という作業が必要である。コンパクト化とは、.vhdxファイル内の実際に使用されているデータブロックだけを残し、削除されたデータや未使用の領域が占めていた部分を物理的に切り詰めるプロセスである。これにより、.vhdxファイル自体のサイズを、内部で使用されているデータ量に見合ったものにまで縮小できる。この作業を行うには、WSL2やDocker Desktopが仮想ディスクファイルを使用中でない状態にする必要があるため、それらを一度停止させる手順が不可欠となる。
このコンパクト化を効率的に行うための具体的な手順として、PowerShellスクリプトが非常に有効である。以下に、そのスクリプトがどのように動作するかを解説する。
まず、スクリプトは仮想ディスクの最適化を開始する前に、すべての関連サービスを停止する。具体的には、wsl --shutdownコマンドでWSL2のすべてのインスタンスをシャットダウンし、Stop-Process -Name "Docker Desktop"コマンドでDocker Desktopアプリケーションを完全に停止させる。これは、仮想ディスクファイルが使用されている状態で操作するとデータが破損する可能性があるため、安全に作業を進めるための重要なステップである。
次に、スクリプトはGet-ChildItemコマンドを使用して、コンパクト化すべき.vhdxファイルを検索する。これらのファイルは通常、$env:LOCALAPPDATA\Docker\wslや$env:LOCALAPDATA\Packages内のWSL関連パスに格納されている。スクリプトはこれらの場所からすべての.vhdxファイルを見つけ出し、そのフルパスと現在のサイズをリストアップする。これにより、最適化を実行する前にどのファイルがどれくらいの容量を占めているかを確認できる。
ファイルが特定され、サービスが停止された後、いよいよコンパクト化のプロセスが始まる。スクリプトは、Windowsに標準で搭載されている仮想化機能であるHyper-VのPowerShellモジュールが利用可能かどうかを自動で判断する。もしHyper-Vモジュールが利用可能であれば、Import-Module Hyper-Vでモジュールを読み込み、Optimize-VHD -Path <ファイルパス> -Mode Fullコマンドを各.vhdxファイルに対して実行する。このコマンドが、仮想ディスク内の未使用領域を物理的に解放し、ファイルサイズを縮小する主要な役割を果たす。Fullモードを指定することで、より徹底的な最適化が行われる。
もし何らかの理由でHyper-V PowerShellモジュールが利用できない場合でも、スクリプトは代替手段としてdiskpartというWindowsのディスク管理ツールを利用する。この場合、スクリプトは一時的なスクリプトファイルを作成し、その中にselect vdisk file="..."で.vhdxファイルを選択し、compact vdiskでコンパクト化を実行する一連のdiskpartコマンドを記述する。その後、diskpart /s <一時ファイル>としてこのスクリプトを実行し、コンパクト化が完了したら一時ファイルを削除する。これにより、Hyper-Vモジュールがなくてもディスク容量を回復できる仕組みとなっている。
すべての.vhdxファイルに対する最適化が完了した後、スクリプトは再度Get-Itemコマンドを使って各.vhdxファイルの新しいサイズを取得し、最適化前と比較してどれだけの容量が解放されたかを表示する。これにより、ユーザーはディスク容量がどれだけ回復したかを明確に確認できる。
このような一連のスクリプトは、Windows環境でDockerやWSL2を利用するシステムエンジニアが、ディスク容量の問題に直面した際に非常に役立つ。ただし、インターネット上で見つけたコマンドやスクリプトを実行する際は、その内容と動作を理解し、自己責任で行うことが極めて重要である。システムの根幹に関わる操作を行うため、不明な点があれば専門家に相談するか、十分に調べてから実行するべきである。この知識を習得し、適切に環境を管理することで、初心者のシステムエンジニアもより快適で効率的な開発環境を維持し、開発に集中できるようになるだろう。