告别卡顿!内网服务器如何“优雅”地搬运 Docker 镜像?除了 docker save,你该试试这几招

前言:
做运维或者后端开发的兄弟们,多少都经历过这种绝望时刻:

甲方爸爸的服务器是在纯内网环境(Air-gapped),完全不通外网。

或者,由于最近众所周知的网络原因,在服务器上直接 docker pull 就像在用 2G 网冲浪,进度条卡在 99% 不动了。

这时候,如何把镜像"搬"进去,就成了必须要掌握的生存技能。大多数人只会用最基础的 docker save,但这在很多场景下其实并不优雅。今天分享三种不同维度的离线下载方案,从"常规操作"到"降维打击",总有一款适合你。


方案一:老实人必会 ------ 标准的 Save & Load

适用场景: 你的手边正好有一台装了 Docker 的能联网的机器(比如你的开发机 MacBook 或 Windows Laptop)。

这是最经典的"U 盘拷贝法",原理简单粗暴:在有网的机器上拉取,打包成 tar,传到内网,解压。

1. 打包(Export)

在能联网的机器上执行:

Bash

bash 复制代码
# 1. 先把镜像拉下来
docker pull nginx:alpine

# 2. 打包成 tar 文件(推荐使用 -o 参数指定输出文件名)
docker save -o nginx_alpine.tar nginx:alpine

# 也可以同时打包多个镜像,方便批量迁移
docker save -o infrastructure.tar nginx:alpine redis:alpine mysql:5.7

2. 传输与导入(Import)

通过 SCP、SFTP 或者物理 U 盘将 tar 包上传到内网服务器,然后执行:

Bash

bash 复制代码
# 加载镜像
docker load -i nginx_alpine.tar

❌ 痛点:

  • 依赖重: 你必须在下载端也安装完整的 Docker Desktop/Engine。
  • 速度慢: docker save 导出的包通常未经压缩,体积较大,传输费劲(虽然可以用 gzip 管道压缩,但操作繁琐)。

方案二:降维打击 ------ Skopeo(强推!)

适用场景: CI/CD 流水线、Linux 跳板机、不想安装 Docker 守护进程的轻量级环境。

如果说 Docker 是重型卡车,那 Skopeo 就是瑞士军刀。这是 Red Hat 出品的工具,它最大的优势在于:不需要启动 Docker Daemon 就可以操作镜像。

这意味着,你可以在一台没有任何容器运行时的 Linux 机器上,直接把远程仓库的镜像"扣"下来变成文件。

1. 安装 Skopeo

CentOS/RHEL 系:

Bash

复制代码
yum install skopeo

MacOS:

Bash

复制代码
brew install skopeo

2. 直接从远程仓库 Copy 到本地文件

注意看,这里不需要 docker pull,直接一步到位:

Bash

go 复制代码
# 格式:skopeo copy docker://<镜像名> docker-archive:<本地文件名>

skopeo copy docker://alpine:latest docker-archive:alpine-offline.tar

✅ 优势:

  • 轻量级: 不需要 root 权限,不需要 Docker 守护进程。
  • 支持多架构: 可以通过 --override-arch 参数下载 ARM 架构的镜像(哪怕你用的是 x86 的机器),这对于给国产化服务器(鲲鹏、飞腾)准备镜像简直是神技。

Bash

csharp 复制代码
# 在 x86 机器上下载 ARM64 架构的镜像
skopeo copy --override-arch arm64 docker://nginx:latest docker-archive:nginx-arm64.tar

方案三:极客玩法 ------ 无环境纯脚本下载

适用场景: 手头只有一台 Windows 办公机,不想装 Docker Desktop,不想装虚拟机,只想搞个文件下来。

这时候我们可以利用 Docker Registry V2 的 API 原理,通过 Python 或 Shell 脚本直接模拟 HTTP 请求把层(Layers)拉下来并拼装。

这里推荐一个开源项目:docker-drag(或者类似的 Shell 脚本变种)。

1. 获取工具

GitHub 上有很多类似的脚本,比如 moby/moby 官方库里的 download-frozen-image-v2.sh,或者社区的 docker-drag

以一个简化的 Python 脚本为例(假设工具名为 docker_pull.py):

2. 执行下载

Bash

bash 复制代码
# 不需要 Docker 环境,只要有 Python 即可
python docker_pull.py nginx:latest

它会自动分析 Manifest,并发下载所有的 Layers,最后生成一个标准的 Docker Tarball。

✅ 优势:

  • 零依赖: 有 Python 或者 Bash 就能跑。
  • 救急专用: 在极端受限的跳板机上,连 Skopeo 都没法装的时候,拷贝一个脚本进去就能干活。

总结:该怎么选?

方案 工具 核心特点 推荐指数 适用场景
方案一 Docker CLI 稳健、普适 ⭐⭐⭐ 个人电脑已装 Docker,偶尔传一两个镜像
方案二 Skopeo 专业、灵活 ⭐⭐⭐⭐⭐ 运维大批量操作、CI/CD 流水线、跨架构下载
方案三 脚本/API 极致轻量 ⭐⭐⭐ 临时救急、无权限安装软件的跳板机

💡 最后的建议:

如果你是负责维护基础设施的(比如我),强烈建议在你的工具箱里备好 Skopeo。当你需要给内网的 Kubernetes 集群搬运几百个镜像,或者需要精准控制镜像架构(amd64/arm64)时,你会回来感谢我的。


欢迎点赞收藏,咱们下期聊聊如何搭建企业级私有仓库 Harbor。

相关推荐
忆~遂愿21 小时前
CANN metadef 核心解析:计算图原型定义、算子元数据抽象与异构系统互操作机制
docker·容器
说实话起个名字真难啊1 天前
用docker来安装openclaw
docker·ai·容器
恬静的小魔龙1 天前
【群晖Nas】群晖Nas中实现SVN Server功能、Docker/ContainerManager等
docker·svn·容器
Zfox_1 天前
CANN Catlass 算子模板库深度解析:高性能 GEMM 融合计算、Cube Unit Tiling 机制与编程范式实践
docker·云原生·容器·eureka
春日见1 天前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
DARLING Zero two♡1 天前
告别 Docker 命令行!Portainer+cpolar 让容器管理从局域网走向公网
运维·docker·容器
liu****1 天前
2.深入浅出理解虚拟化与容器化(含Docker实操全解析)
运维·c++·docker·容器·虚拟化技术
logocode_li1 天前
OCI/CRI 双标准下:从 dockerd 到 containerd 的 K8s 运行时迭代史
docker·云原生·容器·k8s
_运维那些事儿2 天前
VM环境的CI/CD
linux·运维·网络·阿里云·ci/cd·docker·云计算
lpruoyu2 天前
【Docker进阶-05】Docker网络
网络·docker·容器