2026 Docker国内镜像源实测:解决docker pull慢与超时

docker镜像加速docker pull慢docker国内镜像源 本内容遵循CC 4.0 BY-SA版权协议
脑袋被门夹得好痛 脑袋被门夹得好痛 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要

如果你还在为 docker pull 卡在 Waiting for connection、进度条半天不动最后直接 timeout 而头疼,那今天这篇应该能帮你少走不少弯路。我基于 2026 年 9 月的实际测试环境,把当前还能稳定用的 Docker 国内镜像源做了整理和实测,环境包括 CentOS 7、Ubuntu 22.04、Windows 11 + Docker Desktop,覆盖了几种最常见的部署场景。这篇文章会从镜像源选型、配置步骤、实测数据到高频故障处理一次性讲清楚,老手可以直接跳到第 4 节看避坑经验,新手建议从头到尾顺一遍。

1. 为什么 Docker 拉镜像这么慢,镜像源到底在解决什么问题

Docker 默认从 registry-1.docker.io 拉取镜像,这个仓库服务器主要部署在境外。国内访问它时,最大的瓶颈不是带宽,而是链路上的传输延迟和丢包。Image 分层越多、体积越大,受网络抖动的影响就越明显,一个几百 MB 的镜像在高峰期拉一两个小时并不夸张。再加上 Docker 的镜像拉取是分层的,每一层都必须完整下载并通过校验后才会继续下一层,中间任何一段链路质量波动都会导致整体速度崩掉。

镜像加速器的原理并不神秘:它在国内维持了一个镜像仓库的缓存服务,本质上是 pull-through cache。你配置了国内镜像源之后,Docker 客户端会优先向这个国内服务发起请求,如果它本地已经有缓存,直接走国内带宽给你;如果缓存没有命中,它再回源到 Docker Hub 拉取一次并缓存下来。也就是说,热门镜像第一次拉取时可能还是不算快,但一旦有人拉过,后续速度就会明显上一个台阶。

了解这个机制有什么用?有两点实际意义:第一,配置镜像源后如果你发现第一次拉一个冷门镜像依然慢,这是正常现象,镜像加速器没有失效;第二,不同镜像源之间缓存的数据是各自独立的,所以在选择镜像源时要优先考虑使用人数多、活跃度高的源,这类源的缓存命中率一般更高,体验也会更稳。

2. 2026 年实测可用的国内镜像源清单与选型建议

镜像源市场这些年变化不小。很多早期公开的源陆续关闭了匿名访问或者整体停服,所以那份流传多年的“老清单”不能直接照抄。我在本次实测中分别用 curl 测试了连通性,再用 docker pull 实际拉取了 alpine、nginx、mysql:8.0 做验证,最终筛选出下面几个在 2026 年 9 月依然稳定可用的镜像源。

镜像源地址 提供方 实测状态 是否需要登录获取专属地址 备注
docker.m.daocloud.io DaoCloud 公共服务 可用 否 社区维护型,无需登录,实测连通率较高
dockerproxy.net 社区公共服务 可用 否 适合拉取 GitHub/GHCR 等镜像,兼容性较好
docker.1panel.live 1Panel 社区 可用 否 运维工具社区维护,常用于面板环境
hub.rat.dev 社区公共服务 可用 否 近期新增,验证拉取速度稳定
docker.registry.cyou 社区公共服务 可用 否 老牌源,部分时段偶有波动
docker.mirrors.ustc.edu.cn 中科大开源镜像站 需验证 否 高校源,由于策略调整可用性不稳定
docker.mirrors.163.com 网易 已停 否 已停止对 Docker Hub 的镜像加速,移除
https://xxxx.mirror.aliyuncs.com 阿里云 可用 是 需要登录容器镜像服务控制台获取专属加速地址
https://mirror.ccs.tencentyun.com 腾讯云 可用 否 腾讯云内网环境优先,公网环境可用性一般

选型时有几条原则,你在配置之前最好先想清楚:

第一,别只配一个源。单个镜像源如果出现故障或者维护,你会直接回到拉不动的状态。我建议至少配 2 到 3 个源,Docker 会按顺序尝试。不过要留个心眼:多配源只是增加容错,并不保证某个源拉不到时自动去下一个源拉同一镜像,因为 Docker 的 mirror 逻辑是逐个请求、某个源 404 才可能尝试下一个。所以配多个源的意义在于分散稳定性风险,而不是字面意义上的并行加速。

第二,看清楚是不是需要独立域名。阿里云那个地址里的 xxxx 是你账号绑定的专属 ID,需要你先登录阿里云容器镜像服务控制台,在“镜像加速器”页面里找到你专属的地址。因为配置项要求必须是 HTTPS,你在获得这个地址后直接填进 JSON 即可,不要再拼接路径。

第三,高校源的利弊。中科大、清华这类源的优势是可信度高、无商业成分,坏处是带宽和流量策略经常变,之前有一段时间对外网段做了限制,导致非校园网用户访问慢。建议你把高校源作为备用而不是主源。

第四,时效性检测很重要。我写这篇文章的时候这些源是能用的,但镜像源列表是一个会自然死亡的内容。建议你配置完以后立刻用第 4 节的测试方法跑一遍,以后每 1 到 3 个月复查一次。任何列表都不如自己手上的验证结果可靠。

3. 完整配置步骤:从 daemon.json 到 Docker Desktop 图形化

配置镜像加速器的方法根据你的 Docker 运行环境不同而不同,但原理相同——都是改写 Docker 守护进程的配置文件,新增 registry-mirrors 参数。逐个环境说明。

3.1 Linux 环境配置(通用做法)

先确保 Docker 已安装,然后编辑 /etc/docker/daemon.json:

BASH
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.net",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.registry.cyou"
]
}
EOF

有几个细节很容易踩坑:

  • 文件必须是合法 JSON。用 tee 写入时不需要 concern,但如果你是手动编辑,记得检查有没有多逗号、少引号。一个错误的 JSON 会导致 Docker 服务启动失败,而且报错信息可能比较误导。
  • 重启守护进程:
BASH
sudo systemctl daemon-reexec
sudo systemctl restart docker

这里我习惯先执行 systemctl daemon-reexec 再 restart,可以避免某些环境内 systemd 配置缓存导致重启不生效的问题。实测中,如果只执行 systemctl restart docker,偶尔会遇到守护进程实际没有重新加载配置的情况。

  • 验证配置是否生效:
BASH
docker info | grep -A 20 "Registry Mirrors"

输出里必须能看到你配置的镜像源地址。如果显示 <nil>,说明配置没加载成功,检查 JSON 格式或者重启顺序。

3.2 使用 systemd 加载配置的特殊情况

在 CentOS 7、Ubuntu 18.04 这类用 systemd 管理 Docker 服务的系统上,还有一个隐藏的坑——docker.service 里的启动参数会覆盖 daemon.json。具体表现为你明明改了 /etc/docker/daemon.json,docker info 也不显示你配置的源。此时检查一下:

BASH
systemctl cat docker | grep -i "registry"

如果有 --registry-mirror 开头的参数出现在启动命令里,说明是最初安装时有人在 service 文件里直接写了参数。处理办法是创建 drop-in 配置文件:

BASH
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf <<-EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --config-file=/etc/docker/daemon.json
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

注意其中 ExecStart= 这一行必须存在且置空,作用是先清空原有的启动参数,再重新指定。

3.3 Windows / macOS Docker Desktop 配置

在 Docker Desktop 上配置更简单。打开左上角菜单,依次进入 Settings -> Docker Engine,你会看到一个 JSON 编辑框。把它改成:

JSON
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.net",
"https://hub.rat.dev"
]
}

然后点击 Apply & Restart。Docker Desktop 会自动重启服务并加载新配置。

这里有个 Windows 用户常见的问题——改完后 docker info 看不到镜像源。这通常是因为 Docker Desktop 使用了 WSL 2 后端,而 WSL 内的 Docker Context 指向了别的地方。运行 docker context ls 看当前打星号的 context,如果是 desktop-linux 就应该能读到 Docker Desktop 的配置;如果你之前为了连接远程主机建过额外的 context,并且当前指向了那个 context,你改的配置就不起作用。切回 desktop-linux 即可。

3.4 配置如果还不生效怎么办

先做一个快速验证,不依赖任何配置文件,直接用 curl 测试镜像源地址的连通性:

BASH
curl -I https://docker.m.daocloud.io

如果这个请求都超时或报 TLS 错误,大概率是镜像源本身在你所在网络不可达,换一个源,别在配置层面死磕。如果 curl 正常但 docker 拉取依然卡,则重点检查 Docker 守护进程日志:

BASH
journalctl -u docker --since "10 minutes ago" | grep -i "mirror\|proxy\|timeout"

一般来说,日志里会留下 http: TLS handshake error 或者 failed to do request: context deadline exceeded 之类的记录,对照提示去检查对应域名解析和防火墙规则即可。

4. 实测数据与加速效果对比

配置镜像源之前和之后,拉取速度的差异可以用一个简单的测试来说明。我选了几个有代表性的镜像,在同一个网络环境下分别测试 docker pull 的耗时。测试环境:Ubuntu 22.04、Docker 20.10.17、电信宽带。测试时间:2026 年 9 月。

镜像 镜像大小 未配置镜像源耗时 配置后首次拉取耗时 配置后二次拉取耗时
alpine:latest 约 8 MB 43 秒 6 秒 2 秒
nginx:1.27-alpine 约 45 MB 3 分 20 秒 18 秒 10 秒
mysql:8.0 约 600 MB 拉取失败(反复超时) 4 分 10 秒 36 秒
redis:7-alpine 约 40 MB 2 分 50 秒 15 秒 8 秒

肉眼可见,配置镜像源不是“稍微快一点”,而是“从不可用到可用”的差别。 mysql:8.0 这种大型镜像在默认源下几乎拉不下来,换成国内源之后,虽然首次拉取仍然要等几分钟,但至少是稳定推进的,进度条不会倒退。

再解释一个新手不理解的现象:为什么二次拉取比首次快这么多?因为首次拉取镜像时,镜像加速器的缓存里还没有数据,它需要先从 Docker Hub 拉一遍然后再喂给你。所以首次的耗时约等于“国内源访问 Docker Hub 的耗时 + 你的本地下载耗时”。如果热门镜像已经提前被其他人拉过,加速器里直接有缓存,那你首次拉取也能很快。

还有一种情况是配置了源之后,拉取速度依然不理想。除了刚才说的冷缓存原因,还有一个很常见的因素是你只配了一个源,而这个源恰好对你所在地区线路不友好。建议多配几个源让 Docker 自己择优,实测下来不同源在不同区域的表现差异很大,比如北方联通网络下 DaoCloud 表现好,而南方电信下 1panel 的表现更稳定,所以地域性差异必须靠多源来对冲。

另外两个值得调优的守护进程参数,也一并写在 JSON 里:

JSON
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.net",
"https://hub.rat.dev"
],
"max-concurrent-downloads": 10,
"max-download-attempts": 5
}

max-concurrent-downloads 默认值是 3,调大到 10 可以充分发挥宽带优势,对多分层大镜像的拉取提速明显。 max-download-attempts 默认 5,一般不用动,除非你的网络偶发瞬时断流,调大到 8 也能提升成功率。

5. 常见问题排查指南:docker pull、Docker Desktop、网络和权限问题

镜像源配置只是第一步,真实使用中会遇到的问题往往五花八门。我把过去一两年被问得最多的几类问题汇总成故障速查表,直接按症状定位。

症状 可能原因 解决方案
docker pull 卡在 Waiting 或 Retrying 镜像源不可达、网络波动 用 curl -I <镜像源> 测连通性;换源;查看 journalctl -u docker 日志
Docker Desktop 启动提示 virtualization support not detected Windows 虚拟化功能未开启 启用 Windows Hypervisor Platform 和 WSL 2;进 BIOS 开 VT-x/AMD-V
启动容器报 Got permission denied while trying to connect to the Docker daemon socket 当前用户不在 docker 用户组 sudo usermod -aG docker $USER 然后重新登录,或者临时用 sudo docker
docker network 命令正常但容器之间 ping 不通 Docker 网络模式配置冲突 删除已有自定义 network 重建,检查 iptables 是否被其他程序改写
容器内 apt-get 等命令很慢 DNS 配置问题 给容器加 --dns 223.5.5.5 参数,或在 daemon.json 里配置 dns
配置镜像源后 docker info 不显示 daemon.json 格式错误或 Docker Desktop context 错误 用 python3 -m json.tool /etc/docker/daemon.json 校验;检查 docker context ls
拉取 mysql:8.0 失败但报错不明确 镜像过大导致超时,或本地磁盘空间不足 换镜像源;用 docker system df 查看磁盘,清镜像缓存
Docker Compose 项目启动后一直 pull access denied 私有镜像未登录或镜像名不存在 docker login 对应仓库,确认 tag 名称大小写

5.1 镜像拉取超时的完整排查顺序

如果你遇到的症状就是最经典的“拉取慢、拉取失败”,建议按下面的顺序排查,避免做无用功:

第一步,确认不是磁盘空间问题。大镜像拉取失败时,Docker 会先申请存储空间,磁盘满了的话会直接报 no space left on device。执行 docker system df 看镜像和容器占用的空间,必要时跑一次 docker system prune -a,但注意这会清掉所有未使用的镜像和构建缓存,需要谨慎。

第二步,确认默认源确实没有生效。docker info 里看 Registry Mirrors 段落。如果显示 <nil>,就回到第 3 节处理配置不生效的问题。

第三步,逐源测连通性。用下面的脚本逐个测试你配置的所有 source:

BASH
for url in $(docker info --format '{{json .RegistryMirrors}}' | tr -d '[]"' | tr ',' '\n'); do
echo "==> $url"
curl -I -m 5 "$url" 2>&1 | head -n 1
done

这一步会很快定位出哪个源在当前网络环境不可达。我在实测中发现,同一个镜像源在不同省份的可用性差异真的很大,所以如果你的源第一次连接失败,不要急着否定这个源,先看是不是本地网络到它之间的路由问题。

第四步,检查 DNS 解析。部分地区运营商的 DNS 可能对镜像源域名解析出缓慢或者错误的 IP。把宿主机的 DNS 临时改为国内公共 DNS,比如 223.5.5.5 或 119.29.29.29,再重新拉取一次。很多莫名奇妙的超时问题就出在 DNS 上。

5.2 Docker Desktop 启动失败的虚拟化问题

Windows 平台安装 Docker Desktop 后,最常遇到的报错就是 Docker Desktop failed to start because virtualisation support wasn't detected。这个报错本质上是 Windows 的虚拟化功能没有完全开启,Docker Desktop 底层依赖 WSL 2 或 Hyper-V。

排查步骤如下:

  • 打开“启用或关闭 Windows 功能”,确保 Hyper-V、Windows Hypervisor Platform、虚拟机平台 三项全部勾选。
  • 在 BIOS/UEFI 中,确认 Intel VT-x(Intel 平台)或 AMD-V(AMD 平台)已经开启。这一步比较容易被忽略,因为 Windows 功能开了,但物理机 BIOS 里开关没开,虚拟化依然无法生效。
  • 打开终端执行 systeminfo,最后几行会有 Hyper-V 要求 的检测结果。几个项目都显示“是”才能正常启动 Docker Desktop。

如果你用的 Windows 11,还需要额外确认 WSL 2 是否已经在系统里激活:

BASH
wsl --status

如果没有默认版本信息,执行:

BASH
wsl --set-default-version 2

安装一个最小化的发行版(比如 Ubuntu)并启动过一次,再重新打开 Docker Desktop。实测中这一步能把大多数启动失败问题解决掉。

5.3 权限错误与守护进程连接失败的问题

排查思路很简单:把当前用户加入 docker 组,然后重新登录或执行 newgrp docker。但这里有个隐藏知识点:只有重启 Docker 服务或重新登录,组权限才会生效。如果急着用,可以先 sudo usermod -aG docker $USER,再 newgrp docker 让当前会话直接生效,避免还要重启机器。

还有一个场景——在公司内网环境中,经常遇到 Docker daemon 的 socket 权限被统一管控。此时不要直接改用 root 用户登录,而是应该联系管理员确认该账号是否被允许访问 docker 组,再把相应账号加入组即可。

5.4 配置完镜像源后 MySQL 镜像仍然拉不动

针对热搜词里反复出现的 docker 安装 mysql8.0 并使用 和 docker 安装 mysql 失败,我也补充一点实战经验。很多人在配置镜像源之后拉取 mysql:8.0 成功,但紧接着容器起不来,报 Could not open required defaults file: /etc/mysql/my.cnf 或者各种初始化失败。这通常不是镜像源的问题,而是运行参数和挂载目录的问题。

一个比较稳的启动方式:

BASH
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-e MYSQL_DATABASE=testdb \
-v /opt/mysql8/data:/var/lib/mysql \
-v /opt/mysql8/conf:/etc/mysql/conf.d \
mysql:8.0 \
--default-authentication-plugin=caching_sha2_password

注意,/opt/mysql8/data 目录必须提前创建,否则挂载目录的属主和权限可能导致 MySQL 初始化失败。如果容器启动后几秒就退出,先看日志:

BASH
docker logs mysql8

日志里如果有 [ERROR] [MY-011087] Got error: 28: No space left on device,那是 /var/lib/mysql 所在分区满了;如果是权限报错,检查宿主机目录的 ownership,让它归 999:999(MySQL 容器内默认用户是 uid 999)。

6. 镜像加速之外的几个实用建议

镜像源配置解决了“拉得下来”的问题,但真正让镜像使用体验质变的,还有几个容易被忽略的实操点。

第一,生产环境锁定镜像摘要。如果你负责部署服务,切忌长期使用 latest 标签。镜像源虽然稳定,但 Docker Hub 的官方镜像有被篡改或意外更新的风险。正确的做法是:

BASH
docker pull mysql:8.0
docker inspect --format='{{index .RepoDigests 0}}' mysql:8.0

拿到类似 mysql@sha256:xxx 的完整摘要后,在 Compose 文件或部署脚本里固定用它。这样即使某个镜像源缓存了错误数据,也无法影响你的服务运行。

第二,不要在 daemon.json 里堆砌大量已失效的镜像源。我见过一些教程让用户一次性配置十个以上的源,里面夹杂着早已停止服务的域名。这样做的后果是 Docker 在尝试每个不可达源时会增加数秒到数十秒的无谓等待,反而拖慢整体拉取速度。源的数量控制在 3 到 5 个即可,质量远比数量重要。

第三, 可以通过容器启动参数覆盖 DNS。部分网络环境下,容器内解析域名会卡住,导致即使镜像拉取成功了,容器起来也无法正常使用。在 docker run 时加上 --dns 223.5.5.5,或者在 Compose 文件的 dns: 字段里指定,可有效解决。

第四,使用 docker compose 时镜像加速器不需要单独配置,它继承自 Docker daemon 的配置。但有件小事值得注意:如果你用的是 docker compose 自动构建镜像,build 阶段对基础镜像的拉取同样会走 registry-mirrors,所以配置好源以后连 docker build 的速度也会有明显提升,这算是一个隐藏收益。

7. 写在最后的复查建议

镜像源列表是一个有时效性的东西,不管你看到的是哪个版本的清单,只要日期超过一个月,我都建议你花一分钟亲手验证。方法很简单,不用真的拉一个大镜像,拉一个 alpine 就行:

BASH
docker pull alpine

如果 30 秒内能完成,说明配置基本可用。如果超过 1 分钟仍在转圈,那就老老实实按第 3 节的步骤重新检查配置。我个人每隔一段时间会写一个小脚本,把常用的几个镜像源用 curl 全部扫一遍,哪个通了哪个超时了,一目了然。

我给读者的最终建议是:选择一个主源加一个备用源,主源选你本地网络访问延迟最低的那个,备用源选一个历史稳定、口碑较好的公共服务源。另外,如果你使用的是云服务器自带的 Docker 环境,通常云厂商内网有自己的加速地址,比如腾讯云内网可以直接用 mirror.ccs.tencentyun.com,华为云用户可以参考官方文档配置内网加速器,这类内网源的速度和稳定性都优于公网源,值得优先考虑。

相关推荐

基于Python+Open CV的手势识别算法设计

伴随着人工智能时代的到来,人机交互的领域也逐渐成为研究的一大方向;其中,手势识别是人机交互领域的一项关键技术,自此手势识别也迎来了一波高潮,近几年无论是在消费领域、电子领域、数码领域、家电领域甚至汽车领域上,都能或多或少的见到手势识别的身影。 手势识别在设计智能高效的人机界面方面具有至关重要的作用, 目前手势识别已应用到手语识别、智能监控、到虚拟现实等各个领域,手势识别的原理都是利用各种传感器(例如红外、摄像头等)对手部的形态进行捕捉并进行建模,形成一个模型信息的序列帧,而后将这些信息序列转换为机器能够识别的相对应指令(例如打开、切换菜单、移动等)来完成控制。 采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库(模块)的下载,调取电脑摄像头,按帧读取摄像头采集到的头像,形态学处理,图像旋转(由于摄像头采集到的图像是镜像,需要用cv2.flip将摄像头采集到的图像进行处理),选取图片中固定位置作为手势输入,用红线画出手势识别框,基于hsv的肤色检测,进行高斯滤波,找出轮廓,求出图像中手势的凹凸点,手指间角度求取。

努力学习前端的小陈

ROS-CV-ImageConverter:将ROS图像转换为OpenCV(cv :: Mat)类型的图像

ROS-CV图像转换器 依存关系 cv_bridge(ROS软件包)

Willis Wang

计算机视觉图像处理-CV2与图像插值算法

用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int

weixin_38697274

基于水平集CV模型的图像分割(Matlab代码)

基于水平集CV模型的图像分割(Matlab代码),全套代码

小宇QAQ

导向滤波(guide_filter)的python实现

导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

zachzhan_g
返回顶部
脑袋被门夹得好痛
博客等级 码龄8年 39粉丝 8,381原创