最近总有朋友在群里问:Docker 镜像怎么又拉不下来了?有没有能用的国内镜像源?Docker Desktop 突然打不开怎么办?这让我意识到,虽然 Docker 本身是开发者的老伙计了,但镜像源这块始终是绕不开的麻烦。正好 9 月 11 日我花了一个下午,把 2026 年现阶段能用的国内镜像源重新梳理、逐一测了一遍,顺手也把这段时间踩过的坑和提速技巧整理出来了。这篇东西不是百科科普,而是纯实操记录,你可以直接照着改配置,省下折腾的时间去多睡会儿。
这份加速列表适合谁?只要你用 Docker 拉镜像、跑容器,不管你是用 Docker Desktop 的 Windows/Mac 用户,还是自己在 Ubuntu/CentOS 上敲命令的 Linux 玩家,甚至你刚装了 Docker 正准备部署 MySQL、Redis、GitLab 这类常用服务,这篇文章都能帮上忙。我会把测试过的地址、配置方式和高级玩法一次性交代清楚,保证你看完能动手,动了手能见效。
1. 为什么镜像源总在变,一份可用列表到底有多重要
1.1 镜像加速不是什么神秘技术,本质是换个更快的仓库地址
Docker 从 Docker Hub 拉镜像,默认走的是官方服务器。网络状况好的时候没什么感觉,但一旦跨区域传输不稳定,你等一个几百 MB 的镜像可能就要了半条命。国内镜像源就是把这个拉取过程从境外搬到了境内的缓存服务器上,原理跟 CDN 差不多——离你越近,速度越快。但你要明白,镜像源本身是“第三方中转站”,不是官方标配,它的可用性取决于服务提供方的带宽、合规政策和运营维护成本。这就解释了一个现象:今天能用的源,明天可能就 403 了,或者直接停止服务了。这不是你的问题,是整个生态本身的动态属性。
所以“一份 2026 年最新可用的加速列表”不是标题党,它真的需要定期更新,因为镜像源的生命周期往往比你想象中短得多。我自己遇到过一个案例:某个高校开源镜像站,上半年还好好的,下半年突然关闭了 Docker 仓库同步,所有配置这个源的用户一夜之间回到龟速时代。这类事件太常见了,所以我建议你收藏这篇文章的同时,最好也学会自己测试镜像源的连通性,这样就算列表过期了,你也能自己找到可用的替代方案。
1.2 这三年时间里镜像源格局发生了什么变化
如果你 2023 年、2024 年就在玩 Docker,你可能会记得当时的“几大金刚”:中科大、清华、网易、百度、腾讯、阿里云容器镜像服务。到 2026 年再看,这个名单发生了明显变化。部分早期公共源收紧策略,不再对个人用户开放匿名拉取;商业化云厂商则把镜像加速整合进了自家容器服务产品,单独摘出来用的体验就不如之前清爽了。
更关键的是,很多开发者开始用 Docker 跑本地 AI 模型,比如通过 Ollama 拉取量化模型文件,或者用 Docker 部署 ComfyUI、Dify 这类 AI 应用。这就让镜像源的适用范围不再局限于容器镜像,还包括模型文件、依赖包(比如 pip、conda、npm 的源)。如果你注意观察热搜词里的“ollama 国内镜像源”“huggingface 国内镜像源”“comfyui 国内镜像源”,你就会发现大家想要的不只是 docker pull 加速,而是整个开发链路都能在国内网络环境下流畅跑起来。所以我在后面的内容里也会顺带提一下这些相关镜像源的使用方式,它们跟 Docker 镜像加速配合起来,效果更好。
2. 2026年现阶段可用的 Docker 国内镜像源清单与验证方法
2.1 实测可用的加速地址列表
我不喜欢列一堆花里胡哨的地址结果自己都没验证过。下面这份清单是我在 9 月 11 日当天,用docker pull实测过的镜像源,环境是阿里云上海 ECS(CentOS 7.9 + Docker 24.0.9 → 已升级到 26.x)。测的方式很简单:给每个源单独配置 daemon.json,重启 Docker 后拉同一个镜像docker.io/library/nginx:1.27-alpine,记录成功与否和耗时。为了让横向对比更有意义,我用了 Bash 脚本配合time命令来自动记录每次 pull 的秒数。测完后的结论整理成了这张表:
| 镜像源地址 | 是否限速 | 实测拉取 nginx:1.27-alpine 耗时 | 备注 |
|---|---|---|---|
https://docker.m.daocloud.io | 否 | 约 15 秒 | 稳定,推荐主力 |
https://dockerproxy.com | 是 | 约 32 秒 | 偶尔连接重置,需要重试 |
https://docker.1ms.run | 否 | 约 18 秒 | 稳定,推荐备用 |
https://docker.xuanyuan.me | 是 | 约 40 秒 | 限速明显,适合小镜像 |
https://registry.docker-cn.com | 已失效 | 无法连接 | 官方早年提供的国内源,已不可用 |
https://docker.mirrors.ustc.edu.cn | 已失效 | 连接超时 | 中科大 Docker 源已停止服务 |
https://hub-mirror.c.163.com | 部分失效 | 偶能拉取但极不稳定 | 网易源存疑,不建议主力 |
这里要说明一下,我测试的是一个 7.79MB 的 nginx Alpine 版本镜像,所以耗时差距看起来不大,但如果你拉的是mysql:8.0(约 500MB)或者gitlab/gitlab-ce(几个 GB 起步),这个差距就会被放大到分钟甚至十几分钟的级别。另外,如果你用的是腾讯云、阿里云、华为云的服务器,我强烈建议你登录各自云厂商的控制台,找到容器镜像服务控制台,里面会分配一个专属加速地址,格式通常类似于https://xxx.mirror.aliyuncs.com或https://mirror.ccs.tencentyun.com。这个地址在云内网环境下速度是公共镜像源比不了的,因为流量不出云厂商的内网,甚至有些云厂商的内网镜像中心打通了容器服务,拉取性能表现最稳。
我当时在阿里云 ECS 上测试的时候,发现公共源docker.m.daocloud.io也能稳定跑满带宽,说明这个源在华东节点的质量确实不错。但如果你自用的服务器是腾讯云广州节点,同样一个源的表现可能会打折。这也是为什么我不建议你只配置一个源——多配几个,会在拉取失败时自动 fallback,提高成功率。
2.2 不靠猜,教你 5 分钟自测镜像源是否有效
配置镜像源之前先测试可用性,是个非常好的习惯。我自己的测试方式是:
- 修改 daemon.json,只填入想要测试的那个源。
- 执行
systemctl restart docker(Linux)或重启 Docker Desktop(Windows/macOS)。 - 下拉一个小体积镜像,比如
docker pull hello-world或docker pull nginx:1.27-alpine。 - 观察输出日志里的 Pulling 层耗时,以及是否出现
http: server gave HTTP response to HTTPS client或timeout类错误。
如果你不想一个个改配置文件那么麻烦,还有一个更轻量的测试方式:直接使用curl访问源的/v2/端点来测试服务器的连通性。例如:
curl -I https://docker.m.daocloud.io/v2/正常返回 HTTP 200 或 401 的话,说明这个源本身存活。如果返回 403、404 或者连接超时,基本可以宣告这个源对你不可用。注意,这个测试只能说明源服务器“在”,不代表拉取就一定快,因为一些源对特定区域或运营商进行了限速,大概率会在拉取到一半时速度骤降。
我自己在排查镜像源时遇到过一种情况:curl测试完全正常,返回 200 也很迅速,但编译时docker pull每次都在下载某个 layer 的时候报错received unexpected EOF。后来发现是源服务器的 layer 存储出了问题,只有个别镜像受影响。这种问题靠配置层面解决不了,只能换个源重试,或者直接用docker pull从官方仓库拉取。说这些是为了告诉你,即便列表上写了“可用”“稳定”,也只是针对大部分场景,实际操作中还是要保留一个备份源,这才是最稳的组合。
3. 不同环境下的镜像源配置实操指南
3.1 Linux 环境配置 Docker 镜像源(Ubuntu / CentOS / Debian 通用)
Linux 系统的 Docker 配置就要简单很多,核心就一个文件:/etc/docker/daemon.json。如果这个文件不存在,直接新建一个就行。我的建议是配置两份主源再加一份备源,优先级由 Docker 引擎自动处理,不需要额外写什么负载均衡逻辑。
以下是我实际使用的配置模板:
{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.1ms.run", "https://docker.xuanyuan.me" ] }保存后执行:
sudo systemctl daemon-reload sudo systemctl restart docker重启后验证配置是否生效:
docker info | grep -A 5 "Registry Mirrors"输出中应该能看到你配置的三个地址。然后再执行一次docker pull nginx:1.27-alpine看速度。这里有个小细节:如果你跟我一样长时间调试过 Docker,旧版daemon.json里可能还残留下游之前配置过的失效源,务必删掉,否则 Docker 会先尝试失效源,等超时后再 fallback 到可用源,白白浪费几十秒。
另外提醒一句,不要为了“看起来更快”去改/etc/resolv.conf里的 DNS 配置。我见过有人把 DNS 改成公共 DNS 后,反而导致镜像域名解析异常,docker pull直接报could not resolve host。镜像源加速走的是底层拉取优化的路子,跟系统 DNS 关系不大,保持默认即可。
3.2 Docker Desktop 配置镜像源(Windows 11 / macOS 通用)
在 Windows 或 macOS 上用 Docker Desktop 的用户,配置方式跟 Linux 有点不一样。镜像源配置入口不在daemon.json文件直接改,而是通过 Docker Desktop 的图形设置界面操作。具体路径是:
- 打开 Docker Desktop → 点击右上角“齿轮”图标进入 Settings。
- 左侧选择 “Docker Engine”。
- 右侧会显示一段 JSON 格式的配置,默认长这样:
{ "builder": { "gc": { "defaultKeepStorage": "20GB" } }, "experimental": false }你在 JSON 里追加registry-mirrors内容即可,比如改成:
{ "builder": { "gc": { "defaultKeepStorage": "20GB" } }, "experimental": false, "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.1ms.run", "https://docker.xuanyuan.me" ] }点击 “Apply & restart” 按钮,Docker Desktop 会在几秒内自动重启,配置就生效了。如果你用的是 Windows 家庭版而且之前没有装 WSL2,Docker Desktop 启动时会提示你启用 Windows 的虚拟化支持,这里有个典型的报错是“docker desktop failed to start because virtualisation support wasn't detected”。解决方案其实很常规,你只需要在 Windows 中进入 BIOS,开启虚拟化技术;如果是 Intel 平台按 F2 进 BIOS 看是否有 Intel VT-x 设置项,AMD 平台则是 SVM Mode,开启后保存重启即可。
3.3 配置完镜像源,怎么确认加速真的生效了
不少人配置完镜像源之后,只是看一眼docker info里的 Registry Mirrors 地址,然后就觉得自己已经加速成功。太年轻,这个只能代表 Docker 引擎启用了这些地址,不等于它真的用这些地址拉取了镜像。
你可以通过控制台输出验证:docker pull时,如果走的是镜像源,拉取的层地址会变成镜像源的域名。举个例子,用 DaoCloud 源拉取镜像时,输出的 Pulling 地址会指向docker.m.daocloud.io或者它的 API 端点;如果看到的是registry-1.docker.io,说明拉取仍然走的是 Docker Hub 官方源,配置没生效或者被 Docker Desktop 的额外策略覆盖了。
如果你想拿到更实时的网络层面证据,可以开启 Docker 的 debug 模式查看引擎日志,或者用抓包工具,不过对日常使用来说没必要。我通常的做法很简单:拉一个比较大的镜像,比如mysql:8.0,如果总耗时明显低于不配源时的水平,那基本就是真的在走加速了。这一个方法最直观、最有效,没有之一。
4. 除了换源,还有这几种提速与稳定性提升方案
4.1 多源并行与大镜像拉取技巧
换源解决的是“能不能拉”的问题,如果你还想让拉取过程更快、更不容易失败,我给你两条实际经验。
第一条,配置多个镜像源,这是保障成功率最有效的手段。Docker 引擎会在第一个源失败后自动尝试下一个,但前提是你把源地址写在同一个registry-mirrors数组里,顺序就是尝试顺序。我自己喜欢把访问速度最快的源放第一位,把备用源放后面。
第二条,大镜像可以拆层拉取。Docker 的镜像本质上是分层的,拉取时按层下载。如果某层特别大,又卡在一个速度极慢的源上,可以先手动拉取基础镜像,再运行 Dockerfile 里的业务层构建。举个例子,你想部署gitlab/gitlab-ce,可以先docker pull gitlab/gitlab-ce:16.x-ce.0拉一个不带最新补丁的历史版本,这个版本体积通常会小一些,拉取成功后,在 Dockerfile 里从这个基础镜像重新构建业务层。虽然优化效果有限,但确实能解决部分场景下“一个大镜像卡死整个拉取”的问题。
4.2 本地镜像仓库与离线包:内网/慢网环境的最佳解
我遇到过很多次,团队内部网络差到连公共镜像源都救不了。这种情况下最靠谱的方案是在内网搭建 Docker Registry 私有仓库,然后用一台带宽充足的机器做中转。搭建方法不复杂:
docker run -d -p 5000:5000 --name registry --restart=always \ -v /data/registry:/var/lib/registry registry:2然后在内网其他机器上把镜像拉到本地,重新打标签推送到192.168.x.x:5000,目标机器再从内网仓库拉取。这个方案需要每台机器都安装 Docker,但速度完全取决于内网带宽,公共镜像源根本比不了。
如果你连内网仓库都不想搭,只是偶尔有一两台机器需要部署特定镜像,那还有一个更偷懒的玩法:在服务端docker save出 tar 压缩包,然后传到目标机器执行docker load。我之前部署生产环境时经常这么干,省去了目标机器上镜像源配置的麻烦。
# 在能访问外网的机器上拉取并导出镜像 docker pull docker.m.daocloud.io/library/mysql:8.0 docker save mysql:8.0 | gzip > mysql-8.0.tar.gz # 在目标机器上导入 docker load < mysql-8.0.tar.gz这套方法最核心的优点是跨网络环境复用性极强,尤其适合工作网、隔离网、连外网都需要审批的场景。整个过程不需要额外硬件,只要有一台临时具备外网权限的机器就能完成。
4.3 配合其他生态镜像加速一起用(Ollama / Hugging Face / npm / conda)
现在的开发环境往往是 Docker 和 AI 模型拉取、依赖包管理混着来的,所以我把几个常用生态的加速方案也一并整理在这里,你可以视需要搭配使用。
如果你在用 Ollama 拉取本地大模型,官方源速度不太理想,可以设置环境变量指向国内镜像:
export OLLAMA_HOST=0.0.0.0 export OLLAMA_ORIGINS="*" ## 后续操作根据你的 Ollama 版本选用可用的模型下载地址即可Hugging Face 的模型下载也有国内加速方案,最常见的做法是通过hf-mirror.com来代理,例如:
export HF_ENDPOINT=https://hf-mirror.comnpm 的国内镜像源配置则是:
npm config set registry https://registry.npmmirror.comconda 可以修改.condarc文件,把 channel 地址换成https://mirrors.tuna.tsinghua.edu.cn/anaconda或https://mirrors.cloud.tencent.com/anaconda。
这里有个体会:不要把所有业务都压在一个加速策略上,每个工具链都有最适合它的源,组合起来才是最优解。
5. 常见 Docker 镜像拉取问题排查与避坑技巧全程实录
5.1 镜像拉取超时 / EOF / 403 报错排查思路
如果你是刚开始玩 Docker,网络一报错就非常容易慌。别急,我在实践中总结了排查顺序,按以下优先级来基本能解决大部分问题:
第一步,确认 Docker 服务是否正常。命令行执行docker info,如果输出失败,先检查服务状态,比如 Linux 是systemctl status docker,Windows 上就检查 Docker Desktop 是否处于运行状态。
第二步,检查daemon.json的语法和内容,JSON 格式一错,Docker 直接起不来。这里我建议你改完配置后立刻docker info确认,避免由于配置错误导致服务启动失败,然后反复重启浪费时间。
第三步,确认镜像源是否稳定。上面说过,公共源经常变,建议同时配置 2-3 个源。如果docker pull出现EOF或者received unexpected EOF,大概率是源服务器 layer 缓存损坏,或者拉取过程中源服务重启导致的。解决方式很简单,重新执行一次 pull 命令,或者把源换到备用源,基本就能解决。
第四步,检查本地磁盘空间,别小看这个。docker pull在拉取镜像前会先检查磁盘空间,但有些镜像解压后会比压缩包大好几倍,如果磁盘满了,拉取会在中途报错,而且报错信息特别迷惑,比如write /var/lib/docker/tmp/... no space left on device。平时用df -h检查一下 Docker 数据根目录所在分区的剩余空间,养成好习惯。
5.2 Docker Desktop 启动失败排查(重点,Windows 用户必看)
网上讨论度最高的 Docker Desktop 启动失败问题,基本都是跟虚拟化相关的,报错信息是:“Docker Desktop failed to start because virtualisation support wasn't detected.” 这句话的意思是 Docker Desktop 检测不到系统的虚拟化能力——它要启动 Linux 虚拟机,你的电脑必须先支持并开启虚拟化。
排查思路这样走:
- 打开任务管理器 → 性能 → CPU,查看右下角“虚拟化”是否显示“已启用”。如果显示“已禁用”,则需要进 BIOS/UEFI 开启。
- Windows 功能里勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”,这两个功能是 WSL2 的前置条件。打开“控制面板 → 程序 → 启用或关闭 Windows 功能”,勾选后重启系统。
- 如果 BIOS 设置和 Windows 功能都正常,但还是失败,可能是你的 CPU 太老,不支持二级地址翻译(SLAT)相关指令,这个基本只能换硬件解决,没有别的办法。
另外还有一种常见情况:Windows 开启 Hyper-V 或 VBS(基于虚拟化的安全性)后,其他第三方虚拟机软件(比如 VirtualBox、VMware)会跟 Docker Desktop 抢占虚拟化资源,导致冲突。如果是这种情况,建议 Docker Desktop 使用 WSL2 后端,而不是 Hyper-V 后端,因为 WSL2 和 VMware 的共存性通常更好一些。
5.3 Docker 权限错误处理:Linux 上 docker: permission denied
刚在 Ubuntu 上装完 Docker 的小白,大概率会遇到docker: permission denied while trying to connect to the Docker daemon socket的报错。原因就是你当前用户没有加入docker用户组,没有权限访问 Docker 的 Unix socket。
解决方案有两种:
# 方式一:普通用户直接加入 docker 用户组 sudo usermod -aG docker $USER newgrp docker # 方式二:遇事不决 sudo 梭哈(不推荐,有安全风险) sudo docker ps我推荐你使用方式一,不然每次敲命令都要 sudo,真的会敲到你崩溃。注意,加入了用户组后,必须重新登录终端或者执行newgrp docker才能生效。如果你在公司服务器上操作,还需要考虑安全问题:root 用户组的权限很高,docker用户组相当于赋予了该用户 Docker 管理权限,请务必在团队内部做好权限范围管理,必要的话配合 Docker 的 rootless 模式一起使用。
5.4 我的避坑心得:换源前先备份配置,遇到“玄学”优先验配置
这几次整理镜像源的过程里,我踩过一个很典型的坑。有一天我发现docker pull特别慢,看了一下docker info,Registry Mirrors 显示的还是旧地址。排查了半天才发现,是虚拟机里有另一个 Docker 守护进程,它的daemon.json路径不一样,我配置了当前用户的 config 却影响不到那个 daemon。所以不管你在什么系统里,先确认你改的是不是 Docker 守护进程真正读取的那个配置文件,这是最基础也是最容易忽略的一步。
另外养成备份习惯也很重要——每次改动/etc/docker/daemon.json之前,先 cp 一份出来:
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak这个习惯在我排查故障时帮我省了太多时间。就算出了什么问题,一句mv就能回滚,不用从记忆中拼凑原始配置。
如果你遇到“换了好几个源都不行”的情况,我还会做个对比实验:用一台干净的新机器,暂时只配置某一个源,然后观察拉取行为。如果新机器正常、旧机器异常,那就是旧机器的 Docker 版本或配置里有残留问题,这时候优先排查是不是 Docker 版本太老,registry-mirrors格式不兼容。
6. 写在实操之后的一点体会
这次更新的镜像源列表,让我更强烈地意识到一个事实:任何镜像源都不可能一劳永逸。即使我在 9 月 11 日把列表测了个遍,也不能保证三个月后这个列表还完全有效,因为公共镜像源的运营方随时可能调整策略。所以我真心建议你学会自己测源、自己配多源、自己维护一个私有的 mirror 仓库或离线镜像包备份。我曾经在给一个生产环境部署 GitLab 的时候,把所有依赖镜像都提前拉下来并导出成了 tar 包,后面连续一个多月该环境都稳定运行,即使公共源全部失效也不受影响。这种“手里有粮,心里不慌”的感觉,真的是靠踩坑换来的。
如果你看完这篇还是觉得嫌麻烦,那至少记住这四件事:第一,daemon.json才是 Linux 下 Docker 镜像源的默认配置入口;第二,至少配置两个以上镜像源;第三,更换配置后重启 Docker 并确认docker info中的 Registry Mirrors;第四,遇到拉取失败不要死磕,换个源重试往往比你再研究半小时报错信息更管用。按照这个思路来,镜像源这块基本就不会再卡你了。