收起左侧

飞牛 Docker 往系统空间里存储镜像和快照

5
回复
97
查看
[ 复制链接 ]

2

主题

21

回帖

0

牛值

江湖小虾

环境

使用飞牛官网下载的安装镜像 fnos-1.1.8-1419.iso 安装系统,首次配置完后的 Docker 版本为 29.1.2

BUG 现象

该问题表现为正常配置了存储位置为存储空间1,依然往系统空间的 /var/lib/containerd/ 目录存放 containerd 文件,包括 snapshotter overlayfs 和 content 数据,占用了大量空间。

image.png

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 官方区分有两种情况:

  1. 全新安装的 Docker v29 版本,默认使用 containerd 作为后端镜像存储 GraphDriver。镜像 content 和容器 snapshots 会存储在 containerd 配置的目录中(默认是 /var/lib/containerd/),其它数据(如卷、容器配置等存储在 Docker 的 data-root 目录,这里是 /vol1/docker);
  2. 从之前版本升级到 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)

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

192

主题

1万

回帖

0

牛值

管理员

fnOS1.0上线纪念勋章

image.png感谢反馈1.1.11版本docker版本已恢复,遇到这个情况可以手动修复一下恢复docker的版本

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个修复方案只是降级了 Docker 版本到 v28,还有些问题,比如: 没有做好 overlayfs 到 overlay2 的迁移,会导致原来的镜像和容器消失; 降级后,原来的占用空间并没有清理。 得益于只是降级,原有的所有的文件都  详情 回复
前天 03:24
这个修复有问题,会清空原来运行的容器,我真的无语死,这世界真实个草台班子  详情 回复
前天 01:56
修复很快,点赞  详情 回复
前天 01:16

2

主题

21

回帖

0

牛值

江湖小虾

前天 01:16 楼主 显示全部楼层
飞牛技术同学 发表于 2026-1-12 19:10
感谢反馈1.1.11版本docker版本已恢复,遇到这个情况可以手动修复一下恢复docker的版本
...

修复很快,点赞

2

主题

21

回帖

0

牛值

江湖小虾

前天 01:54 楼主 显示全部楼层

不对啊,这修复有大问题啊!!!

把 Docker 版本干回 28.5.2,存储驱动改回 overlay2 是能修复,但是我 TM 原来的运行的容器给搞丢了啊。

Docker 里的容器清空了啊,草,哭死!!!!!!你们有没有测试验证的啊。。。我配置了很多容器,我怎么还原啊,开发拉出去处决了吧,FK。

明明迁移一下 /var/lib/containerd/,改一下 containerd 配置重启 Docker 就好了,无语了。

QQ20260113-015027.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

2

主题

21

回帖

0

牛值

江湖小虾

前天 01:56 楼主 显示全部楼层
飞牛技术同学 发表于 2026-1-12 19:10
感谢反馈1.1.11版本docker版本已恢复,遇到这个情况可以手动修复一下恢复docker的版本
...

这个修复有问题,会清空原来运行的容器,我真的无语死,这世界真是个草台班子

2

主题

21

回帖

0

牛值

江湖小虾

前天 03:24 楼主 显示全部楼层

这个修复方案只是降级了 Docker 版本到 v28,还有些问题,比如:

  1. 没有做好 overlayfs 到 overlay2 的迁移,会导致原来的镜像和容器消失;
  2. 降级后,原来的占用空间并没有清理。

得益于只是降级,原有的所有的文件都还在,包括镜像和容器的配置,只是因为存储驱动现在是 overlay2 而隐藏了。

手动升级 docker-ce 到 29.1.4 版本,并把 storage driver 手动改成 overlayfs 后,可以让容器恢复运行。

如果没有创建什么容器,可以使用这个方案修复这个 BUG,降级后自己重新创建新容器就行,或到存储空间的 docker/containers 目录找到原来的容器配置,手动重建。

由于我创建了比较多容器,所以决定继续使用 containerd 方式,按以下方式修复了。

  1. 升级 docker 版本
apt install docker-ce --only-upgrade
  1. 停止 docker

    systemctl stop docker
    
  2. /var/lib/containerd 里的文件迁移到 /vol1/docker/containerd

rsync -av /var/lib/containerd/ /vol1/docker/containerd/
  1. 修改 containerd 配置文件:
root = "/vol1/docker/containerd"
  1. 启用 containerd image store,编辑 /etc/docker/daemon.json 文件,增加以下内容:

        "features": {
            "containerd-snapshotter": true
        },
    
  2. 重启 docker 和 containerd

systemctl restart containerd docker

容器启动后,使用 mount 命令检查容器是否挂载 /vol1/docker/containerd 里的目录。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则