15.3.4 镜像导入导出与备份

镜像导入导出与备份#

镜像导入导出用于离线分发、跨环境迁移与灾备,核心命令包括 docker save/loaddocker export/importsave/load 面向镜像与标签,保留层级与元数据;export/import 面向容器文件系统快照,不保留历史层与元数据。

0. 原理草图(两条路径对比)

文章图片

1. 环境与安装检查(示例)
- 确认 Docker 可用、磁盘空间充足:

# 安装(以 Ubuntu 为例)
sudo apt-get update
sudo apt-get install -y docker.io

# 验证版本与运行状态
docker version
systemctl status docker --no-pager

# 检查存储空间
df -h /var/lib/docker

2. 镜像导出(save)与导入(load)
- 场景:离线分发/内网发布

# 拉取示例镜像
docker pull nginx:1.25
docker pull redis:7

# 导出单个镜像
docker save -o /tmp/nginx_1.25.tar nginx:1.25

# 导出多个镜像
docker save -o /tmp/web_stack.tar nginx:1.25 redis:7

# 传输到目标主机(示例)
scp /tmp/web_stack.tar user@10.0.0.20:/tmp/

# 目标主机导入
docker load -i /tmp/web_stack.tar

# 验证导入结果
docker images | egrep 'nginx|redis'
  • 命令解释:
  • docker save -o:将镜像及其所有层写入 tar 包。
  • docker load -i:从 tar 包恢复镜像及标签。

3. 容器导出(export)与导入(import)
- 场景:快速生成精简快照(不保留元数据)

# 运行容器并做一次文件修改
docker run -d --name web nginx:1.25
docker exec web sh -c "echo 'snapshot' > /usr/share/nginx/html/snapshot.html"

# 导出容器文件系统快照
docker export -o /tmp/web_snapshot.tar web

# 导入生成新镜像
docker import /tmp/web_snapshot.tar myapp:snapshot

# 查看镜像信息(注意无原始标签/层历史)
docker image inspect myapp:snapshot --format '{{.Id}} {{.Config.Cmd}} {{.Config.Env}}'
  • 说明:import 后镜像没有历史层、环境变量、CMD/ENTRYPOINT,需要在 Dockerfile 中补充。

4. 备份策略与校验(示例流程)
- 目标:可追溯、可回滚、可验证

# 1) 导出镜像
docker save -o /backup/app_v1.tar myapp:v1

# 2) 计算校验和
sha256sum /backup/app_v1.tar > /backup/app_v1.tar.sha256

# 3) 备份到对象存储或备份服务器(示例:rsync)
rsync -av /backup/app_v1.tar* backup@10.0.0.30:/data/docker_backup/

# 4) 恢复时校验
sha256sum -c /data/docker_backup/app_v1.tar.sha256

# 5) 导入镜像
docker load -i /data/docker_backup/app_v1.tar

5. 常见排错与定位
- 现象:no space left on device
- 处理:

df -h /var/lib/docker
docker system df
docker system prune -f
  • 现象:Error response from daemon: open ... permission denied
  • 处理:
# 确认权限
ls -l /tmp/web_stack.tar
# 使用 sudo 或调整文件权限
sudo docker load -i /tmp/web_stack.tar
  • 现象:导入后镜像架构不匹配(如 arm64/amd64)
  • 处理:
docker image inspect nginx:1.25 --format '{{.Os}}/{{.Architecture}}'
# 确保源与目标架构一致

6. 练习(可操作任务)
1) 在主机A导出 nginx:1.25redis:7,传输到主机B并导入,验证镜像ID一致性。
2) 在容器中创建文件后 export/import,对比 docker historydocker inspect 差异。
3) 为导出的镜像包生成 sha256 校验并在另一台机器验证。

7. 命令速查表

docker save -o <file.tar> <image[:tag]>   # 导出镜像
docker load -i <file.tar>                 # 导入镜像
docker export -o <file.tar> <container>   # 导出容器快照
docker import <file.tar> <name:tag>       # 生成新镜像