收起左侧

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

12
回复
528
查看
[ 复制链接 ]

2

主题

28

回帖

0

牛值

江湖小虾

2026-1-8 03:02:19 显示全部楼层 阅读模式

环境

使用飞牛官网下载的安装镜像 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

215

主题

1万

回帖

0

牛值

管理员

fnOS1.0上线纪念勋章

2026-1-12 19:10:00 显示全部楼层

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

本帖子中包含更多资源

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

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

2

主题

28

回帖

0

牛值

江湖小虾

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

修复很快,点赞

2

主题

28

回帖

0

牛值

江湖小虾

2026-1-13 01:54:27 楼主 显示全部楼层

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

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

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

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

QQ20260113-015027.png

本帖子中包含更多资源

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

x

2

主题

28

回帖

0

牛值

江湖小虾

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

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

2

主题

28

回帖

0

牛值

江湖小虾

2026-1-13 03:24:47 楼主 显示全部楼层

这个修复方案只是降级了 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 配置文件(/etc/containerd/config.toml):
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 里的目录。

大佬帮忙看一下,遇到一样的问题,尝试你的步骤全部操作一遍之后,本地镜像一直在转圈。获取不到镜像文件,但是容器可以正常启动。  详情 回复
2026-1-27 12:47
终于恢复容器,感谢大佬  详情 回复
2026-1-26 09:23
1

查看全部评分

7

主题

12

回帖

0

牛值

江湖小虾

2026-1-19 18:59:54 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=232684&ptid=50226][color=#999999]飞牛技术同学 发表于 2026-1-12 19:10[/color][/url][/size] 感谢反馈1.1.11版本docker版本已恢复,遇到这个情况可以手动修复一下恢复docker的版本 ...[/quote]

image.png我更新到1.1.11版本,docker任然占用系统空间,如何解决

本帖子中包含更多资源

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

x

2

主题

2

回帖

0

牛值

江湖小虾

2026-1-22 10:30:17 显示全部楼层

这么多容器都没了,有办法恢复吗cry

容器的配置存在 /vol1/docker/containers 目录里并没有删除,只是因为飞牛的修复方式是降级使用 overlay2,所以新版本的容器隐藏了。把里面的子目录复制出来,参考里面的 config.v2.json 和 hostconfig.json 配置手  详情 回复
2026-1-22 12:49

2

主题

28

回帖

0

牛值

江湖小虾

2026-1-22 12:49:50 楼主 显示全部楼层
Yxx 发表于 2026-1-22 10:30
这么多容器都没了,有办法恢复吗

容器的配置存在 /vol1/docker/containers 目录里并没有删除,只是因为飞牛的修复方式是降级使用 overlay2,所以新版本的容器隐藏了。把里面的子目录复制出来,参考里面的 config.v2.json 和 hostconfig.json 配置手动创建新的。

我是用上面楼层提到的方法升级 docker 版本恢复的。
Yxx
哦哦 我试试看 感谢感谢  详情 回复
2026-1-22 13:47

2

主题

2

回帖

0

牛值

江湖小虾

2026-1-22 13:47:34 显示全部楼层
jakes 发表于 2026-1-22 12:49
容器的配置存在 /vol1/docker/containers 目录里并没有删除,只是因为飞牛的修复方式是降级使用 overlay2 ...

哦哦 我试试看 感谢感谢

0

主题

4

回帖

0

牛值

江湖小虾

fnOS1.0上线纪念勋章

2026-1-26 09:23:25 显示全部楼层
jakes 发表于 2026-1-13 03:24
这个修复方案只是降级了 Docker 版本到 v28,还有些问题,比如:

没有做好 overlayfs 到 overlay2 的迁移 ...

终于恢复容器,感谢大佬

0

主题

1

回帖

0

牛值

江湖小虾

2026-1-27 12:47:37 显示全部楼层
jakes 发表于 2026-1-13 03:24
这个修复方案只是降级了 Docker 版本到 v28,还有些问题,比如:

没有做好 overlayfs 到 overlay2 的迁移 ...

大佬帮忙看一下,遇到一样的问题,尝试你的步骤全部操作一遍之后,本地镜像一直在转圈。获取不到镜像文件,但是容器可以正常启动。

本帖子中包含更多资源

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

x
有没有迁移 /var/lib/containerd/ 目录的文件?有没有修改 /etc/containerd/config.toml 里的 containerd 配置?修改玩重启一下 containerd 和 docker。还不行,进命令行运行一下 docker images 命令看一下有没有报  详情 回复
2026-1-28 01:11

2

主题

28

回帖

0

牛值

江湖小虾

2026-1-28 01:11:54 楼主 显示全部楼层
jonisam 发表于 2026-1-27 12:47
大佬帮忙看一下,遇到一样的问题,尝试你的步骤全部操作一遍之后,本地镜像一直在转圈。获取不到镜像文件 ...

有没有迁移 /var/lib/containerd/ 目录的文件?有没有修改 /etc/containerd/config.toml 里的 containerd 配置?修改玩重启一下 containerd 和 docker。还不行,进命令行运行一下 docker images 命令看一下有没有报错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则