🐶

Docker 不要なファイルを削除して WSL 内のディスク容量を減らす

2024/06/10に公開

調子こいて Docker image 作りまくってたら、ドライブの容量が足りなくなってしまったので、WSL 内に構築した Docker 環境の不要なイメージの削除することにしました。
また、WSL 内の容量を減らすだけでは親の Windows のドライブ容量が減るわけではないみたいだったので、そちらについても調べたことをまとめます。

Docker がどのくらい容量を使っているか

WSL 内で以下のコマンドを実行することで、ディスク容量を確認することができます。

docker system df

こんな感じのレスポンスが得られます。
この例だと 60 GB 強使ってます

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          21        12        23.03GB   13.58GB (58%)
Containers      12        1         18.44MB   18.44MB (99%)
Local Volumes   23        3         1.128GB   956.7MB (84%)
Build Cache     861       0         47.8GB    47.8GB 

削除方法

先ほど実行した例では、Images で約 23 GB, Local Volumes で約 1 GB, Build Cache で 約 48 GB 使用していたので、順番に不要なものを削除していきます。

Images の削除

下記のコマンドで、タグを持たず、コンテナからも参照されないイメージを削除することができます。

docker image prune -a 

docker image prune のみでタグ付けしていない(<none>) イメージを削除することができますが、-a オプションを付けることで、どのコンテナからも参照されていないイメージも含めることができます。

Volumes の削除

下記のコマンドで、どのコンテナからも参照されないボリュームを削除します。

docker volume prune

Build Cache の削除

ビルド途中のキャッシュは以下のコマンドで削除することができます。

docker builder prune

削除後の容量を確認する

上記のコマンドを実行してみてどのくらい容量の削減に成功したか確認します。

docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        12        12.6GB    1.095GB (8%)
Containers      12        1         18.44MB   18.44MB (99%)
Local Volumes   3         3         171.1MB   0B (0%)
Build Cache     70        0         0B        0B

60 GB 強から 13 GB 弱まで減らすことができました。

WSL2 のディスクサイズを最適化する

不要な Docker images やキャッシュを削除したことで、容量をかなり削減することができましたが、Windows 本体の容量に空きができるわけではありません。

削除前

削除後

なので、WSL にアタッチされている仮想ハードディスクの容量を減らす必要があります。

まずは、WSL をシャットダウンします。

wsl --shutdown

次にパーティション管理ツールである diskpart を起動します。

diskpart

diskpart が起動し、新しいウィンドウが開くので、仮想イメージファイルを選択し、容量を最適化します。

select vdisk file="C:\Users\{WSL の仮想ディスクイメージのパス}\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

最後に、Windows のドライブの容量が増えていたらOKです

さいごに

prune は果物のプルーンという意味の他に余分なものを刈り取るという意味があるそうです。
公式の解説だと参照されていないもののことを宙ぶらりんとか表現してるからぷら~んみたいなことだと思ってしまった。勉強になりました。

参考

https://docs.docker.jp/config/pruning.html
https://zenn.dev/minedia/articles/2023-02-20-docker-416d4f98ea1b75
https://zenn.dev/anko/articles/976d904e53d87e

Discussion