15.3.4 镜像导入导出与备份
镜像导入导出与备份#
镜像导入导出用于离线分发、跨环境迁移与灾备,核心命令包括 docker save/load 与 docker export/import。save/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.25 与 redis:7,传输到主机B并导入,验证镜像ID一致性。
2) 在容器中创建文件后 export/import,对比 docker history 与 docker 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> # 生成新镜像