docker跨大版本升级时,/var/lib/docker目录不可直接复用,因存储驱动、元数据格式等不兼容;需先停服务并tar归档备份,再分别导出镜像、卷数据、容器配置等可迁移资产,升级后重新加载还原。

Docker 跨大版本升级(比如从 v20.x 升到 v26.x 或 v28.x)时,/var/lib/docker 目录不能直接复用——新版本的存储驱动、元数据格式或运行时结构可能不兼容旧数据,强行保留容易导致服务启动失败、容器异常或数据损坏。因此,备份不是为了原样恢复,而是为了安全提取可迁移资产:镜像、卷内容、网络配置等。
一、先停服务再备份原始目录
确保 Docker 完全停止,避免文件锁或写入中断:
sudo systemctl stop docker sudo systemctl disable docker # 升级期间暂不自启
然后用 tar 完整归档整个 /var/lib/docker(含权限与时间戳):
sudo tar -czf /backup/docker-root-$(date +%Y%m%d).tar.gz -C /var/lib docker
⚠️ 注意:不要用
cp -r或rsync -a直接复制后替换目录——跨大版本时,Docker daemon 启动会拒绝加载旧格式数据。
二、按类型分别导出关键资产
只备份真正需要保留的内容,后续在新版本中重建:
-
镜像:用
docker save导出为.tar(推荐带压缩)# 所有镜像(不含 dangling) docker images -q --filter "dangling=false" | xargs docker save | gzip > /backup/all-images-$(date +%Y%m%d).tar.gz # 或单个镜像(更可控) docker save nginx:alpine | gzip > /backup/nginx-alpine.tar.gz
-
命名卷数据:不备份
/var/lib/docker/volumes/下的原始目录,而用临时容器打包内容docker run --rm -v myapp_data:/data -v $(pwd):/backup alpine \ tar czf /backup/myapp_data-$(date +%Y%m%d).tar.gz -C /data .
-
容器配置(非运行态):若需保留构建参数或启动命令,可用
docker inspect导出docker inspect mydb > /backup/mydb-inspect.json
自定义网络与构建缓存:网络配置可重定义;构建缓存无法跨版本迁移,建议清理重建。
三、升级后再导入还原
安装新版 Docker 后:
- 加载镜像:
zcat /backup/all-images-*.tar.gz | docker load - 恢复卷数据:用
docker volume create myapp_data创建新卷,再用tar -xzf解压到对应路径(或挂载后解压进容器) - 依据
inspect输出重新docker run或改用docker compose up
✅ 关键原则:把
/var/lib/docker当作“一次性工作区”,而非长期数据仓库。持久化数据应始终通过命名卷、绑定挂载或外部存储实现。
不复杂但容易忽略:跨大版本升级本质是“重建环境”,备份目标不是目录本身,而是其中可迁移的业务资产。











