
私は、Home Assistant アドオンを開発するために、VS Code 開発コンテナを頻繁に実行しています。この開発コンテナは Docker (ホスト Docker 内) を実行します。数時間作業した後、ホスト Docker のディスク容量が不足し、さまざまな問題が発生します。ここでは、この開発コンテナが 52 GB を使用していることが示されていますが、これは過剰であると考えられます。
% docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 1.333GB 0B (0%)
Containers 1 1 52.17GB 0B (0%)
Local Volumes 1 1 220.2MB 0B (0%)
Build Cache 0 0 0B 0B
開発コンテナ内では、df
この使用量のほとんどが Docker VFS から来ていることがわかります。
% docker exec 7f666319eddf du -hd 1 /var/lib/docker/
54G /var/lib/docker/vfs
448K /var/lib/docker/containerd
8.0K /var/lib/docker/tmp
20M /var/lib/docker/image
28K /var/lib/docker/volumes
4.0K /var/lib/docker/swarm
3.1M /var/lib/docker/containers
116K /var/lib/docker/buildkit
16K /var/lib/docker/plugins
4.0K /var/lib/docker/runtimes
88K /var/lib/docker/network
54G /var/lib/docker/
しかし、コンテナ内では、Docker はコンテナが 1GB 未満しか使用していないと考えています。
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 21 19 2.829GB 714.7MB (25%)
Containers 100 8 628.7MB 605.8MB (96%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
しかし、実行後、docker container prune
54GB が 28GB に縮小されます。では、なぜこの使用量が に表示されないのでしょうかdocker system df
?
macOS Sonoma で Docker Desktop 4.28.0 を実行しています。Ventura でも同じ問題が発生します。
答え1
/var/lib/docker
これは、ボリュームではなくコンテナ内にある場合によく発生します。コンテナのファイルシステムはオーバーレイであることが多く、オーバーレイ ファイルシステム内にオーバーレイ ファイルシステムを定義することはできません。
階層化ファイルシステム ドライバーが利用できない場合の代替手段としては、各レイヤーのファイルシステム全体のコピーである「ネイティブ」または「vfs」ドライバーを使用します。したがって、100 MB のイメージがあり、docker イメージに 1 MB のファイルを 1 つ追加すると、ドライブに 201 MB のストレージ (元のレイヤー用に 100 MB、新しいレイヤー用に 101 MB) が確保されます。また、すべてのコンテナーはファイルシステムに読み取り/書き込みレイヤーを追加する必要があり、作成されたコンテナーごとにイメージ全体がコピーされます。
修正方法は、ボリュームをマウントし/var/lib/docker
、そのマウントのソースがサポートされているバックアップファイルシステム階層化ファイルシステム ドライバーの 1 つによって。