Docker 镜像导出与加载教程

113 阅读5分钟

Docker 镜像导出与加载教程

本文档介绍如何使用 docker savedocker load 命令导出和加载 Docker 镜像。

1. 使用场景

1.1 为什么需要导出和加载镜像?

在实际开发和运维中,经常会遇到以下场景:

  1. 离线环境部署

    • 生产环境无法访问互联网或私有镜像仓库
    • 需要在隔离网络环境中部署应用
    • 通过导出镜像文件,可以在离线环境中加载使用
  2. 镜像备份与迁移

    • 备份重要版本的镜像用于版本回退
    • 在不同服务器或数据中心之间迁移镜像
    • 保存特定版本的镜像作为归档
  3. 跨平台传输

    • 从开发环境传输镜像到测试或生产环境
    • 在不同网络环境之间传递镜像(如通过 U盘、FTP 等方式)
    • 避免重复构建镜像,节省时间和资源
  4. 镜像分发

    • 向无法访问镜像仓库的客户端分发镜像
    • 批量部署时统一分发镜像文件
    • 第三方交付场景下的镜像传递

1.2 docker save 与 docker load 的优势

  • 简单直接: 无需配置镜像仓库,直接操作文件
  • 离线可用: 不依赖网络连接和镜像仓库服务
  • 完整保存: 保存镜像的所有层和元数据信息
  • 批量处理: 可以一次导出/加载多个镜像

1.3 适用场景对比

场景docker save/loaddocker push/pull推荐
离线环境save/load
镜像备份均可
跨网络传输save/load
频繁更新push/pull
团队协作push/pull
版本归档均可

2. 镜像信息

2.1 镜像名称

  • springboot-docker:1.0.0
docker images springboot-docker:1.0.0

image.png

3. 导出镜像 (docker save)

3.1 基本语法

docker save [OPTIONS] IMAGE [IMAGE...]

3.2 命令参数表格

参数简写说明是否必需示例
--output-o指定输出文件路径-o image.tar
--quiet-q静默模式,不显示进度信息-q

3.3 参数说明

  • -o, --output: 指定输出文件的路径和文件名。如果不指定,则输出到标准输出(stdout)
  • -q, --quiet: 静默模式,不显示导出进度信息
  • IMAGE: 要导出的镜像名称,格式为 镜像名:标签镜像ID,可以指定多个镜像

3.4 导出示例

# 导出镜像到 tar 文件
docker save -o springboot-docker-1.0.0.tar springboot-docker:1.0.0

# 导出多个镜像到同一个文件
docker save -o images.tar springboot-docker:1.0.0 nginx:latest

# 静默模式导出
docker save -q -o springboot-docker-1.0.0.tar springboot-docker:1.0.0

# 导出到标准输出(配合重定向)
docker save springboot-docker:1.0.0 > springboot-docker-1.0.0.tar

使用方式1示例: image.png

3.5 验证导出

# 查看导出的文件
ls -lh springboot-docker-1.0.0.tar

image.png

4. 加载镜像 (docker load)

4.1 上传镜像压缩包

进入导出目录执行如下脚本。scp 命令的核心作用是:将本地机器上的 springboot-docker-1.0.0.tar 文件,通过 SSH 安全拷贝到远程服务器 115.190.217.58 的 /data/appserver/ 目录下,且使用远程服务器的 root 用户权限执行拷贝操作。输入密码即可【或者配置自己的ssh公钥】。可参考SCP教程

scp springboot-docker-1.0.0.tar root@115.190.217.58:/data/appserver/

image.png

4.2 检查上传

登录到目标服务器,执行如下命令进行查看

cd /data/appserver && ls -l |grep springboot-docker-1.0.0.tar

image.png

4.3 基本语法

docker load [OPTIONS]

4.4 命令参数表格

参数简写说明是否必需示例
--input-i指定输入的 tar 文件路径-i image.tar
--quiet-q静默模式,不显示加载信息-q

4.5 参数说明

  • -i, --input: 指定输入的 tar 文件路径。如果不指定,则从标准输入(stdin)读取
  • -q, --quiet: 静默模式,不显示加载进度和镜像信息

4.6 加载示例

# 从 tar 文件加载镜像
docker load -i springboot-docker-1.0.0.tar

# 静默模式加载
docker load -q -i springboot-docker-1.0.0.tar

# 从标准输入加载(配合管道或重定向)
docker load < springboot-docker-1.0.0.tar
cat springboot-docker-1.0.0.tar | docker load

image.png

4.7 验证加载

# 查看已加载的镜像
docker images | grep springboot-docker --format

image.png

5. 完整流程示例

哈哈哈,此处又啰嗦了一遍。。。。。。。。。。。。。。。。。。。。。。。

5.1 导出镜像

# 在源机器上导出镜像
docker save -o springboot-docker-1.0.0.tar springboot-docker:1.0.0

5.2 传输文件

# 使用 scp 传输到目标机器
scp springboot-docker-1.0.0.tar user@target-host:/path/to/destination/

# 或使用其他传输方式(FTP、U盘等)

5.3 加载镜像

# 在目标机器上加载镜像
docker load -i springboot-docker-1.0.0.tar

5.4 启动容器验证

加载镜像后,可以通过启动容器来验证镜像是否正常工作。

5.4.1 启动容器
  • 先创建日志目录
mkdir -p /data/appserver/logs/springboot-docker
  • 启动服务
docker run -d \
  --name springboot-docker \
  -p 8082:8082 \
  -v /etc/config:/etc/config \
  -e APP_NAME=springboot-docker \
  -e SERVER_PORT=8082 \
  -e PROFILE_ACTIVE=prod \
  -e JAVA_OPTS="-Xms512m -Xmx512m" \
  springboot-docker:1.0.0

image.png

5.4.2 验证步骤
5.4.2.1 检查容器状态
# 查看容器运行状态
docker ps | grep springboot-docker

# 查看容器详细信息
docker inspect springboot-docker

image.png

5.4.2.2 查看容器日志
# 查看容器启动日志
docker logs springboot-docker

# 实时查看日志
docker logs -f springboot-docker

# 查看最近 100 行日志
docker logs --tail 100 springboot-docker
5.4.2.3 测试应用访问
# 测试应用健康检查(如果配置了 actuator,可用健康检查接口)
curl http://localhost:8082/hello

# 测试应用接口
curl http://localhost:8082/

image.png

5.4.2.4 检查挂载目录
# 查看日志目录
ls -lh /data/appserver/logs/springboot-docker/

# 查看日志文件内容
tail -f /data/appserver/logs/springboot-docker/nohup.log
5.4.3 验证成功标志
  • ✅ 容器状态为 Up 且运行正常
  • ✅ 容器日志无错误信息
  • ✅ 应用接口可以正常访问
  • ✅ 日志文件正常生成
5.4.4 清理测试容器

验证完成后,可以清理测试容器:

# 停止容器
docker stop springboot-docker

# 删除容器
docker rm springboot-docker

6. 注意事项

  1. 文件大小: 导出的 tar 文件可能较大,确保有足够的磁盘空间
  2. 网络传输: 传输大文件时建议使用压缩或断点续传工具
  3. 镜像标签: 加载后的镜像标签与导出时保持一致
  4. 权限要求: 需要 Docker 运行权限

7. 其他导出方式(参考)

7.1 使用标准输出

# 导出到标准输出(可配合管道使用)
docker save springboot-docker:1.0.0 > springboot-docker-1.0.0.tar

7.2 使用标准输入加载

# 从标准输入加载
docker load < springboot-docker-1.0.0.tar