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

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

在这里插入图片描述

一、 概述与应用场景

在企业级部署中,经常会有生产服务器或客户环境处于网络隔离状态(即“离线环境”或“空气间隙网络”)。这种情况下,无法直接使用 docker pull 从互联网拉取镜像。本教程提供的方案通过将镜像打包成静态文件,再通过物理介质(如U盘、硬盘)或内部网络传输,实现 Docker 应用的离线部署。

核心命令:

  • docker save: 将一个或多个镜像打包保存到一个tar归档文件(通常称为“镜像包”)。
  • docker load: 从一个tar归档文件中加载镜像及其标签。

流程简图:
在线机器 (有网络) -> docker save -> .tar 文件 -> 拷贝至离线机器 -> docker load -> 离线机器 (无网络)


二、 环境准备与前提条件

  1. 源机器(在线,用于打包镜像)

    • 安装 Docker Engine,版本与目标机器尽量保持一致。
    • 拥有 sudo 权限的用户。
    • 能够访问互联网,已通过 docker pull 获取所需镜像。
  2. 目标机器(离线,需要部署)

    • 安装 相同版本或更高版本 的 Docker Engine。(docker load 对低版本兼容性不佳,高版本加载低版本保存的镜像通常没问题)。
    • 拥有 sudo 权限的用户。
    • 确保有足够的磁盘空间存放镜像包和加载后的镜像。
  3. 传输媒介

    • U盘、移动硬盘,或内部局域网的文件共享服务(如SSH, SCP, FTP, NFS)。

检查Docker版本(两台机器上都应执行):

docker --version
AI构建项目bash1

三、 详细操作步骤

步骤 1:在在线机器上获取并打包镜像

  1. 拉取所需镜像
    使用 docker pull 获取你项目需要的所有镜像。例如,我们需要部署一个Nginx应用:

    sudo docker pull nginx:latest
    sudo docker pull mysql:8.0
    AI构建项目bash12
    
  2. 查看已下载的镜像
    确认镜像已正确下载,并记录下它们的 REPOSITORYTAG

    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
    
  3. 使用 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: 指定输出文件的路径和名称。
  4. (可选)验证打包的文件
    生成的 .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:在离线机器上加载镜像

  1. 使用 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归档文件。
  2. 查看加载结果
    加载命令执行后,终端会输出 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 命令手动打标签。


四、 关键细节与注意事项

  1. Docker版本兼容性

    • 强烈建议目标机器的Docker版本 >= 源机器的Docker版本。用低版本Docker加载高版本Docker保存的镜像很可能失败。这是最常见的问题。
  2. 镜像标签(Tag)的管理

    • docker save 默认会保存镜像的标签。但如果你的镜像在打包前是通过 IMAGE ID 操作的,加载后可能会变成 <none> 标签。
    • 解决方法:在加载后使用 docker tag <IMAGE_ID> <new-name:new-tag> 重新打标签。
    • 最佳实践:在打包前,确保所有镜像都有明确且唯一的 名称:标签
  3. 空间问题

    • 确保离线机器有足够的磁盘空间。镜像包的大小基本等于 docker images 中显示的镜像大小之和。加载时,Docker需要额外空间来解压和存储,所以所需空间可能是镜像包的两倍。
  4. docker export/import 的区别

    • docker save / docker load:针对的是镜像(Image),会完整保存镜像的所有层、历史和历史命令。这是迁移镜像的标准方法
    • docker export / docker import:针对的是容器(Container),它将一个运行中的容器文件系统导出为一个快照,会丢弃历史和历史命令,导致镜像体积略小,但丢失了大量信息。不推荐用于镜像迁移
  5. 批量处理

    • 如果需要迁移的镜像非常多,可以编写简单的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
    
  6. 安全考量

    • 镜像包可能包含敏感信息(如代码、密码)。在传输和存储过程中,应注意其安全性,必要时进行加密。

五、 总结

通过 docker savedocker load 进行离线迁移是一个简单、可靠且官方的方案。需要注意的点在于:

  1. 环境一致:确保目标机Docker版本不低于源机。
  2. 标签清晰:打包前确保镜像都有明确标签。
  3. 空间充足:检查磁盘空间是否足够。

完成镜像加载后,便可以在离线机器上使用标准的 docker run或者 docker compose等命令,通过迁移的镜像来创建和运行容器,完成整个项目的离线部署。
在这里插入图片描述

posted @ 2025-11-28 15:33  xiondun  阅读(0)  评论(0)    收藏  举报