)
上周在一台新装的 CentOS 7 服务器上部署 nginxdocker pull nginx 敲下去卡在 Pulling fs layer 二十多分钟没动静最后超时报错。查了一圈发现这不是个例——2024 年下半年之后 Docker 官方在中国大陆的 CDN 节点陆续下线很多以前教程里推荐的加速器USTC、163、阿里云公共加速等要么停了要么需要登录拿专属地址网上不少文章还在贴老配置抄过来根本不生效。这篇记录一下我最后跑通的配置以及中间踩到的几个坑。环境项目版本OSCentOS 7.9 / Ubuntu 22.04两台都测过Docker Engine24.0.7网络阿里云 ECS无公网代理Windows/Mac 用 Docker Desktop 的同学配置方式略有不同文章最后一节单独讲。报错长什么样$ docker pull nginx Using default tag: latest latest: Pulling from library/nginx docker: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).或者更常见的是——不报错就是慢。看 docker pull 输出停在某一层速度几十 KB/s 甚至 0 B/s最后卡死。为什么会这样Docker 默认从 registry-1.docker.io 拉镜像这个域名在国内解析出来的 IP 长期不稳定TCP 握手丢包率高。registry-mirrors 配置的作用就是让 Docker 客户端在拉 Docker Hub 镜像时先走你配置的国内镜像地址走不通再回退到官方源。要注意两点registry-mirrors只对 Docker Hubdocker.io生效对 gcr.io、quay.io、k8s.gcr.io、ghcr.io 这些第三方仓库不起作用。你要拉 k8s.gcr.io/pause:3.9 得单独想办法比如手动 retag 或用 imagePullSecrets。镜像源本质是缓存代理热门镜像速度快冷门镜像可能触发回源回源失败照样拉不下来这不是配置问题。完整配置步骤1. 编辑 daemon.jsonsudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json写入{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.1panel.live, https://hub.rat.dev ], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }配置多个地址是有意义的Docker 会按顺序尝试前一个失败自动切下一个。顺手把日志滚动也配上不然 /var/lib/docker/containers/ 迟早撑爆磁盘这是另一个坑见文末。注上面四个地址是我 2026 年 9 月实测可用的第三方镜像站随时可能关停或改域名用之前建议先 curl 一下for url in https://docker.m.daocloud.io https://dockerproxy.com https://docker.1panel.live https://hub.rat.dev; do echo -n $url - curl -sS -o /dev/null -w HTTP %{http_code} %{time_total}s\n --max-time 5 $url/v2/ done返回 HTTP 200 或 HTTP 401 都算活着401 是需要认证正常000 或超时就是挂了。2. 重载并重启sudo systemctl daemon-reload sudo systemctl restart dockerdaemon-reload 是让 systemd 重新读 unit 文件restart docker 才是让 Docker 重新读 daemon.json。两个都要执行只跑后一个有时候配置不生效。3. 验证配置生效$ docker info | grep -A 5 Registry Mirrors Registry Mirrors: https://docker.m.daocloud.io/ https://dockerproxy.com/ https://docker.1panel.live/ https://hub.rat.dev/看到列表就 OK。如果 docker info 里没有 Registry Mirrors 这一节说明 daemon.json 格式错了多半是漏了逗号或者写了注释JSON 不支持注释。可以用 jq . /etc/docker/daemon.json 或者 python3 -m json.tool /etc/docker/daemon.json 校验一下语法。4. 拉一个镜像试试$ time docker pull nginx latest: Pulling from library/nginx a480a496ba95: Pull complete ... Digest: sha256:... Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest real 0m12.341s12 秒拉完正常水平。如果还是几十分钟不动往下看排错。常见问题配了以后还是慢/失败多半是所配镜像站当前不通。用上面的 curl 脚本挨个测把返回 000 或超时的地址从数组里删掉。也可以去 GitHub 搜 docker mirror 2026 找当下社区维护的可用列表。docker: Error response from daemon: Get https://xxx/v2/: x509: certificate signed by unknown authority镜像站用了自签证书。生产环境不建议加 insecure-registries直接换一家。docker pull 报 unauthorized: authentication required说明这个镜像站需要账号比如阿里云的公共加速器现在要登录容器镜像服务拿专属地址。要么注册拿地址要么换不需要账号的。systemctl restart docker 之后 docker 起不来journalctl -u docker -n 50 看日志90% 是 daemon.json 语法错误改回来即可。拉私有仓库镜像如 registry.cn-hangzhou.aliyuncs.com/xxx没走加速器这是正常的registry-mirrors 只管 Docker Hub。私有仓库该配 docker login 就配该走 VPN 就走。日志文件把磁盘写满了跟加速器无关但一起改了省事。上面 daemon.json 里的 log-opts 就是干这个的单文件 100MB保留 3 份滚动。改完 systemctl restart docker 生效已有容器的日志不会追溯清理需要 truncate -s 0 /var/lib/docker/containers/*/*-json.log。Windows / Mac Docker DesktopDocker Desktop 不用改 /etc/docker/daemon.json路径不一样打开 Docker Desktop → 右上角齿轮Settings→Docker Engine标签在 JSON 编辑器里加同样的 registry-mirrors 字段点Apply Restart命令行党也可以直接改文件Windows%USERPROFILE%\.docker\daemon.json旧版本或从 Settings UI 改新版本推荐Mac~/.docker/daemon.json改完在 PowerShell / Terminal 里 docker info 验证一下逻辑和 Linux 一样。WSL2 后端要注意Docker Desktop 用 WSL2 时容器实际跑在 WSL 里的 dockerd配置还是从 Desktop UI 下发不要去 WSL 里改 /etc/docker/daemon.json改了会被覆盖。小结registry-mirrors 本身不复杂坑主要在镜像源可用性时效短、只覆盖 Docker Hub、JSON 语法要求严格这三件事上。写这篇的目的不是给一份永久可用的配置——那种东西不存在——而是给一套自己判断当前哪家能用、出问题怎么排查的方法。如果你现在正在被 docker pull 卡住建议先跑上面那段 curl 循环五分钟就能定位到是配置错了还是镜像源挂了。