为什么 docker-in-docker 占用这么多磁盘空间?

为什么 docker-in-docker 占用这么多磁盘空间?

我经常运行 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 prune54GB 缩减为 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并确保该挂载的源是受支持的备份文件系统通过其中一个分层文件系统驱动程序。

相关内容