Docker 镜像的 备份 与 恢复

TwoAdmin 2025-10-12 171 10/12

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 更适合团队协作。

- THE END -
Tag:

TwoAdmin

12月17日17:14

最后修改:2025年12月17日
0

非特殊说明,本博所有文章均为博主原创。