告别卡顿!内网服务器如何“优雅”地搬运 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。

相关推荐
hopsky1 天前
Docker Desktop 报 500
运维·docker·容器
曦云沐1 天前
一键部署ROS2开发环境!Docker run命令详解与实战
docker·容器·ros2
H Journey1 天前
Docker swarm 集群搭建实战
运维·docker·容器
江湖有缘1 天前
Docker环境下使用RustScan端口扫描工具教程
运维·docker·容器
70asunflower1 天前
镜像仓库(Image Registries)详解
linux·docker·容器
青树寒鸦1 天前
wsl的docker备份redis和迁移
redis·docker·容器
岩屿1 天前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net
hopsky1 天前
限制 Docker Desktop 的资源使用
运维·docker·容器
春日见1 天前
docker崩溃,闪退,与vscode断开连接
vscode·docker·容器
Suchadar1 天前
Docker搭建Web测试靶场
运维·docker·容器