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 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 会直接删除所有镜像和容器配置,此类操作不可逆,仅依赖备份恢复。
存储驱动迁移失败
若宿主机内核升级或配置变更导致存储驱动(如 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 服务 数据是否会丢失