Docker 镜像的 备份 与 恢复 是运维中常见的操作,适用于迁移、灾难恢复或离线部署等场景。以下是完整、安全、可操作的方法。
一、镜像备份(导出为 tar 文件)
方法 1:使用 docker save(推荐)
将一个或多个镜像保存为 .tar 文件(保留所有层和元数据):
# 备份单个镜像
docker save -o myapp-nginx.tar myapp-nginx:latest
# 备份多个镜像到同一个 tar 文件
docker save -o all-images.tar image1:tag image2:tag myapp-nginx:latest
生成的 .tar 文件可以压缩以节省空间:
gzip myapp-nginx.tar # 生成 myapp-nginx.tar.gz
二、镜像恢复(从 tar 文件加载)
使用 docker load
从 .tar 文件中恢复镜像:
# 恢复单个或多个镜像
docker load -i myapp-nginx.tar
# 如果是压缩包,先解压再加载,或直接管道
gunzip -c myapp-nginx.tar.gz | docker load
# 或
zcat myapp-nginx.tar.gz | docker load
恢复后,可通过 docker images 查看是否成功导入。
三、容器 vs 镜像?注意区别!
操作 命令 用途
镜像备份 docker save 用于备份镜像本身(构建产物)
容器快照 docker export 用于备份运行中的容器文件系统(不包含历史层、元数据)
不要用 docker export 来“备份镜像”,它会丢失 Dockerfile 元信息、环境变量、启动命令等。
四、完整示例:备份 + 恢复自定义 Nginx 镜像
. 构建并确认镜像存在
docker build -t myapp-nginx:latest -f nginx/Dockerfile .
docker images | grep myapp-nginx
. 备份
docker save -o myapp-nginx_$(date +%Y%m%d).tar myapp-nginx:latest
# 可选压缩
gzip myapp-nginx_*.tar
. 在另一台机器上恢复
# 传输文件(如 scp)
scp myapp-nginx_20251210.tar.gz user@remote:/tmp/
# 登录远程机器后
zcat /tmp/myapp-nginx_20251210.tar.gz | docker load
# 验证
docker images | grep myapp-nginx
五、高级建议
批量备份所有本地镜像
# 导出所有镜像(慎用,可能很大)
docker save -o all-local-images.tar $(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>")
结合版本管理
给备份文件加上时间戳或 Git commit ID。
存储在 NAS、对象存储(如 MinIO、OSS)或 CI/CD 工件仓库中。
安全考虑
镜像中可能包含敏感配置(如硬编码密码),导出前请清理。
生产环境建议使用私有镜像仓库(如 Harbor、Docker Registry)替代手动 tar 备份。
六、补充:推送/拉取到镜像仓库(更推荐的“备份”方式)
虽然你问的是 tar 备份,但最佳实践是使用镜像仓库:
推送阿里云
docker login --username=用户名 so-images-registry-vpc.cn-beijing.cr.aliyuncs.com
# 构建时指定平台(即使你在 Mac M1 上)
docker build \
--platform linux/amd64 \
-t so-images-registry.cn-beijing.cr.aliyuncs.com/so/node:22.12.0 \
.
# 推送
docker push so-images-registry.cn-beijing.cr.aliyuncs.com/so/node:22.12.0
# 恢复时直接
pull docker pull registry.example.com/myapp/nginx:latest
这种方式支持版本控制、权限管理、增量传输,比 tar 更适合团队协作。
非特殊说明,本博所有文章均为博主原创。