在国内网络环境下做 Docker 开发和运维,很多人都踩过同一个坑:
docker pull拉国外镜像,卡在几十 KB/s- CI/CD 构建时偶发超时,流水线一会儿红一会儿绿
- 生产环境不允许直接访问 Docker Hub,只能走内网仓库
- 想把一批镜像迁到私有仓库,结果只能一台机器一条条
pull/tag/push - 离线环境、内外网隔离环境下,镜像同步又麻烦又慢
很多团队的第一反应是:
配 Docker 镜像加速器、手动拉取后再推送到 Harbor、写 Shell 循环同步。这些方法不能说错,但都不够优雅,也不够稳。
这篇文章我想讲清楚一个非常实用、但国内很多开发和运维还没真正用起来的工具:Skopeo。
它特别适合解决这类问题:
- 国内网络环境下的 Docker 镜像迁移与加速
- Docker Hub / Quay / GCR 镜像同步到私有仓库
- 不落地镜像直接在仓库之间拷贝
- 离线环境镜像导出、导入、批量同步
- 无需 Docker Daemon 的镜像检查与复制
一句话概括:
Skopeo 的核心价值,就是让你“跳过本地 Docker 守护进程”,直接在镜像源和镜像目标之间做检查、迁移和同步。
这对国内网络环境尤其有用。
一、为什么国内网络环境下,Docker 镜像迁移与加速这么痛?
先说结论:
很多慢,不是你的机器慢,而是你的链路和使用方式本身就低效。
1.1 常见低效链路
很多团队平时迁移镜像是这么干的:
docker pull nginx:1.27 docker tag nginx:1.27 harbor.company.local/base/nginx:1.27 docker push harbor.company.local/base/nginx:1.27看起来很正常,但本质上你走的是这条链路:
远程镜像仓库 Docker Hub
本机 docker daemon
本地磁盘解包/缓存
内网 Harbor / 私有仓库
这条链路的问题很明显:
- 必须先完整拉到本地
- 依赖 Docker Daemon
- 占本地磁盘
- 批量同步时非常慢
- CI 机器要有 Docker 权限
- 多架构镜像、manifest list 处理不直观
对于“只是想把镜像从 A 仓库搬到 B 仓库”的场景,这个流程其实绕远了。
二、Skopeo 是什么?为什么它适合国内 Docker 镜像迁移与加速?
Skopeo 是一个容器镜像操作工具,主要能力包括:
- 查看远程镜像信息
- 在不同镜像存储之间直接复制镜像
- 删除仓库中的镜像
- 同步整个镜像仓库
- 支持 Docker Registry、OCI、本地目录、docker-archive 等多种格式
它最关键的两个特点是:
2.1 不依赖 Docker Daemon
也就是说,很多操作不需要:
- 启动 Docker
- 有 root 权限
- 把镜像先拉到本地
2.2 可以直接在仓库之间复制镜像
这就是它最值钱的地方。
比如你可以直接把 Docker Hub 的镜像复制到 Harbor:
skopeo copy docker://docker.io/library/nginx:1.27 docker://harbor.company.local/library/nginx:1.27注意,这里不是:
- 先 pull
- 再 tag
- 再 push
而是直接 copy。
这条链路会变成:
远程仓库 Docker Hub
Skopeo
目标仓库 Harbor
中间少了本地 Docker Daemon,也通常少了很多无意义的本地存储开销。
三、Skopeo 能解决哪些典型问题?
围绕“国内网络环境下的 Docker 镜像迁移与加速”,Skopeo 最常见的几个落地场景如下。
3.1 场景一:把公网镜像迁移到内网 Harbor
比如你的 Kubernetes 集群只能拉 Harbor,不能直接访问 Docker Hub。
那你要做的不是让每台机器都科学拉镜像,而是:
在一台能访问外网的中转机上,用 Skopeo 把镜像同步到 Harbor。
3.2 场景二:做企业内部镜像缓存仓库
很多公司会有统一基础镜像:
nginxredismysqlopenjdkalpinebusyboxnodepython
可以定期同步到企业仓库,所有开发和集群统一从内网拉,速度稳定得多。
3.3 场景三:离线环境镜像打包与迁移
如果生产环境完全离线,可以这样处理:
- 外网机器用
skopeo copy导出为docker-archive - U 盘/介质带到内网
- 内网再导入目标仓库或 Docker
3.4 场景四:批量同步镜像,替代手写脚本docker pull/tag/push
如果你有几十上百个镜像版本要同步,Skopeo 的sync会比手工脚本更清晰。
四、先安装 Skopeo
官方支持很多发行版,安装很简单。
4.1 Ubuntu / Debian
sudo apt-get update sudo apt-get install -y skopeo4.2 CentOS / RHEL / Rocky / AlmaLinux
sudo yum install -y skopeo或:
sudo dnf install -y skopeo4.3 macOS
brew install skopeo4.4 验证安装
skopeo --version五、先理解 Skopeo 最重要的几个概念
如果你是第一次接触 Skopeo,这几个前缀一定要先认清。
5.1docker://
表示远程镜像仓库中的镜像。
例如:
docker://docker.io/library/nginx:1.27 docker://harbor.company.local/base/redis:7.25.2docker-archive:
表示docker save格式的 tar 文件。
例如:
docker-archive:/tmp/nginx.tar5.3dir:
表示一个本地目录格式,适合调试和查看层文件。
5.4oci:
表示 OCI 镜像布局目录。
六、国内网络环境下 Docker 镜像迁移与加速的 4 种实战方式
下面直接上最有用的部分。
6.1 方式一:直接从公网仓库复制到私有仓库
这是最推荐的方式。
6.1.1 登录目标仓库
比如 Harbor:
skopeo login harbor.company.local输入账号密码即可。
6.1.2 复制镜像
skopeo copy \ docker://docker.io/library/nginx:1.27 \ docker://harbor.company.local/library/nginx:1.27命令解释
skopeo copy \ docker://docker.io/library/nginx:1.27 \ docker://harbor.company.local/library/nginx:1.27skopeo copy:复制镜像- 第一个地址:源镜像
- 第二个地址:目标镜像
- 中间不需要先
docker pull
对比:错误写法 vs 更优写法
传统写法
# 传统方式:依赖 docker daemon,本地要落盘 docker pull nginx:1.27 docker tag nginx:1.27 harbor.company.local/library/nginx:1.27 docker push harbor.company.local/library/nginx:1.27更优写法
# 推荐方式:直接仓库到仓库复制 skopeo copy \ docker://docker.io/library/nginx:1.27 \ docker://harbor.company.local/library/nginx:1.27为什么更优?
- 少一次本地落盘
- 不依赖 Docker Daemon
- 更适合批量同步
- 更适合 CI/CD 中转机
- 更适合受限服务器环境
⚠️避坑点:目标仓库项目要提前存在
很多 Harbor 配置下,项目不存在时不会自动创建,直接报错。
6.2 方式二:先导出为 tar,再带到离线环境
如果你的生产环境完全无法联网,这种方式最实用。
6.2.1 从公网仓库导出为 Docker Archive
skopeo copy \ docker://docker.io/library/redis:7.2 \ docker-archive:/tmp/redis_7.2.tar:redis:7.2解释
这里的目标:
docker-archive:/tmp/redis_7.2.tar:redis:7.2含义是:
- 导出成
docker save兼容格式 tar 包 - 文件路径:
/tmp/redis_7.2.tar - 镜像名标签:
redis:7.2
6.2.2 在离线机器中导入 Docker
docker load -i /tmp/redis_7.2.tar6.2.3 再推送到内网私有仓库
docker tag redis:7.2 harbor.company.local/base/redis:7.2 docker push harbor.company.local/base/redis:7.2对比:错误理解 vs 正确认知
错误理解
Skopeo 只能在联网仓库之间复制,离线没法用。
正确认知
Skopeo 支持: