docker容器备份与迁移需分三块处理:镜像(用docker save导出)、运行配置(用docker inspect或docker-compose.yml保存)、持久化数据(volume或bind mount需单独备份);漏任一块将导致启动失败或数据丢失。

直接说重点:Docker容器备份与迁移不是“一键搞定”,而是分三块处理——镜像、运行配置(含网络/环境变量/端口)、持久化数据(卷或绑定目录)。漏掉任何一块,恢复后都可能启动失败或数据丢失。
镜像怎么备份才可靠
镜像是无状态的模板,用 docker save 导出最稳妥:
- 导出单个镜像:
docker save -o app-v1.2.tar myapp:1.2 - 导出多个并压缩:
docker save nginx:alpine redis:7.2 | gzip > images-all.gz - 别只存镜像名——用
docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>"</none>自动列出所有有效镜像,避免漏掉 dangling 镜像 - 生产环境建议加时间戳和校验:
docker save myapp:prod | gzip > /backup/myapp-prod_$(date +%Y%m%d_%H%M).tar.gz && sha256sum *.tar.gz > checksums.sha256
容器运行时配置不能靠记忆
容器启动参数(-v、-p、--env、--network 等)一旦没记录,重装就容易错配:
- 用
docker inspect container-name输出完整 JSON,保存为container-inspect.json - 提取关键字段更实用:
docker inspect -f 'docker run --name {{.Name}} -d {{range .HostConfig.PortBindings}}{{.}}{{end}} {{range .Config.Env}}{{.}} {{end}} -v {{range .Mounts}}{{.Source}}:{{.Destination}} {{end}} {{.Config.Image}}' container-name - 如果用 docker-compose 启动,直接备份
docker-compose.yml和相关 .env 文件,比 inspect 更直观
数据卷和绑定目录必须单独处理
镜像里没有你的数据库文件或上传目录,它们在 volume 或 host path 里:
- 查清数据在哪:
docker inspect -f '{{json .Mounts}}' container-name,区分type=volume和type=bind - Volume 备份:启动临时容器打包:
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/mydata-volume.tar.gz -C /data . - Bind Mount 备份:直接用
rsync -avz /host/data/ /backup/data/,注意权限和隐藏文件(加--include='.*') - 恢复时注意路径存在且权限匹配:目标主机上先
mkdir -p /host/data,再chown -R 1001:1001 /host/data(UID/GID 查原容器docker inspect的Config.User)
迁移执行时的关键动作
不是“传完就跑”,要控制节奏和验证闭环:
- 停旧容器前,确认应用支持短停机;数据库类服务优先走官方热备流程(如 pg_basebackup、mysqldump + binlog)
- 新主机先
docker load -i app-v1.2.tar,再创建 volume 或准备 bind 目录,最后按 inspect 或 compose 启动 - 启动后立刻检查:
docker logs -n 20 container-name、curl -I http://localhost:8080/health、ls -l /data确认文件完整 - 保留旧环境至少24小时,确保可快速切回











