升级docker前真正要备份的是容器运行状态、镜像内容、卷数据和网络/自定义资源;需分四类处理:镜像导出为tar.gz、关键容器commit后save、卷用alpine容器tar打包、编排文件直接复制,升级后通过load、解压、原yml启动验证恢复。

升级 Docker 版本前,真正要保的不是“配置文件”,而是容器运行状态、镜像内容、卷数据和网络/自定义资源。Docker 自身不把配置存在独立 config 文件里,它的“配置”实际分散在镜像、容器元数据、卷、网络定义和 docker-compose.yml(如果用了)中。所以备份核心是:固化可运行状态 + 保留持久数据。
一、先确认哪些东西必须备份
不用全盘复制 /var/lib/docker(风险高、体积大、版本兼容性差),重点抓这四类:
-
所有镜像:用
docker images查看,它们是启动容器的基础 -
正在运行或已停止但需保留的容器:用
docker ps -a列出,重点关注有业务数据的 -
所有命名卷(volumes):用
docker volume ls查,这是数据库、上传文件等持久数据的主存位置 -
自定义网络、compose 文件、环境变量:特别是
docker-compose.yml和.env,它们定义了服务关系和启动参数
二、分步执行备份操作
按数据类型分别处理,安全、可验证、恢复快:
-
镜像备份:导出为压缩 tar 包
docker save $(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>") | gzip > /backup/images_$(date +%Y%m%d).tar.gz</none>
这样能一次打包所有命名镜像(跳过 dangling 镜像),节省空间且便于传输 -
容器状态备份:对关键容器做 commit + save
先提交为镜像:docker commit -m "pre-upgrade backup" myapp_container myapp:v20260721
再导出:docker save -o /backup/myapp_v20260721.tar myapp:v20260721 -
卷数据备份:逐个卷导出为 tar.gz
for vol in $(docker volume ls -q); do docker run --rm -v $vol:/volume -v /backup:/backup alpine tar czf /backup/vol_${vol}_$(date +%Y%m%d).tar.gz -C /volume .; done
确保使用轻量镜像(如 alpine)避免依赖冲突 -
编排与配置备份:直接复制文件
cp docker-compose.yml .env volumes/ /backup/config_$(date +%Y%m%d)/
如果用了自定义 network 或 secret,可用docker network inspect/docker secret inspect导出 JSON 备份
三、升级后快速验证和恢复
升级完成(比如用官方 repo 安装新版本)后,不做任何启动操作,先检查:
- 运行
docker version确认版本正确,docker info确认存储驱动没变(如仍是 overlay2) - 用
docker load -i /backup/myapp_v20260721.tar加载镜像,docker images看是否出现 - 恢复卷:新建同名卷,再用
tar xzf解压到/var/lib/docker/volumes/xxx/_data(注意权限) - 用原
docker-compose.yml启动,加--no-deps先试单服务,确认日志无 panic 或挂载失败
整个过程不依赖 Docker 旧进程,也不修改原始数据目录,即使升级失败也能秒级回退。关键是把“状态”转成标准格式(镜像 + tar + yaml),而不是赌目录结构兼容。











