DockerをWSLで動作させている際にPCの容量が圧迫されて困った場合の対処法

# はじめに
WindowsでDocker Desktopを利用して開発を行う際、WSL2を利用して動作させることってよくありますよね

- `docker build` を継続して行っていると、DockerをインストールしているPCのC:ドライブの容量が圧迫され、容量が足りなくなった...
- `docker image prune` `docker builder prune` などDockerの不要ファイル削除コマンドがあるのは知っているが、何を行えばいいか分からない
- 上記コマンドによって必要なファイルが削除されてしまうかどうかの判断ができない

そんな場合の対処法についてまとめてみました

# 【注意】記事の内容を実施する前に
私の環境下ではこの記事に記載の手順で対応可能であることが確認取れていますが、他の記事・Docker公式ドキュメントの参照などを行ったのち、あくまで自己責任での実施をお願いいたします

可能性は低いと思いますが、万が一、WSL2、Dockerが動作しなくなった場合は動作環境の再構築が必要になる可能性もあることをご理解いただいた上で実施いただければと思います

# 実施内容
容量圧縮処理でDISKPARTを利用するためWindowsではPowershellで操作してください
#### 1. `docker system df`でDockerが使用している容量の確認
```powershell
PS C:\Windows\system32> docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          10        9         39.72GB   35.74GB (89%)
Containers      9         4         8.629GB   9.666MB (0%)
Local Volumes   1         1         1.081GB   0B (0%)
Build Cache     113       0         1.718GB   1.718GB
```
       
#### 2. wslの停止
```powershell
wsl --shutdown
```

#### 3. DISKPART起動
```powershell
diskpart
```
## DISKPARTの画面での操作
#### コマンドまとめ
```powershell
# Docker（wsl）の容量肥大化の原因となっている仮想ディスクファイル(ext4.vhdx)の選択
# {USERNAME}は環境に合わせて入力
select vdisk file="C:\Users\{USERNAME}\AppData\Local\Docker\wsl\data\ext4.vhdx"
# 仮想ディスクファイルを読み取り専用でアタッチ
attach vdisk readonly
# 仮想ディスクファイルの容量圧縮
compact vdisk
# 仮想ディスクファイルのデタッチ
detach vdisk
# DISKPART終了
exit
```
#### 1. Docker（wsl）の容量肥大化の原因となっている仮想ディスクファイル(ext4.vhdx)の選択
`{USERNAME}`はDockerで利用されている`ext4.vhdx`のファイルパスに合わせて入力
```powershell
select vdisk file="C:\Users\{USERNAME}\AppData\Local\Docker\wsl\data\ext4.vhdx"
```
#### 2.仮想ディスクファイルを読み取り専用でアタッチ
```powershell
attach vdisk readonly
```
#### 3.仮想ディスクファイルの容量圧縮
```powershell
compact vdisk
```
#### 4.仮想ディスクファイルのデタッチ
```powershell
detach vdisk
```
#### 5.DISKPART終了
```powershell
exit
```

## 容量圧縮を実施しても効果があまり見られない時
Dockerの不要ファイルが影響している可能性があります
Docker公式ドキュメントにある不要なオブジェクトの削除が有効な場合もあります[^1]

コマンド一覧を記載しておくので状況に応じて利用し、不要ファイルを削除した上でDISKPARTの処理を実施してみてください
### 不要ファイル削除コマンド
```powershell
# 停止されているコンテナを削除
docker container prune
# 使用されていないビルドキャッシュを削除
docker builder prune
# コンテナで使用されていないイメージを削除
docker image prune
# コンテナで使用されていないボリュームを削除
docker volume prune
# コンテナで使用されていないネットワークを削除
docker network prune

# 上記すべてを一度に実行し削除
# （デフォルトではボリュームが対象外）
docker system prune
# ボリュームを含めすべて削除
docker system prune --volumes
```
#### docker container prune
　停止されているコンテナを削除
#### docker builder prune
　使用されていないビルドキャッシュを削除[^2]
#### docker image prune
　コンテナで使用されていないイメージを削除
#### docker volume prune
　コンテナで使用されていないボリュームを削除
#### docker network prune
　コンテナで使用されていないネットワークを削除
#### docker system prune
　使用されていないコンテナ、ビルドキャッシュ、イメージ、ボリューム、ネットワークを全て削除するコマンド
　ボリュームはデフォルトでは削除されないため、ボリュームも削除するには`--volumes`フラグを使う必要がある[^1]

# まとめ
- この記事はDockerとWSLの併用でPCの容量が圧迫される場合、仮想ディスクファイル`ext4.vhdx`が肥大化していることが原因であるケースの対処法を記載
- WindowsではDISKPARTを用いて仮想ディスクファイルの圧縮が可能
- 容量圧縮の効果が見られない場合はDockerの不要ファイル削除を検討すべき

# 最後に
この記事が容量圧迫に苦しんでいるエンジニアの助けとなりますように、、、

# 参考文献
https://qiita.com/antyuntyuntyun/items/8a0c555399cd8c96f792

https://qiita.com/siruku6/items/c91a40d460095013540d



[^1]: https://docs.docker.jp/config/pruning.html
[^2]: https://docs.docker.jp/engine/reference/commandline/builder_prune.html