はじめに
Windows上でDocker環境(Docker Desktop)を利用していると、いつの間にかディスクの空き容量がわずかになっていることがあります。
特にDockerの起動/コンテナの起動を繰り返していると不要なキャッシュが急速に増えていくようで、いつの間にか数十~100GB前後の不要なキャッシュが生じていることがあります。
そこで今回は、不要なキャッシュを削除することでディスクの空き容量を増やす手順をまとめています。
作業全体のイメージ
- Dockerが生成する仮想ディスク(ext4.vhdxとdocker_data.vhdx)は、ファイルサイズの拡張は自動的に行われます.
- 一方で、仮想ディスクの縮小は自動的に行われないため、ディスクの空き領域がどんどん減っていきます。
- RDBMSのテーブルファイルがどんどん拡張していく一方で、自動的には縮小されない現象と似ているかもしれません。
- そのため、仮想ディスク内に含まれる不要なキャッシュファイルを削除した後、仮想ディスクに対して圧縮コマンドを実行することでディスクの空き容量を増やします。
事前作業1(バックアップの作成)
- 今回は仮想環境で実施したため、作業を行う前にスナップショットを作成しておきました。
- これで操作をミスした時の心配をせずに作業できます。
不要なキャッシュの削除
- Docker Desktopが起動した状態で以下のコマンドを実行して、使用していないイメージ、コンテナ、ネットワークを削除(prune)します。
- 以下の実行結果を見ると、改修された全ての領域(Total reclaimed space)が35.08GBとなっていました。
- コンテナの削除については、「docker ps -a」を実行しても表示されないキャッシュ情報も含めて削除されるようです。
不要なキャッシュの削除
PS C:\Users\NKOJIMA> docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- unused build cache
Are you sure you want to continue? [y/N]
Deleted Containers:
xxxxxxxxxxxxxxxxxxxxxxxxxx...
Deleted Networks:
xxxxxxxxxxxxxxxxxxxxxxxxxx...
Deleted Images:
untagged: xxxxxxx
deleted:
sha256:xxxxxxxxxxxxxxxxxx
untagged: yyyyyyy
deleted:
sha256:yyyyyyyyyyyyyyyyyy
...
Deleted build cache objects:
xxxxxxxxxxxxxxxxxxxxxxxxx...
Total reclaimed space: 35.08GB
- 使用していないイメージやコンテナの削除だけで済ませたい時は、代わりに以下のコマンドを実行します。
イメージとコンテナを個別に削除
// 使用していないイメージの削除
docker image prune
// 使用していないコンテナの削除
docker container prune
事前作業2(Docker DesktopとWSL2の停止)
- 仮想ディスクの圧縮を行う前に、以下の手順でDocker DesktopとWSL2を停止しておきます。
DockerDesktopの停止
- タスクトレイからDocker Desktopのアイコンを右クリックして、「Quit Docker Desktop」を押してDocker Desktopを終了させます。
- コマンドでDocker Desktopのプロセスを終了させる方法は見当たりませんでした...
WSL2の停止
- 以下のコマンドでWSL2を停止します。
WSL2の停止
wsl --shutdown
仮想ディスクの圧縮
- 仮想ディスクのあるフォルダに移動して、Optimize-VHDコマンドで仮想ディスクのサイズを圧縮します。
- 多くのサイトでは「ext4.vhdx」を圧縮すると書かれていますが、私の環境では「docker_data.vhdx」も存在していたので、両方とも圧縮しました。
- なお、ディスク圧縮処理はディスクの帯域をフルに使うため、ディスクサイズや環境(HDD利用や仮想環境利用)によって処理時間が大きく変わると思われます。
- また、ここで利用しているOptimize-VHDコマンドはWindowsのエディションが「Pro」でないと使えないため、DISKPARTコマンドを使って圧縮するようです。
仮想ディスクの圧縮
// ext4.vhdxの圧縮
cd C:\Users\NKOJIMA\AppData\Local\Docker\wsl\main Optimize-VHD -Path .\ext4.vhdx -Mode Full
// docker_data.vhdxの圧縮
cd C:\Users\NKOJIMA\AppData\Local\Docker\wsl\disk Optimize-VHD -Path .\docker_data.vhdx -Mode Full
注意点
DockerのAPIバージョンが古い
- 試しに「docker image prune」を実行したところ、以下のようにAPIバージョンが古いというエラーメッセージが出ました。
- このようなエラーが出たときは、Docker Desktop本体を更新(バージョンアップ)することでエラーを解消できます。
PS C:\Users\NKOJIMA> docker image prune -a -f
"image prune" requires API version 1.25, but the Docker daemon API version is 1.24