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

相关推荐
面对疾风叭!哈撒给1 小时前
Docker之 Portainer、Node-RED和EMQX安装与配置
运维·docker·容器
小吃饱了2 小时前
docker制作镜像
运维·docker·容器
Radan小哥2 小时前
Docker学习笔记—day008
笔记·学习·docker
哥哥还在IT中2 小时前
Docker的Cgroup Driver设置为Cgroupfs 和 Systemd 的区别
运维·docker·容器
java_logo2 小时前
LobeHub Docker 容器化部署指南
运维·人工智能·docker·ai·容器·ai编程·ai写作
qinyia3 小时前
WisdomSSH解决因未使用Docker资源导致的磁盘空间不足问题
运维·服务器·人工智能·后端·docker·ssh·github
❀͜͡傀儡师3 小时前
Docker 一键安装godoos
运维·docker·容器
Broken Arrows4 小时前
Docker原理之一的Namespace详解
运维·docker·容器
一夜空中最亮的星一20 小时前
【Linux】ubuntu24.04 安装docker
linux·docker·eureka