国内直连 Docker Hub 经常超时,或者直接返回一个诡异的 IPv6 地址。下面三种办法按优先级排,通常第一种就能解决。

先确认问题在哪

先别急着改配置,用一条命令判断是 DNS 问题还是网络问题:

docker pull hello-world
nslookup registry-1.docker.io

如果 registry-1.docker.io 解析出来的 IP 明显不对,比如落在 2a03:2880::/32 这段,那就是 DNS 被污染了,换 DNS 或者走下面的镜像方案才有用。

提示:公司网络里如果有 HTTP 代理,Docker Desktop 需要单独配置,它不会自动读系统代理变量。

办法一:临时用镜像站拉镜像

不想改任何全局配置时,直接在镜像名前加镜像站前缀:

docker pull docker.m.daocloud.io/library/nginx:1.25-alpine

好处是立刻生效,不用重启 Docker Desktop。缺点是每次写镜像名都要带前缀,compose 文件里也会变长。

办法二:配置 registry-mirrors

在 Docker Desktop 的 Settings → Docker Engine 里加一段:

{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}

保存后 Docker Desktop 会自己重启。之后 compose 文件里就可以写正常的官方镜像名了,不需要前缀。

办法三:给 Docker 配代理

如果你本机有可用的代理(例如 127.0.0.1:7890),在同一个配置里加上:

{
  "proxies": {
    "http-proxy": "http://127.0.0.1:7890",
    "https-proxy": "http://127.0.0.1:7890"
  }
}

三种方式的对比:

方式生效速度是否需要重启适合场景
镜像名加前缀立刻否临时拉一两个镜像
registry-mirrors重启后是长期使用
配代理重启后是有稳定代理时

验证是否成功

最后跑一条:

docker pull library/busybox:latest

能看到 Status: Downloaded newer image 就说明通了。