Docker镜像离线迁移教程:从打包到离线部署
Docker镜像离线迁移教程:从打包到离线部署

一、 概述与应用场景
在企业级部署中,经常会有生产服务器或客户环境处于网络隔离状态(即“离线环境”或“空气间隙网络”)。这种情况下,无法直接使用 docker pull 从互联网拉取镜像。本教程提供的方案通过将镜像打包成静态文件,再通过物理介质(如U盘、硬盘)或内部网络传输,实现 Docker 应用的离线部署。
核心命令:
docker save: 将一个或多个镜像打包保存到一个tar归档文件(通常称为“镜像包”)。docker load: 从一个tar归档文件中加载镜像及其标签。
流程简图:
在线机器 (有网络) -> docker save -> .tar 文件 -> 拷贝至离线机器 -> docker load -> 离线机器 (无网络)
二、 环境准备与前提条件
-
源机器(在线,用于打包镜像):
- 安装 Docker Engine,版本与目标机器尽量保持一致。
- 拥有
sudo权限的用户。 - 能够访问互联网,已通过
docker pull获取所需镜像。
-
目标机器(离线,需要部署):
- 安装 相同版本或更高版本 的 Docker Engine。(
docker load对低版本兼容性不佳,高版本加载低版本保存的镜像通常没问题)。 - 拥有
sudo权限的用户。 - 确保有足够的磁盘空间存放镜像包和加载后的镜像。
- 安装 相同版本或更高版本 的 Docker Engine。(
-
传输媒介:
- U盘、移动硬盘,或内部局域网的文件共享服务(如SSH, SCP, FTP, NFS)。
检查Docker版本(两台机器上都应执行):
docker --version
AI构建项目bash1
三、 详细操作步骤
步骤 1:在在线机器上获取并打包镜像
-
拉取所需镜像:
使用docker pull获取你项目需要的所有镜像。例如,我们需要部署一个Nginx应用:sudo docker pull nginx:latest sudo docker pull mysql:8.0 AI构建项目bash12 -
查看已下载的镜像:
确认镜像已正确下载,并记录下它们的REPOSITORY和TAG。sudo docker images AI构建项目bash1输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2b7d6430f78d 2 weeks ago 142MB mysql 8.0 3c70fccee5fd 2 weeks ago 565MB AI构建项目123 -
使用
docker save打包镜像:
你有两种打包方式:-
方式A:打包单个镜像(推荐,更清晰)
# 语法:docker save -o <打包后的文件名.tar> <镜像名:标签> sudo docker save -o nginx-latest.tar nginx:latest sudo docker save -o mysql-8.0.tar mysql:8.0 AI构建项目bash123 -
方式B:将多个镜像打包到一个文件(节省文件数量,但管理稍复杂)
# 语法:docker save -o <打包后的文件名.tar> <镜像名:标签> <镜像名:标签> ... sudo docker save -o my-project-images.tar nginx:latest mysql:8.0 AI构建项目bash12
命令详解:
-o或--output: 指定输出文件的路径和名称。
-
-
(可选)验证打包的文件:
生成的.tar文件是一个标准的归档文件,可以用tar命令查看其内容。tar -tf nginx-latest.tar | head -n 5 # 你会看到 manifest.json, repositories, 以及一堆层(layer)的json和tar文件 AI构建项目bash12
此时,你得到了一个或多个 .tar 文件(例如 nginx-latest.tar, mysql-8.0.tar),这些就是需要迁移的镜像包。
步骤 2:传输镜像包到离线机器
使用准备好的传输媒介(如U盘),将步骤一中生成的 .tar 文件复制到目标离线服务器的某个目录下,例如 ~/docker-images/。
# 在离线机器上操作
mkdir -p ~/docker-images
# 假设你的U盘挂载在 /media/usb
cp /media/usb/*.tar ~/docker-images/
AI构建项目bash1234
步骤 3:在离线机器上加载镜像
-
使用
docker load加载镜像:
根据你之前打包的方式,选择对应的加载命令。-
如果你是按方式A打包的(多个单镜像文件):
# 进入镜像包目录 cd ~/docker-images # 逐个加载所有.tar文件 sudo docker load -i nginx-latest.tar sudo docker load -i mysql-8.0.tar AI构建项目bash123456 -
如果你是按方式B打包的(一个多镜像文件):
cd ~/docker-images sudo docker load -i my-project-images.tar AI构建项目bash12
命令详解:
-i或--input: 指定要加载的tar归档文件。
-
-
查看加载结果:
加载命令执行后,终端会输出Loaded image: <镜像名:标签>。使用docker images命令再次确认所有镜像都已成功加载。sudo docker images AI构建项目bash1预期输出:
REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2b7d6430f78d 2 weeks ago 142MB mysql 8.0 3c70fccee5fd 2 weeks ago 565MB AI构建项目123注意: 如果原始镜像没有标签(
<none>:<none>),docker load后也会是未标签状态,需要通过docker tag命令手动打标签。
四、 关键细节与注意事项
-
Docker版本兼容性:
- 强烈建议目标机器的Docker版本 >= 源机器的Docker版本。用低版本Docker加载高版本Docker保存的镜像很可能失败。这是最常见的问题。
-
镜像标签(Tag)的管理:
docker save默认会保存镜像的标签。但如果你的镜像在打包前是通过IMAGE ID操作的,加载后可能会变成<none>标签。- 解决方法:在加载后使用
docker tag <IMAGE_ID> <new-name:new-tag>重新打标签。 - 最佳实践:在打包前,确保所有镜像都有明确且唯一的
名称:标签。
-
空间问题:
- 确保离线机器有足够的磁盘空间。镜像包的大小基本等于
docker images中显示的镜像大小之和。加载时,Docker需要额外空间来解压和存储,所以所需空间可能是镜像包的两倍。
- 确保离线机器有足够的磁盘空间。镜像包的大小基本等于
-
与
docker export/import的区别:docker save/docker load:针对的是镜像(Image),会完整保存镜像的所有层、历史和历史命令。这是迁移镜像的标准方法。docker export/docker import:针对的是容器(Container),它将一个运行中的容器文件系统导出为一个快照,会丢弃历史和历史命令,导致镜像体积略小,但丢失了大量信息。不推荐用于镜像迁移。
-
批量处理:
- 如果需要迁移的镜像非常多,可以编写简单的Shell脚本进行批量操作。
示例批量保存脚本 (
save-all.sh):#!/bin/bash for image in $(sudo docker images --format "{{.Repository}}:{{.Tag}}") do if [[ "$image" != "<none>:<none>" ]]; then filename=$(echo "$image" | tr '/:' '-').tar echo "Saving $image to $filename..." sudo docker save -o "$filename" "$image" fi done AI构建项目bash123456789示例批量加载脚本 (
load-all.sh):#!/bin/bash for file in *.tar do echo "Loading $file..." sudo docker load -i "$file" done AI构建项目bash123456 -
安全考量:
- 镜像包可能包含敏感信息(如代码、密码)。在传输和存储过程中,应注意其安全性,必要时进行加密。
五、 总结
通过 docker save 和 docker load 进行离线迁移是一个简单、可靠且官方的方案。需要注意的点在于:
- 环境一致:确保目标机Docker版本不低于源机。
- 标签清晰:打包前确保镜像都有明确标签。
- 空间充足:检查磁盘空间是否足够。
完成镜像加载后,便可以在离线机器上使用标准的 docker run或者 docker compose等命令,通过迁移的镜像来创建和运行容器,完成整个项目的离线部署。


浙公网安备 33010602011771号