离线部署大体积 Docker 镜像:分盘刻录与还原完整指南

📅 2026/6/30 15:17:12
离线部署大体积 Docker 镜像:分盘刻录与还原完整指南
1. 引言在离线或网络隔离的生产环境中部署 Docker 应用时常常需要将预先构建好的镜像通过物理介质如光盘、U盘传输。然而单个 Docker 镜像的体积可能远超常见存储介质的容量例如 DVD 光盘的 4.7GB。直接使用docker save命令保存的镜像文件.tar往往无法直接刻录到一张光盘上。本文将详细介绍一种可靠的解决方案将大型 Docker 镜像保存为压缩包分割成适合光盘容量如 4GB的小块分多张光盘刻录最后在目标离线机器上重新合并并加载。这种方法完美解决了单介质容量限制的问题。操作案例例如 vscode-ray-test:tensorflow 20.5GB在有镜像的电脑上保存并压缩sudodockersave vscode-ray-test:tensorflow|gzip-9vscode-ray-test_tensorflow.tar.gz查看大小ls-lhvscode-ray-test_tensorflow.tar.gz切成适合光盘的小块光盘标称 4.5GB实际可用空间通常不到 4.5GB所以建议每块切成 3900MBsplit-b3900M-d-a3vscode-ray-test_tensorflow.tar.gz vscode-ray-test_tensorflow.tar.gz.part-查看每块大小ls-lhvscode-ray-test_tensorflow.tar.gz.part-*生成校验文件sha256sum vscode-ray-test_tensorflow.tar.gz.part-*SHA256SUMS.txt刻录到多张光盘在不联网电脑上恢复把所有光盘里的 part 文件复制到同一个目录先校验sha256sum-cSHA256SUMS.txt如果都显示 OK再加载镜像catvscode-ray-test_tensorflow.tar.gz.part-*|gunzip-c|sudodockerload查看镜像是否导入成功sudodockerimages|grepvscode-ray-test注意ubuntu操作系统光盘不能多次添加文件进行刻录只能一次刻录不然识别不出来原因未知。2. 核心思路与流程概览整个操作流程可以概括为以下四个步骤保存与压缩在有网络的环境中使用docker save将镜像导出为.tar文件并使用压缩工具如gzip减小其体积。分割文件使用文件分割工具如split将压缩后的单个大文件切割成多个指定大小例如 4GB的小文件。分盘刻录将每个分割后的小文件分别刻录到不同的物理光盘上。离线还原在目标离线机器上将所有光盘中的文件复制到同一目录按顺序合并解压缩最后使用docker load加载镜像。下面的流程图清晰地展示了这一过程有网络环境大型 Docker 镜像docker save -o image.targzip image.tar生成 image.tar.gzsplit -b 4G image.tar.gzimage_part_分割文件image_part_aa, image_part_ab, ...分盘刻录Part_aa - 光盘1, Part_ab - 光盘2离线环境复制所有 part 文件至同一目录cat image_part_* image_restored.tar.gz合并文件gzip -d image_restored.tar.gz解压还原为 .tardocker load -i image_restored.tar加载镜像成功离线环境可用 docker images 查看3. 操作步骤详解3.1 步骤一保存并压缩 Docker 镜像首先在可以访问 Docker Hub 或内部仓库的联网机器上操作。查看镜像列表确认需要导出的镜像名称和标签。dockerimages保存镜像为.tar文件。docker save命令会将镜像及其所有层导出为一个归档文件。dockersave-omy_large_image.tar myregistry.com/myapp:latest-o: 指定输出文件名。请将myregistry.com/myapp:latest替换为你的实际镜像名。压缩.tar文件。为了减少总体积便于分割和传输我们使用gzip进行压缩。gzipmy_large_image.tar执行后会生成my_large_image.tar.gz文件原始.tar文件会被删除。压缩率取决于镜像内容通常可以显著减小体积。3.2 步骤二分割压缩文件使用split命令将大文件分割成小块。这里以每块4GB即4G为例以适应 DVD 光盘。split-b4G my_large_image.tar.gz my_image_part_-b 4G: 指定每个输出文件的大小为 4GB。单位可以是K(KB),M(MB),G(GB)。my_large_image.tar.gz: 需要分割的输入文件。my_image_part_: 输出文件的前缀。分割后的文件将被命名为my_image_part_aa,my_image_part_ab,my_image_part_ac… 依此类推。执行后检查ls-lhmy_image_part_*你应该能看到一系列大小约为 4GB 的文件最后一个文件可能较小。3.3 步骤三分盘刻录现在将每个分割后的文件my_image_part_aa,my_image_part_ab, …分别刻录到不同的光盘上。Windows: 可以使用如ImgBurn、CDBurnerXP或系统自带的刻录功能选择“刻录数据光盘”将单个.part文件拖入并刻录。Linux/macOS: 可以使用brasero、K3b或命令行工具wodim、growisofs。关键提示务必记录好文件的刻录顺序建议在光盘封面或文件名中标记顺序如光盘1_of_3_part_aa这对于后续正确合并至关重要。3.4 步骤四离线环境合并与加载在目标离线服务器或工作站上操作。复制所有分割文件将所有光盘中的my_image_part_*文件复制到服务器上的同一个目录中例如~/offline_images/。合并文件使用cat命令按照字母顺序即aa,ab,ac… 的顺序将所有部分合并成一个完整的.tar.gz文件。cd~/offline_imagescatmy_image_part_*my_large_image_restored.tar.gz解压文件将合并后的压缩包解压还原为 Docker 可识别的.tar格式。gzip-dmy_large_image_restored.tar.gz解压后会得到my_large_image_restored.tar文件。加载 Docker 镜像最后使用docker load命令将镜像导入到本地 Docker 引擎。dockerload-imy_large_image_restored.tar-i: 指定输入文件。验证加载成功后使用docker images命令检查镜像是否已出现在列表中。4. 完整命令示例与验证假设我们有一个名为bigapp:prod的镜像以下是在源机器联网和目标机器离线上执行的完整命令序列对比步骤源机器联网目标机器离线1. 保存docker save -o bigapp.tar bigapp:prod2. 压缩gzip bigapp.tar3. 分割split -b 4G bigapp.tar.gz bigapp_part_4. 刻录(将bigapp_part_aa,ab,ac分别刻盘)5. 复制(将所有bigapp_part_*文件从光盘复制到~/restore/)6. 合并cd ~/restore cat bigapp_part_* bigapp_restored.tar.gz7. 解压gzip -d bigapp_restored.tar.gz8. 加载docker load -i bigapp_restored.tar9. 验证docker images | grep bigapp5. 注意事项与最佳实践校验完整性在刻录前和合并后可以使用md5sum或sha256sum校验源文件和目标文件的一致性确保传输过程没有出错。# 在源机器计算原始压缩包的哈希md5sum my_large_image.tar.gz# 在目标机器计算合并后文件的哈希md5sum my_large_image_restored.tar.gz两个哈希值应该完全相同。处理更多分区如果分割后文件超过 26 个aa到zzsplit命令会自动使用更长的后缀如aaa,aabcat命令合并时能正确识别无需担心。使用更高效的压缩算法如果镜像压缩率不佳可以考虑使用pigz并行 gzip或xz算法以获得更高的压缩比但解压时可能需要相应工具。# 使用 pigz 压缩 (更快)dockersave myapp:latest|pigzmyapp.tar.gz# 使用 xz 压缩 (压缩比更高但更慢)dockersave myapp:latest|xzmyapp.tar.xz直接分割.tar文件如果不进行压缩也可以直接分割docker save产生的.tar文件。但分割后的总文件体积会更大可能需要更多光盘。备选方案私有仓库中转如果条件允许可以在离线网络内部搭建一个私有的 Docker Registry先将镜像推送到内网仓库其他离线机器再从内网仓库拉取。这更适合需要频繁分发镜像的场景。6. 总结通过docker save、gzip、split、cat和docker load这一系列标准 Linux 工具的组合我们可以有效地解决大体积 Docker 镜像的离线物理传输问题。这种方法不依赖于特定商业软件通用性强是系统管理员和运维工程师在面对严格网络隔离环境时的必备技能。关键点在于保持文件顺序和在关键步骤进行完整性校验以确保整个流程万无一失。