Docer Registry HTTP v2 API 需要使用 Bearer Token 才能访问,大大增加了访问难度,像 chsrc 这样的静态链接测速工具难以对 DockerHub 测速。
不测速就不知道各个镜像的质量,实际上很多网络上的镜像站点都是通过 Cloudflare Worker 搭建的。 我想要知道真实的下载速度,所以有了这个脚本。
- 大部分逻辑来自 enihsyou/docker-mirror-hammal 和 Claude 3.5 Sonnet + Gemini 2.5 Pro
- Bash 版本兼容于 Linux/macOS,Powershell 版本兼容于 Windows + Powershell 7
- 镜像列表来自互联网,感谢发布者
- 本代码以 MIT 协议发布
用以下命令一键执行:
bash <(curl -sL "https://gist.githubusercontent.com/enihsyou/dafa9fca2e0db2623ecf7db500842b87/raw/docker-mirror-speedtest.sh")用以下命令一键执行:
irm "https://gist.githubusercontent.com/enihsyou/dafa9fca2e0db2623ecf7db500842b87/raw/docker-mirror-speedtest.ps1" | iex./docker-mirror-speedtest.sh hub2.nat.tf hub1.nat.tf --verbose
.\docker-mirror-speedtest.ps1 hub2.nat.tf -Verbose$ .\scripts\speed-test.ps1
🚀 开始 Docker 镜像站测速...
❌ [docker.1panel.live] 测速异常: 无法获取认证信息 (403 Forbidden)
❌ [docker.1panel.top] 测速异常: 无法获取认证信息 (429 Too Many Requests)
🔑 [docker.m.daocloud.io] 需要认证,正在获取token...
📍 [docker.m.daocloud.io] 获取下载地址...
🏃 [docker.m.daocloud.io] 正在测速...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 513 100 513 0 0 6772 0 --:--:-- --:--:-- --:--:-- 6932
100 20.0M 100 20.0M 0 0 21.6M 0 --:--:-- --:--:-- --:--:-- 40.4M
📊 [docker.m.daocloud.io] 测速结果: DNS解析时间: 0.016131s 连接时间: 0.030032s 总时间: 0.925078s 下载速度: 22670002B/s
❌ [docker.ketches.cn] 测速异常: 无法获取认证信息 (429 Too Many Requests)
🔑 [docker.1ms.run] 需要认证,正在获取token...
📍 [docker.1ms.run] 获取下载地址...
🏃 [docker.1ms.run] 正在测速...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 20.0M 100 20.0M 0 0 11.1M 0 0:00:01 0:00:01 --:--:-- 11.1M
📊 [docker.1ms.run] 测速结果: DNS解析时间: 0.013340s 连接时间: 0.016066s 总时间: 1.790445s 下载速度: 11713021B/s
🚩 [hub1.nat.tf] 无需认证,直接测速...
🏃 [hub1.nat.tf] 正在测速...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 41.8M 100 41.8M 0 0 8974k 0 0:00:04 0:00:04 --:--:-- 10.6M
📊 [hub1.nat.tf] 测速结果: DNS解析时间: 0.013273s 连接时间: 0.015449s 总时间: 4.778494s 下载速度: 9189851B/s
🚩 [hub2.nat.tf] 无需认证,直接测速...
🏃 [hub2.nat.tf] 正在测速...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 41.8M 100 41.8M 0 0 12.3M 0 0:00:03 0:00:03 --:--:-- 12.3M
📊 [hub2.nat.tf] 测速结果: DNS解析时间: 0.009979s 连接时间: 0.013772s 总时间: 3.385906s 下载速度: 12969542B/s
🔑 [hub.rat.dev] 需要认证,正在获取token...
📍 [hub.rat.dev] 获取下载地址...
🏃 [hub.rat.dev] 正在测速...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 264 100 264 0 0 197 0 0:00:01 0:00:01 --:--:-- 197
100 20.0M 100 20.0M 0 0 66379 0 0:05:15 0:05:15 --:--:-- 32764
📊 [hub.rat.dev] 测速结果: DNS解析时间: 0.017731s 连接时间: 0.043667s 总时间: 315.935037s 下载速度: 66379B/s
═══════════════ 测试总结 ═══════════════
% 基本统计
✓ 成功测试: 5
✗ 失败测试: 3
Σ 总计测试: 8
🏆 速度排名:
🥇 [ 1] hub2.nat.tf 25.71 MB/s
🥈 [ 2] docker.m.daocloud.io 2.92 MB/s
🥉 [ 3] hub1.nat.tf 1.64 MB/s
[ 4] docker.1ms.run 378.74 KB/s
[ 5] hub.rat.dev 345.19 KB/s
❌ 失败详情:
• docker.1panel.live
无法获取认证信息 (403 Forbidden)
• docker.1panel.top
无法获取认证信息 (429 Too Many Requests)
• docker.ketches.cn
无法获取认证信息 (429 Too Many Requests)除了用这个脚本进行测速,还有更简单的办法,就是加上完整前缀直接把镜像拉下来。
docker pull docker.gh-proxy.com/nginx
docker pull docker.gh-proxy.com/library/nginx
docker pull docker.gh-proxy.com/docker.io/library/nginx
docker pull docker.1ms.run/library/python
docker pull ghcr.nju.edu.cn/openfaas/queue-worker
docker pull gcr.linkos.org/kubebuilder/kube-rbac-proxy:v0.13.1这个方法的好处是简单,并且适配任意镜像站,即便是需要 login 授权的;
但缺点是会写入磁盘,同名镜像会缓存,要记得删除下载的镜像;测速也得靠记时器或者人工感知。
2025-12 新增了使用 Python 实现的 v2 版,它有更好的扩展性和行为表现
$ uv run .\speedtest.py
Speed Rankings
┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Rank ┃ Domain ┃ Speed ┃ Duration (s) ┃ Size ┃
┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ 1 │ docker.m.ixdev.cn │ 68.17 MB/s │ 0.61 │ 41.88 MB │
│ 2 │ docker.1ms.run │ 5.49 MB/s │ 7.62 │ 41.88 MB │
│ 3 │ hub2.nat.tf │ 2.11 MB/s │ 10.01 (T) │ 21.14 MB │
│ 4 │ docker.cattt.net │ 1.76 MB/s │ 10.02 (T) │ 17.63 MB │
│ 5 │ docker.m.daocloud.io │ 1.21 MB/s │ 10.01 (T) │ 12.15 MB │
│ 6 │ docker.etcd.fun │ 969.77 KB/s │ 10.32 (T) │ 9.77 MB │
└──────┴──────────────────────┴─────────────┴──────────────┴──────────┘
✖ Failure Details
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Domain ┃ Error ┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ docker.xuanyuan.me │ Initial probe failed with status 404. │
│ hub1.nat.tf │ Initial probe failed with status 500. │
│ hub.amingg.com │ Initial probe failed with status 403. │
│ hub.rat.dev │ Cannot connect to registry: SSLError │
└────────────────────┴───────────────────────────────────────┘
$ uv run .\speedtest.py --group ghcr
Speed Rankings
┏━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Rank ┃ Domain ┃ Speed ┃ Duration (s) ┃ Size ┃
┡━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ 1 │ ghcr.nju.edu.cn │ 75.53 MB/s │ 0.75 │ 56.95 MB │
└──────┴─────────────────┴────────────┴──────────────┴──────────┘