我经常运行 VS Code 开发容器来开发 Home Assistant 插件。此开发容器运行 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
在 dev 容器内部,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”驱动程序,它只是每个层的整个文件系统的副本。因此,如果您有一个 100MB 的映像,并在 docker 映像中添加一个 1MB 的文件,则驱动器上现在有 201MB 的存储空间,100MB 用于原始层,101MB 用于新层。每个容器还需要在文件系统上添加一个读/写层,因此整个映像会被复制到每个创建的容器。
修复方法是挂载一个卷,/var/lib/docker
并确保该挂载的源是受支持的备份文件系统通过其中一个分层文件系统驱动程序。