Warum verbraucht Docker-in-Docker so viel Speicherplatz?

Warum verbraucht Docker-in-Docker so viel Speicherplatz?

Ich führe häufig einen VS Code-Entwicklungscontainer aus, um ein Home Assistant-Add-on zu entwickeln. Dieser Entwicklungscontainer führt Docker aus (innerhalb meines Host-Dockers). Nach einigen Arbeitsstunden geht meinem Host-Docker der Speicherplatz aus, was verschiedene Probleme verursacht. Hier wird angezeigt, dass dieser Entwicklungscontainer 52 GB verwendet, was meiner Meinung nach zu viel ist.

% 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

Im Entwicklungscontainer dfist zu sehen, dass die meiste Nutzung von Docker VFS stammt:

% 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/

Aber innerhalb des Containers denkt Docker, dass seine Container weniger als 1 GB verwenden.

$ 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

Und dennoch docker container pruneschrumpfen die 54 GB nach der Ausführung auf 28 GB. Warum erscheint diese Nutzung also nicht in docker system df?

Ich verwende Docker Desktop 4.28.0 auf macOS Sonoma. Auf Ventura habe ich das gleiche Problem.

Antwort1

Dies geschieht häufig, wenn /var/lib/dockersich das Objekt im Container und nicht in einem Volume befindet. Das Containerdateisystem ist häufig ein Overlay, und es ist nicht möglich, ein Overlaydateisystem innerhalb eines Overlaydateisystems zu definieren.

Wenn kein Treiber für ein geschichtetes Dateisystem verfügbar ist, kann auf den „nativen“ oder „vfs“-Treiber zurückgegriffen werden, der lediglich eine Kopie des gesamten Dateisystems für jede Schicht ist. Wenn Sie also ein 100 MB großes Image haben und eine einzelne 1 MB große Datei zum Docker-Image hinzufügen, haben Sie jetzt 201 MB Speicherplatz auf dem Laufwerk, 100 MB für die ursprüngliche Schicht und 101 MB für die neue Schicht. Jeder Container muss außerdem eine Lese-/Schreibschicht zum Dateisystem hinzufügen, sodass das gesamte Image für jeden erstellten Container kopiert wird.

Die Lösung besteht darin, ein Volume zu mounten /var/lib/dockerund sicherzustellen, dass die Quelle für diese Mountein unterstütztes zugrunde liegendes Dateisystemdurch einen der geschichteten Dateisystemtreiber.

verwandte Informationen