Docker 20.10 升级到 24.0 会丢失数据吗?

文章导读
Docker 从 20.10 升级到 24.0 本身不会主动删除 `/var/lib/docker` 下的数据,但升级过程中的服务中断、存储驱动不兼容或人为误操作可能导致数据不可用或丢失。推荐在升级前完整备份数据目录,并确认存储驱动和 containerd 版本兼容性。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Docker 从 20.10 升级到 24.0 本身不会主动删除 `/var/lib/docker` 下的数据,但升级过程中的服务中断、存储驱动不兼容或人为误操作可能导致数据不可用或丢失。推荐在升级前完整备份数据目录,并确认存储驱动和 containerd 版本兼容性。

先说结论:升级操作仅替换二进制文件,默认保留持久化数据,但需防范配置冲突和运维失误。

  • 适合场景:生产环境平滑演进、修复安全漏洞、获取新特性支持
  • 先做准备:备份/var/lib/docker 目录、导出关键镜像和容器配置
  • 验收标准:docker ps -a 显示原有容器、业务日志无存储驱动报错

命令速用版

以下命令用于快速备份当前环境并执行标准升级流程,适用于 Ubuntu/CentOS 系统。

# 1. 备份数据目录(核心步骤)
sudo cp -r /var/lib/docker /var/lib/docker.bak

# 2. 停止 Docker 服务
sudo systemctl stop docker

# 3. 卸载旧版本(保留数据目录)
sudo apt-get remove docker docker-engine docker.io containerd runc

# 4. 安装新版本 Docker CE
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 5. 启动服务并验证
sudo systemctl start docker
sudo docker ps -a

为什么会这样

Docker 引擎二进制文件与数据存储目录物理隔离,升级仅替换程序文件不触碰数据。

Docker 的可执行文件(如/usr/bin/dockerd)与数据存储目录(/var/lib/docker/)是分离的。升级过程通常只替换二进制文件,不会自动清除镜像层、容器元数据或联合文件系统层。数据丢失的常见原因并非升级本身,而是升级后守护进程崩溃、存储驱动加载失败或运维人员执行了清理命令(如 docker system prune -a)。

版本跳跃可能引发组件兼容性问题。Docker 20.10 与 24.0 之间 containerd 版本存在差异,新版可能引入 snapshotter 插件机制重构,若旧配置未迁移或存储驱动不兼容,会导致容器无法启动。

分步处理

按顺序执行以下步骤可最大程度降低风险,每一步都有明确的检查点。

第一步:环境检查与备份
记录当前版本和运行容器列表,防止升级后无法追溯配置。除备份/var/lib/docker 目录外,建议导出关键容器为镜像。

docker version > docker_info.txt
docker ps -a >> docker_info.txt
docker commit <container_id> backup_<container_name>

第二步:安全停止服务
优雅停止服务以确保所有写入操作完成,避免数据损坏。可先暂停所有容器再停止服务。

Docker 20.10 升级到 24.0 会丢失数据吗?
docker pause $(docker ps -q)
systemctl stop docker

第三步:执行升级
卸载旧版本时切勿手动删除/var/lib/docker 目录。安装新版本后,若使用自定义数据目录(通过 graph 配置项指定),需确保路径配置一致。

第四步:恢复与启动
启动服务后观察日志。若出现存储驱动错误,不要急于初始化新目录,应尝试回滚版本或修复配置。

怎么验证是否生效

通过检查容器状态、镜像列表和日志确认数据完整性。

检查容器状态
执行 docker ps -a,确认原有容器 ID 和状态是否存在。若列表为空但备份目录存在,说明数据未被识别,需检查存储驱动配置。

检查镜像列表
执行 docker images,确认关键业务镜像是否存在。若镜像丢失但/var/lib/docker/image 目录有数据,可能是元数据索引损坏。

查看守护进程日志
使用 journalctl -u docker 查看启动日志,重点关注是否有 storage driver 加载失败或 containerd 连接超时的报错。

常见坑

以下场景在升级过程中高频出现,需提前规避。

人为误操作清理数据
升级过程中执行 docker system prune -a 或 rm -rf /var/lib/docker 会直接删除所有镜像和容器配置,此类操作不可逆,仅依赖备份恢复。

Docker 20.10 升级到 24.0 会丢失数据吗?

存储驱动迁移失败
若宿主机内核升级或配置变更导致存储驱动(如 overlay2)不兼容,Docker 可能无法启动。升级前需确认内核模块支持情况。

Buildx 构建失败
Docker 24.0+ 版本中 buildx 架构演进,默认驱动可能变更为 docker-container,旧版构建脚本若依赖隐式驱动可能报错,需显式指定 builder 生命周期管理。

常见问题

升级后 docker ps 为空是数据丢失了吗?

通常不是数据丢失,而是服务未启动或存储驱动加载失败。

首先检查 docker 服务状态,若服务运行正常但列表为空,检查/var/lib/docker 目录权限及存储驱动配置是否与原环境一致。

升级失败如何回滚到 20.10 版本?

停止当前服务,卸载新版本,重新安装旧版本 Docker 包。

确保/var/lib/docker 目录未被修改或删除,旧版本 Docker 引擎通常能兼容原有数据格式,启动后验证容器是否恢复。

buildx 构建报错找不到 driver 怎么办?

新版 Docker 强制显式管理 builder 实例,需初始化或切换驱动。

执行 docker buildx version 检查版本,若低于 0.12 建议升级 buildx 插件,或手动创建 docker-container 驱动实例。

参考来源

  • CSDN 问答:Docker 升级后容器和镜像会丢失吗?
  • CSDN 博客:【Docker】无缝升级至 Docker-CE:实战指南与数据零丢失迁移策略
  • CSDN 博客:Docker 升级不是简单命令:内核兼容、containerd 配置与灰度验证实战指南
  • CSDN 问答:Docker 20.10 升级到 24.0 后,buildx 构建镜像失败,如何兼容新旧插件机制?
  • 通用技术文档:升级 docker 服务 数据是否会丢失