docker image prune したのにディスク空き容量が変わらない

はじめに

Dockerを長く使っているとディスク容量を消費し空き容量がなくなって来る事がよくあります。自分は仮想ディスクをDドライブに移しているのですが、それでも圧迫して来たので仮想ディスクの掃除をした時の話。

環境

  • Docker Desktop for Windows
  • Windows10 Home(Proの場合の方法もあり)

現象

以下のコマンドで使っていないイメージを削除したのに、ディスクの空き容量が増えない。

# 使っていないイメージ削除
$ docker image prune

その他のオブジェクト削除コマンド

以下のコマンド実行時も同じ

# 使っていないコンテナ削除
$ docker container prune

# 使っていないボリューム削除
$ docker volume prune

# 使っていないネットワーク削除
$ docker network prune

# ボリューム以外の使っていないすべてのオブジェクト削除
$ docker system prune

原因

Dockerが使用している仮想ディスクは、拡張は自動的に行うが縮小は行われない。つまり増えたら増えたままなのでディスクを圧迫し続ける。

pruneコマンドでそのオブジェクトがDocker内で削除されても、使われていたディスクスペースは空の状態で確保されたままとなる。もちろん再利用はされるのでそのままでも問題はないが、今回はそのスペースを圧縮したい。

解決方法

Dockerからは離れてWindowsのシステムコマンドを使って仮想ディスクを圧縮していきます。

Docker が使用している仮想ディスク(ファイル)に対して、圧縮コマンドを実行する事で、使用されていないディスクスペースを削除する事ができます。

Windows10 Pro か Windows10 Home かでコマンドが違うので注意。

手順

1. Docker Desktop for Windows を終了

2. WSLを停止

PowerShell を使って以下のコマンドを実行します。

wsl --shutdown

3. 仮想ディスクを圧縮

仮想ディスクの場所を確認します。環境によって違うのでそれぞれ調べてください。仮想ディスクのファイル名はext4.vhdxです。仮想ディスクのフルパスをメモっておきます。

例えば
C:\Users\[ユーザー名]\AppData\Local\Docker\wsl\distro\ext4.vhdx

以下、Windowsエディションによって方法が違います。

Windows10 Pro の場合

以下のコマンドを実行します。

Optimize-VHD -Path [仮想ディスクのフルパス]\ext4.vhdx

Windows10 Home の場合

Homeエディションの場合は、Hyper-VのコマンドであるOptimize-VHDは使えないので、代わりに DISKPART を使って圧縮します。

以下のコマンドで、DISKPART に入り、以下 DISKPART 上でコマンド実行します。

diskpart

DISKPART 内にて

# 仮想ディスクファイルの選択
DISKPART> select vdisk file="[仮想ディスクのフルパス]\ext4.vhdx"

# 圧縮
DISKPART> compact vdisk

DISKPART> exit

まとめ

これらの操作は仮想ディスクに対して実行されるため、バックアップをとってから実行するなど慎重にする必要があります。Dockerが起動しなくなるなどの不具合が起きる場合もあるため、あくまでも自己責任でお願いします^^