先说个大多数人都遇到过的场景:新机器装好 Docker 之后,兴冲冲执行docker pull nginx:alpine,结果进度条在 1% 徘徊五分钟,最后给你甩一个connection refused或者EOF。这不是你的网络烂,而是你的机器默认在跟海外的 Docker Hub 直接通信,链路长、不稳定、还会被限速。我从入行第一天就在跟“Docker 国内镜像源”这件事打交道,这种坑踩过的次数多得数不过来,所以每年都会定期把全网流传的加速源重新测一遍。今天正好是 9 月 10 日,就顺手把 2026 年这一轮的更新结果整理出来:哪些源还在用、哪些源已经悄悄死掉、不同系统怎么配置、配置完为什么还是慢,一次说透。
这篇文章适合几类人看:刚装好 Docker 但连第一个镜像都拉不下来的新手;已经配置过daemon.json但对时效性没有把握的开发者;以及要给团队维护一份稳定镜像加速配置的运维同学。后面不仅会给出 2026 年 9 月还存活的可加速镜像源地址,还会专门讲一个被很多人忽略的事实:Docker 镜像源不是万能的,很多第三方仓库根本不走这个通道,光配一个源解决不了所有下载慢的问题。
1. 为什么镜像加速就是“绕一条近路”:先搞懂镜像下载链路
先花两分钟把原理理清楚。Docker 拉取镜像的默认路径其实是这样的:当你执行docker pull nginx:alpine,Docker 守护进程会直接请求 Docker Hub 的 Registry API,然后把镜像层文件一个一个下载到本地。这个路径本身没有任何问题,问题出在 Docker Hub 的服务器主要部署在海外,国内访问过去中间要经过大量国际链路和跨境节点,任何一个环节抖动,你的下载就会变慢甚至中断。
镜像源加速做的事情并不复杂,就是在这条长链路中间插入一个“国内中转站”。你在daemon.json里配置的registry-mirrors并不是让你绕开 Docker Hub,而是告诉 Docker 守护进程:先去那儿取货,取不到再去 Docker Hub。本质上,镜像源就是一个基于 Docker Registry API 的缓存代理,它替你从 Docker Hub 拉取镜像,再把镜像层转交给你。因为中转站部署在国内,你和它之间的链路是短暂的、质量可控的,所以整体速度被大幅拉高。
这里有一个非常关键的认知要建立:registry-mirrors只对 Docker Hub 官方仓库生效。什么意思?如果你拉的是nginx、redis、mysql这种在 Docker Hub 官方命名空间下的镜像,加速源就能发挥作用。但如果你拉的是ghcr.io/xxx/xxx、quay.io/xxx/xxx、gcr.io/google-containers/pause这种第三方 Registry 域名下的镜像,registry-mirrors完全不起作用。很多人配置完镜像源之后发现“还是慢”,大概率就是拉错了仓库域名。
另一个容易被忽略的点是:镜像源并不是永久的。不少公开加速源是个人或公益组织维护的,哪天维护者不想干了、流量费扛不住了、或者域名被风控了,源就悄悄下线。你要持续用,必须定期验证。这也是为什么每年都有人更新“国内镜像源加速列表”,而你也别把任何人的列表当成永久答案,包括我这份。
理解了这两点,后面所有配置和排错就有了判断依据。
2. 2026年9月实测还能用的国内镜像源榜单
先说测试方法,免得被人说我瞎编。我这轮验证用的是一台干净的全新 Ubuntu 22.04 服务器,内存 4G,带宽 30M,位于国内某主流机房。测试手段分两层:第一层是直接用curl -s -o /dev/null -w "%{http_code} %{time_total}" https://<镜像源>/v2/检查源的健康状态和响应耗时,因为/v2/是 Docker Registry API 的基础健康检查端点,能返回 200 就说明这个源起码是活着的;第二层是真实执行time docker pull hello-world和time docker pull nginx:alpine,看实际拉取是否成功、耗时多久。每三天测一轮,从 9 月初测到 9 月 10 日,取稳定的结果。
下面是截至 2026 年 9 月 10 日仍然可用的列表,使用前请以你的实测为准:
| 镜像源名称 | 地址 | 类型 | 是否需要账号 | 实测状态 |
|---|---|---|---|---|
| 阿里云容器镜像加速器 | https://<你的专属ID>.mirror.aliyuncs.com | 云厂商官方 | 需要 | 稳定,推荐生产使用 |
| 中科大 Docker 镜像 | https://docker.mirrors.ustc.edu.cn | 高校/社区 | 不需要 | 可用,偶有波动 |
| 网易 Docker 镜像 | https://hub-mirror.c.163.com | 商业公司 | 不需要 | 可用,速度和稳定性中规中矩 |
| 百度镜像加速 | https://mirror.baidubce.com | 云厂商官方 | 不需要 | 可用,适合做备用源 |
| 腾讯云内网镜像 | https://mirror.ccs.tencentyun.com | 云厂商官方 | 不需要 | 仅在腾讯云内网速度快 |
| DaoCloud 社区源 | https://docker.m.daocloud.io | 社区 | 不需要 | 可用性波动大,快的时候很快 |
| 1Panel 社区源 | https://docker.1panel.live | 社区 | 不需要 | 可用性波动大,适合临时兜底 |
逐个展开说说,方便你按自己的场景选。
阿里云专属加速器是我最推荐的长效方案,也是目前唯一一个能让你长期稳定使用的源。它需要你登录阿里云账号,去“容器镜像服务”控制台找到“镜像加速器”,页面会自动生成一个专属地址。任何云厂商的镜像加速器都是这个逻辑:只给自家用户分配专门节点,避开公共拥堵。缺点就是要登录账号、要实名,对某些人不方便。但对于有长期镜像拉取需求的环境,花五分钟注册一下绝对是值的。
中科大源是学术机构维护的老牌源,存在时间很长,网上很多教程推过它。实测下来它在 2026 年 9 月依然能用,但响应速度受时段影响比较大,晚上高峰时段出现 2-3 秒的连接延迟很正常。我建议把它放进备用列表,不要当唯一主力,因为高校出口的带宽资源也不是无限的。
网易源是我印象里古早时期就出现的源,2026 年测下来依然活着,速度不算最快,但胜在稳定,没有出现过长时间 5xx 的情况。如果你不愿意注册任何账号,又想要一个相对靠谱的公共源,可以先写这个。
百度源mirror.baidubce.com是百度智能云旗下的入口,公共可用,实测拉取nginx:alpine的速度非常快。不过它的定位更偏向云服务配套,官方更新策略不透明,哪天调整配置也不奇怪,所以放到备用位比主力位合适。
腾讯云源需要特别提醒:mirror.ccs.tencentyun.com这个地址只有在腾讯云内网才快,你拿着它去自己家里或公司办公网配置,效果不会比直连 Docker Hub 好多少。腾讯云机器上直接用它没问题,但非腾讯云环境建议忽略。
DaoCloud 和 1Panel 这类社区源属于“高风险高收益”。好处是免登录、没有任何账号门槛、高峰期速度甚至能跑满带宽;坏处是可用性完全取决于维护者的心情和资金状况,历史上出现过突然关停的情况,今天能用不代表明天还能用。你可以把它们塞进配置列表的最后一位当兜底,但千万别在生产环境把它当成唯一依赖。
最后多说一句:很多十几年前的教程里推的 Docker 官方中国镜像、Azure 中国镜像,实测已经彻底失效,别再往daemon.json里写了。判断一个老教程是否过期的简单方法就看它有没有给你阿里云专属地址,凡是没让你注册账号就能拿到一长串稳定地址的,基本都不太靠谱。
3. 三种主流环境的镜像源配置:Linux、Windows、macOS
配置镜像源这件事,不同系统差得挺远。如果你只在一个环境工作,直接跳到对应小节;如果要给团队出方案,最好三个环境都带着看一遍,因为开发机和生产机的日常维护姿势完全不同。
3.1 Linux 环境:编辑 daemon.json 并重启服务
Linux 下配置镜像源是理解整个机制的基础。Docker 守护进程的配置统一写在/etc/docker/daemon.json文件里,如果文件不存在就新建一个,然后写入镜像源列表:
{ "registry-mirrors": [ "https://<你的专属ID>.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] }这里我习惯把最稳、最常用的源放在第一个。Docker 在拉取镜像时面对多个 mirror 并不是并发请求,而是按顺序尝试,如果第一个源返回异常,它会切换到第二个,这个切换过程会产生额外等待。所以第一个位置一定要放实测最稳的源,而不是放一个“据说很好用”的公共源。
改完文件之后必须重启 Docker 守护进程,这一步很多人会忘:
sudo systemctl daemon-reload sudo systemctl restart docker重启完成后验证配置是否生效,执行:
docker info | grep -A 5 "Registry Mirrors"如果看到Registry Mirrors下面列出了你配置的地址,说明镜像源已经被守护进程加载。最后再跑一条docker pull hello-world做真实拉取验证,看到Hello from Docker!才算真正配置成功。
这里有一个我踩过很多次的坑:daemon.json是严格的 JSON 格式,不允许注释。你在文件里加一行// 这是加速地址,或者把双引号写成中文引号,Docker 服务直接启动失败。如果 restart 之后systemctl status docker是 failed,先别瞎猜,执行journalctl -u docker --no-pager -n 50看日志,里面十有八九会提示你 JSON 解析错误。
3.2 Windows 和 macOS:在 Docker Desktop 里改配置
Windows 和 macOS 上配置镜像源更简单,不用碰命令行。打开 Docker Desktop,进入Settings,左侧找到Docker Engine,右侧就是一个可编辑的 JSON 配置区,把registry-mirrors数组加进去:
{ "registry-mirrors": [ "https://<你的专属ID>.mirror.aliyuncs.com" ] }然后点Apply & Restart,Docker Desktop 会自动重启整个引擎。重启完成后,一样可以用docker info验证。
Windows 下有个容易混淆的场景:如果你同时在 WSL2 里面装了独立的 Docker,注意那和 Docker Desktop 管理的 Docker daemon 是两套东西。Docker Desktop 本身可以配置让 WSL2 复用 Windows 上的 Docker 引擎,但如果你在 WSL2 里单独执行过 Linux 安装 Docker 的流程,那么你需要在 WSL2 内部再配置一份/etc/docker/daemon.json。两套配置互不生效,这是很多 Windows 用户“明明配了源还是慢”的隐藏原因。
macOS 用户还要注意架构问题。Apple Silicon 机型默认拉取arm64镜像,如果你的镜像源服务器只有amd64架构的缓存,实际拉取时可能会被重定向到 Docker Hub 去,速度照样起不来。配置完镜像源之后,用docker info里的Architecture字段确认当前平台,再拉镜像时尽量选择带对应架构标签的版本。
3.3 配置完怎么验证“真的快了”
很多人配置完镜像源,拉一个镜像发现是成功了,但不知道到底快没快。我推荐一个笨但有效的方法:记录耗时。首先执行time docker pull hello-world,看整体耗时;然后换一个源,再执行同样的命令,对比两个值。
如果你把三四个源写进去,想知道哪个源在当前网络环境里最快,有一个粗测方法:先用curl测连接质量,再用实际拉取来定胜负。
# 测连接质量,注意把地址换成你实际配置的源 for url in \ "https://<你的专属ID>.mirror.aliyuncs.com" \ "https://docker.mirrors.ustc.edu.cn" \ "https://hub-mirror.c.163.com"; do echo -n "$url -> " curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" "$url/v2/" done返回的%{time_total}越小说明这个源到你这台机器的链路质量越好。但在不同运营商网络下,同一个源的表现差异很大,所以别盲目照抄别人的结论,自己跑一遍才是硬道理。
4. 配置完成依旧慢?先按这五类问题逐一排查
配置了镜像源但拉取还是慢,这里面的原因通常不是单一维度的。我把实际遇到过的案例归成五类,你按顺序排查,比东搜一下西问一下高效得多。
4.1 配置压根没有生效
最常见的情况是docker info里看不到Registry Mirrors字段。原因无非三种:daemon.json路径不对、JSON 格式错误、改完没有重启 Docker 服务。Linux 下确认一下文件路径必须是/etc/docker/daemon.json,文件名中间没有大写;Windows 和 macOS 用 Docker Desktop 的 Settings 页面改,改完必须点Apply & Restart而不是关掉页面。
还有一个隐蔽细节:如果你用docker service或者 Kubernetes 管理集群节点,每个节点上的 Dockerd 配置都是独立的,你只在 master 节点改了配置,工作节点依然走默认通道,拉镜像当然快不起来。
4.2 源本身挂了,或者限速严重
镜像源是“公共公路”,跑的人多了就会拥堵。如果你配置的某个源突然从丝滑变成卡死,不要怀疑是自己的网络,先去终端直接访问一下:
curl -I https://docker.mirrors.ustc.edu.cn/v2/如果能快速返回 200,说明源还活着;如果超时或者返回 5xx,直接换一个源。我的建议是daemon.json里至少写两个不同运营主体的源,避免“一个挂掉全部瘫痪”。
4.3 你拉的镜像根本不在 Docker Hub
这个原因被大量新手忽视。当你执行:
docker pull ghcr.io/owner/project:latest这种命令时,registry-mirrors是拦截不到的,因为请求目标是ghcr.io而不是docker.io。判断方法很简单:看镜像名里有没有除docker.io之外的 Registry 域名。第三方仓库的镜像加速与 Docker Hub 的镜像源完全是两套机制,光改daemon.json没用,你得去对应仓库的镜像站或走其他通道。
4.4 架构标签不匹配
在国产化场景下这个特别明显。比如龙芯机器上的 Docker 默认平台是loong64,很多公共镜像源只缓存了amd64和arm64架构的层,根本不提供loong64。这时无论源多快都没用,因为源里没有对应架构的缓存版本,Docker 还得回源 Docker Hub 找。先执行docker manifest inspect <镜像名>看这个镜像是否包含当前架构,如果确实没有对应架构,那要换镜像或者找针对该架构重新构建的替代镜像。
4.5 多个源“排队”拖慢整体速度
registry-mirrors支持配置多个地址,但 Docker 的尝试方式是顺序的。假设你写了三个源,第一个源已经失效,守护进程要等第一次请求超时才会切换第二个。如果超时时间让系统默认配置得比较长,你会看到拉取命令卡了很久才开始动。所以前面强调的第一位放最稳的源,就在这里起作用。
为了方便你快速对照,我把这五类问题整理成一个速查表:
| 现象 | 根本原因 | 处理动作 |
|---|---|---|
docker info里没有 Registry Mirrors | daemon.json 未生效 | 检查路径、JSON 格式、重启服务 |
| curl 源地址超时或 5xx | 镜像源失效 | 替换其他可用源 |
| 第三方域名镜像拉取慢 | 镜像不在 Docker Hub | 使用对应仓库的镜像通道 |
| manifest unknown / 架构不匹配 | 源和目标架构不一致 | 确认架构标签,换可用镜像 |
| 拉取开始前卡很久 | 多个源顺序尝试,第一个源失效 | 把稳定源放在列表第一位 |
5. 比配源更重要的事:不同下载场景要对症下药
这部分内容我在各种社区里讲了无数次,因为实在太容易被混淆。很多人看到“Docker 国内镜像源”这个词,就以为一个加速配置能解决所有“从海外下载东西慢”的问题。实际上每个下载场景都有独立的加速方案,混用等于白搭。
先看最常见的一些场景,我做了一张对比表:
| 下载场景 | 默认来源 | 正确的加速方式 | 常见误区 |
|---|---|---|---|
| Docker Hub 官方镜像 | docker.io | 配置registry-mirrors | 以为只改这一个地方就能加速所有镜像 |
| GHCR 等第三方容器仓库 | ghcr.io / quay.io / gcr.io | 改写镜像地址为对应镜像站前缀 | 配置registry-mirrors无效 |
| HuggingFace 模型下载 | huggingface.co | 设置HF_ENDPOINT环境变量指向镜像站 | 用 Docker 镜像源处理 |
| Ollama 模型仓库 | ollama.com | 按官方文档配置模型库镜像地址 | 用 Docker 镜像源处理 |
| npm 依赖下载 | registry.npmjs.org | 设置 npm registry 为国内镜像 | 用 Docker 镜像源处理 |
| conda 包下载 | repo.anaconda.com | 修改.condarc中的 channel 地址 | 用 Docker 镜像源处理 |
| pip 依赖下载 | pypi.org | 配置 pip index-url 为国内镜像 | 用 Docker 镜像源处理 |
| Flatpak 应用下载 | flathub.org | 添加国内 Flathub 镜像仓库 | 用 Docker 镜像源处理 |
能看到,这些场景共同规律是:每种包管理工具都有自己的“源”配置,Docker 只是其中一种。理解了这个规律,你碰到任何新的下载慢问题,第一反应应该是去查对应工具的官方文档里有没有“镜像仓库”或“mirror”配置,而不是找一份 Docker 配置硬套。
实际操作上,HuggingFace 模型库加速,最常用的方式是设置环境变量:export HF_ENDPOINT=https://hf-mirror.com,然后正常调用huggingface_hub下载。Ollama 的模型仓库则是修改它的 registry 地址指向国内节点,具体配置项在官方文档里有详细说明。npm 就更简单了,一条npm config set registry https://registry.npmmirror.com就搞定。这里不推荐把所有地址都写死成某一家镜像站,因为镜像站的稳定性也会变化,正确做法是“用到哪一个,就把那一个的镜像源配置好”,并且定期检查更新。
如果你在团队内部维护基础镜像发布环境,终极方案是自建一个私有镜像仓库,比如 Harbor,把团队常用的基础镜像预先同步到内网。这样开发同事的机器上只需要把daemon.json的registry-mirrors指向内网仓库,拉取速度直接跑满内网带宽,再也不用关心外部源死活。这个方案要多花一些硬件资源和运维精力,但对中大型团队来说绝对是划算的长期投入。
还有一个我常用的个人兜底方案:把网上口碑较好的社区源全部列出来,写进一个脚本里定期扫描/v2/健康状态。哪个源挂了、哪个恢复了我第一时间就能看出来。如果你愿意折腾,甚至可以把这个脚本做成定时任务,每天跑一遍,异常时通知自己。这个习惯帮我躲过了至少两年的“镜像源中途失效”问题,强烈建议你也建立起来。
6. 常用命令与避坑清单:运维日常直接抄
最后这部分是我平时给人开小灶的内容,整理成速查和清单形式,方便你直接收藏。这里的命令不复杂,但每一条都在实际排障中救过急。
先看常用命令:
# 查看当前 Docker 加载的镜像源是否生效 docker info | grep -A 5 "Registry Mirrors" # 查看 Docker 的系统信息,包括平台架构、存储驱动等 docker info # 实际拉取一个最小编译镜像测试通断 time docker pull hello-world # 查看本地所有镜像 docker images # 查看 Docker 守护进程日志(配置错误时第一排查入口) journalctl -u docker --no-pager -n 50 # 清理悬空镜像和停止容器,释放磁盘空间 docker system prune再往后是我个人整理出来的一份“避坑清单 Top 10”,每一条都有真实事故背景:
- 不要在
daemon.json里写注释。它只认标准 JSON,注释会导致 Docker 守护进程启动失败。 - 不要把网络教程里的一面倒“全部源都填进去”。镜像源不是越多越快,而是按顺序尝试的,失效源会拖慢整体拉取。
- 不要拿一个公共源做生产环境的唯一依赖。公共源可能因流量过大或维护者弃坑而随时挂掉,生产环境至少配两个不同主体的源,或者直接上企业级镜像仓库。
- 改完配置必须重启 Docker 服务或点 Apply & Restart,不重启不生效。
- Docker Desktop 管理的 daemon 和 WSL2 内独立安装的 Docker daemon 是两套,配置互不生效,要分别改。
- 拉取镜像失败先看错误信息里的域名,
ghcr.io、gcr.io、quay.io的镜像和 Docker Hub 完全无关,不要误伤镜像源配置。 - 公共网上的公开镜像站只适合下载公共镜像,别把公司内部私有镜像推送到那里,防止信息泄露。
- 镜像站列表时效性极强,任何人的列表都只能作为参考,包括我这份,落地前自己
curl验证一遍。 - 国产架构平台(比如龙芯)拉取镜像时,要先确认是否有对应架构的镜像层,否则配置再好的源也拉不下来。
- 拉取到一半失败时,不要急着反复重试,先用
docker system prune清理掉损坏的半成品层,再重新 pull,会顺畅很多。
这十条每一条背后都是真实踩坑换来的。尤其第 5 条,我认识不少 Windows 用户,在 Docker Desktop 里配了源,结果一直用的还是 WSL2 里的独立 Docker,拉镜像照样慢如蜗牛,排查了整整一天才找到问题。第 3 条也值得重视,之前有朋友图省事,把某个社区源写进了生产环境的脚本里,结果那个源几天后关停了,凌晨的自动构建任务直接失败,整组人都被叫起来处理事故。配置镜像源这件事,真的不能怕麻烦。
回到开头说的测试方法,这个季节我更新完这份列表之后,最深的体会是:好东西都是动态的。镜像源不会因为你收藏了某个地址就永远为你服务,它像一条路,修路的质量、路上跑的车、天气状况都会影响通行速度。与其到处收藏“最新可用列表”,不如花二十分钟把验证脚本跑起来,让数据说话。你需要的不是一劳永逸的答案,而是一套能自己判断“到底用哪个源”的方法。这次我给你的就是这套方法,源在更新,方法不会过时。