為什麼 docker-in-docker 使用這麼多的磁碟空間?

為什麼 docker-in-docker 使用這麼多的磁碟空間?

我經常運行 VS Code devcontainer 來開發 Home Assistant 附加元件。這個 devcontainer 運行 Docker(在我的主機 Docker 內部)。經過幾個小時的工作後,我的主機 Docker 磁碟空間不足,導致各種問題。這裡顯示該開發容器正在使用 52GB,我認為這太多了。

% 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 prune54GB 縮小到 28GB。那為什麼這個用法沒有出現在呢docker system df

我在 macOS Sonoma 上運行 Docker Desktop 4.28.0。我在文圖拉也遇到同樣的問題。

答案1

/var/lib/docker當位於容器內而不是體積內時,這種情況經常發生。容器檔案系統通常是覆蓋的,並且不可能在覆蓋檔案系統內部定義覆蓋檔案系統。

當分層檔案系統驅動程式不可用時,後備方案是使用“本機”或“vfs”驅動程序,它只是每個層的整個檔案系統的副本。因此,如果您有 100MB 的映像,並在 docker 映像中新增單一 1MB 文件,則磁碟機上現在有 201MB 的儲存空間,其中 100MB 用於原始圖層,101MB 用於新圖層。每個容器還需要在檔案系統上新增讀取/寫入層,以便為每個建立的容器複製整個映像。

修復方法是安裝一個磁碟區/var/lib/docker並確保該安裝的來源是支援的後備檔案系統由分層檔案系統驅動程式之一。

相關內容