Docker 镜像在节点间的高效拷贝的方案

Docker 镜像在节点间的高效拷贝的方案

你想把 Docker 镜像从一个节点(机器)拷贝到另一个节点使用,核心有 2 种核心方案(「导出/导入」适合无私有仓库的场景,「仓库推送/拉取」适合长期复用/多节点分发),我会详细讲解步骤,兼顾操作便捷性和避坑要点,适配所有 Docker 环境。


方案1:镜像「导出为本地文件」→「拷贝文件」→「导入为镜像」(无仓库必备,最常用)

该方案通过 docker save 将镜像打包为本地 .tar 文件,通过U盘、FTP、SCP 等方式拷贝到目标节点,再用 docker load 导入为可使用的 Docker 镜像,适合跨网络、无私有仓库的场景。

步骤1:源节点(有镜像的机器)- 导出 Docker 镜像

1.1 先查看要导出的镜像信息(获取镜像名+标签)
Bash 复制代码
# 列出本地所有镜像,找到目标镜像的 REPOSITORY(镜像名)和 TAG(标签)
docker images

# 示例输出(目标镜像:my-custom-image:v1.0,IMAGE ID:1234567890ab)
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
my-custom-image     v1.0      1234567890ab   2 hours ago     800MB
ubuntu              latest    abcdef123456   2 weeks ago     72MB
1.2 执行导出命令(docker save

核心语法:docker save -o 本地输出文件路径/镜像包名.tar 镜像名:标签

Bash 复制代码
# 示例1:导出 my-custom-image:v1.0 为当前目录下的 my-custom-image-v1.0.tar
docker save -o my-custom-image-v1.0.tar my-custom-image:v1.0

# 示例2:同时导出多个镜像到同一个 tar 包(可选,适合批量拷贝)
docker save -o multi-images.tar my-custom-image:v1.0 ubuntu:latest

# 示例3:指定输出目录(导出到 /tmp 目录下)
docker save -o /tmp/my-custom-image-v1.0.tar my-custom-image:v1.0
1.3 验证导出文件是否生成
Bash 复制代码
# 查看 tar 包是否存在(以当前目录为例)
ls -l my-custom-image-v1.0.tar

若能看到对应的 .tar 文件,说明导出成功(文件大小与镜像大小接近,正常)。

步骤2:将 tar 包拷贝到目标节点

通过任意文件传输方式将 .tar 包拷贝到目标节点(无 Docker 环境限制,只要能传输文件即可),推荐 2 种常用方式:

方式A:SCP 直接跨机器传输(适合两台机器网络互通)
Bash 复制代码
# 从源节点执行:拷贝本地 tar 包到目标节点的 /tmp 目录下
# 语法:scp 本地tar包路径 目标节点用户@目标节点IP:目标节点保存路径
scp my-custom-image-v1.0.tar root@192.168.1.200:/tmp/

执行后输入目标节点的登录密码,等待传输完成即可(大镜像传输耗时较长,耐心等待)。

方式B:其他传输方式(适合网络不通)
  • 拷贝到 U 盘、移动硬盘,再挂载到目标节点;

  • 通过 FTP、网盘等工具中转传输;

  • 核心:确保 .tar 包完整拷贝到目标节点的任意可访问目录(如 /tmp//home/)。

步骤3:目标节点(要使用镜像的机器)- 导入 Docker 镜像

3.1 执行导入命令(docker load

核心语法:docker load -i 拷贝过来的tar包路径

Bash 复制代码
# 进入 tar 包所在目录(以 /tmp 为例)
cd /tmp/

# 导入镜像(-i 指定输入的 tar 包文件)
docker load -i my-custom-image-v1.0.tar
3.2 验证导入是否成功
Bash 复制代码
# 列出本地镜像,查看是否存在导入的镜像
docker images

若能看到 my-custom-image:v1.0 镜像,说明导入成功,可直接用该镜像启动容器(docker run -it my-custom-image:v1.0)。

方案1 关键注意事项

  1. 保留镜像信息docker save 会保留镜像的「名称、标签、分层结构」,导入后可直接使用原镜像名启动容器;

  2. 避免损坏 tar 包 :传输过程中确保 .tar 包完整(大镜像推荐校验文件MD5),损坏的包会导致导入失败;

  3. 与 ** docker export ** 的区别 :不要混淆 docker save(针对「镜像」)和 docker export(针对「容器」),docker export 导出的是容器快照,丢失分层结构,无法作为镜像复用;

  4. 导入权限 :目标节点需安装 Docker 且当前用户有 Docker 操作权限(或用 sudo 执行)。


方案2:通过「仓库」推送/拉取镜像(长期复用,多节点分发推荐)

该方案将镜像推送到「公共仓库(Docker Hub)」或「私有仓库(Harbor、Docker Registry)」,目标节点从仓库拉取镜像,适合长期维护、多节点分发、团队协作的场景,是生产环境最佳实践。

场景2.1:推送至公共仓库(Docker Hub,免费,适合公开镜像)

步骤1:源节点 - 登录 Docker Hub
Bash 复制代码
# 执行登录命令,输入 Docker Hub 账号和密码
docker login

提示 Login Succeeded 即为登录成功。

步骤2:源节点 - 给镜像打标签(符合 Docker Hub 规范)

Docker Hub 镜像标签格式:Docker Hub 用户名/镜像名:标签,必须符合该格式才能推送。

Bash 复制代码
# 语法:docker tag 原镜像名:原标签 DockerHub用户名/新镜像名:新标签
# 示例:将 my-custom-image:v1.0 打标签为 zhangsan/my-custom-image:v1.0(zhangsan 为 Docker Hub 用户名)
docker tag my-custom-image:v1.0 zhangsan/my-custom-image:v1.0
步骤3:源节点 - 推送镜像到 Docker Hub
Bash 复制代码
# 语法:docker push DockerHub用户名/镜像名:标签
docker push zhangsan/my-custom-image:v1.0

推送耗时取决于镜像大小和网络速度,耐心等待(提示 latest: pushed 即为推送成功)。

步骤4:目标节点 - 拉取镜像(无需拷贝文件,直接拉取)
Bash 复制代码
# 语法:docker pull DockerHub用户名/镜像名:标签
docker pull zhangsan/my-custom-image:v1.0

拉取完成后,执行 docker images 即可看到镜像,可直接使用。

场景2.2:推送至私有仓库(Harbor/Docker Registry,推荐生产环境,私有安全)

前置准备
  1. 已搭建私有仓库(如 Harbor,地址:https://192.168.1.100);

  2. 源节点和目标节点均能访问私有仓库地址(防火墙/安全组放行对应端口);

  3. 私有仓库已创建项目(如 my-project),并拥有推送/拉取权限。

步骤1:源节点 - 登录私有仓库
Bash 复制代码
# 语法:docker login 私有仓库地址
docker login 192.168.1.100

输入私有仓库的账号和密码,提示 Login Succeeded 即为登录成功。

步骤2:源节点 - 给镜像打标签(符合私有仓库规范)

私有仓库镜像标签格式:私有仓库地址/项目名/镜像名:标签

Bash 复制代码
# 示例:将 my-custom-image:v1.0 打标签为 192.168.1.100/my-project/my-custom-image:v1.0
docker tag my-custom-image:v1.0 192.168.1.100/my-project/my-custom-image:v1.0
步骤3:源节点 - 推送镜像到私有仓库
Bash 复制代码
# 语法:docker push 私有仓库标签镜像名
docker push 192.168.1.100/my-project/my-custom-image:v1.0
步骤4:目标节点 - 登录并拉取镜像
Bash 复制代码
# 1. 登录私有仓库(首次拉取需登录)
docker login 192.168.1.100

# 2. 拉取镜像
docker pull 192.168.1.100/my-project/my-custom-image:v1.0

方案2 关键注意事项

  1. 标签规范:镜像标签必须符合仓库格式要求,否则无法推送;

  2. 私有仓库访问:若私有仓库未配置 HTTPS,需在 Docker 配置中添加「不安全仓库」(否则推送/拉取失败);

  3. 权限管理:私有仓库需给用户分配对应项目的推送/拉取权限,避免权限不足报错;

  4. 镜像清理 :推送成功后,可删除本地多余的标签镜像(docker rmi 标签名),释放磁盘空间。


两种方案对比与场景选择

方案 优点 缺点 适用场景
导出/导入(tar 包) 无需仓库、无网络限制、操作简单 镜像包体积大、传输慢、无法增量更新 跨网络、无私有仓库、单次少量镜像拷贝
仓库推送/拉取 支持增量更新、传输高效、多节点复用、安全 需搭建/访问仓库、依赖网络、配置稍复杂 生产环境、多节点分发、长期维护、团队协作

常见问题排查

  1. 导入镜像失败:unexpected EOF

    • 原因:tar 包传输过程中损坏或不完整;

    • 解决:重新传输 tar 包,校验文件 MD5 确保完整。

  2. 推送镜像失败:request canceled while waiting for connection

    • 原因:网络不通,无法访问仓库地址;

    • 解决:检查防火墙/安全组,确保能 ping 通仓库地址,放行对应端口(Docker Hub 443,私有仓库默认 80/443)。

  3. 拉取私有镜像失败:unauthorized: authentication required

    • 原因:未登录私有仓库,或权限不足;

    • 解决:执行 docker login 私有仓库地址 登录,确认用户拥有对应项目的拉取权限。

  4. **镜像导入后无标签(显示 ** <none>:<none>

    • 原因:导出时镜像无有效标签,或导入过程中标签丢失;

    • 解决:导入后用 docker tag 镜像ID 新镜像名:新标签 手动添加标签。


常用扩展命令

场景 命令
查看镜像分层信息 docker history 镜像名:标签
删除本地无用镜像 docker rmi 镜像名:标签(或镜像ID)
校验 tar 包完整性 md5sum 镜像包.tar(源节点和目标节点对比MD5值)
登出 Docker 仓库 docker logout(或 docker logout 私有仓库地址

总结

  1. 快速单次拷贝 :优先用「导出/导入」方案,核心命令 docker save -o 包名.tar 镜像名:标签docker load -i 包名.tar

  2. 长期多节点分发:优先用「仓库推送/拉取」方案,符合生产环境最佳实践,支持增量更新和权限管理;

  3. 避坑核心 :导出镜像用 docker save 而非 docker export,镜像标签需符合仓库规范,传输文件确保完整性;

  4. 权限要求 :所有操作需拥有 Docker 操作权限(或用 sudo 执行),目标节点需提前安装 Docker 环境。

配置完成后,目标节点即可使用导入/拉取的镜像启动容器,功能与源节点的镜像完全一致。

相关推荐
firstacui2 小时前
搭建harbor仓库
linux·docker
niceffking2 小时前
Linux信号相关函数
linux·运维·服务器·linux信号
蚰蜒螟2 小时前
Linux 7 中的系统调用原理
linux·运维·服务器
Reuuse2 小时前
【linux】进程间通信
linux·运维·服务器
Cyber4K2 小时前
【Kubernetes专项】K8s 控制器 DaemonSet 从入门到企业实战应用
云原生·容器·kubernetes
Pluto_CSND2 小时前
CentOS系统中创建定时器
linux·运维·centos
好好沉淀2 小时前
Docker 部署 Kibana:查 ES 版本 + 版本匹配 + 中文界面
linux·docker
!chen2 小时前
PLG log server note
运维·jenkins