环境
使用飞牛官网下载的安装镜像 fnos-1.1.8-1419.iso 安装系统,首次配置完后的 Docker 版本为 29.1.2
BUG 现象
该问题表现为正常配置了存储位置为存储空间1,依然往系统空间的 /var/lib/containerd/ 目录存放 containerd 文件,包括 snapshotter overlayfs 和 content 数据,占用了大量空间。

BUG 分析
查看 /etc/docker/daemon.json 文件和执行 docker info,发现 data-root 是正常配置的:
{"data-root":"/vol1/docker","live-restore":true,"log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"},"proxies":{},"registry-mirrors":["https://docker.fnnas.com","https://registry.hub.docker.com"]}
从 Docker v29 版本开始,新安装的 docker 环境会使用 containerd 作为默认的后端镜像存储驱动(https://docs.docker.com/engine/release-notes/29/#2900),而相对应的存储目录也有对应的区别。
Docker 官方区分有两种情况:
- 全新安装的 Docker v29 版本,默认使用 containerd 作为后端镜像存储 GraphDriver。镜像 content 和容器 snapshots 会存储在 containerd 配置的目录中(默认是
/var/lib/containerd/),其它数据(如卷、容器配置等存储在 Docker 的 data-root 目录,这里是 /vol1/docker);
- 从之前版本升级到 v29 版本的,保留使用原有的存储驱动,所有数据存储在 Docker 的
data-root 目录。
所以,对于新安装的 Docker,飞牛只修改了 /etc/docker/daemon.json 配置文件里的 data-root,导致 containerd 继续将镜像文件和容器 snapshots 层存储在系统空间的 /var/lib/containerd/ 目录,当拉取新的镜像和启动容器实例,就会往系统空间写。
如果有些用户创建的容器大量写临时文件,会导致 snapshots 层占用的空间越来越大。
可以使用 mount 命令查看容器实例挂载 overlay 层的情况:
overlay on /vol1/docker/rootfs/overlayfs/84fcc158cad7746aabd34e96c49677a1048a9695186458fcbcba258601b4a717 type overlay (rw,relatime,
lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/165/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/7/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/6/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/5/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/4/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/3/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/2/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/1/fs,
upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/166/fs,
workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/166/work
)
我简单理解一下:
- overlay on:容器运行的 rootfs,在容器里执行
ls / 到的内容;
- lowdir:由镜像的层合并成的只读层;
- upperdir:在容器中修改和增加文件时存放的位置;
- workdir:overlayfs 内部使用的临时存储层,用于修改时的临时存储,用户无感。
可以看到,我们在飞牛 Docker 中配置的存储位置,实际依靠的是 /var/lib/containerd/ 目录里的目录合并成的,所以拉取镜像和在容器中写数据会导致系统空间占用。
BUG 修复
根据官方文档(https://docs.docker.com/engine/daemon/#daemon-data-directory),只需要修改 containerd 的配置文件 /etc/containerd/config.toml 就能实现调整:
root = "/mnt/containerd-data"
注意:修改完后要迁移原有 /var/lib/containerd/ 的数据。
相关讨论帖子
飞牛系统空间爆满
https://club.fnnas.com/forum.php?mod=viewthread&tid=50029
(出处: 飞牛私有云论坛 fnOS)