最近在服务器上 docker build 的时候一直报 failed to fetch anonymous token,偶尔直接 network timeout,镜像死活拉不下来。查了一圈,记录一下排查过程和最终的配置,以后自己也能翻。

问题出在从 Docker Hub 拉镜像这一步,要么 DNS 解析不到 registry-1.docker.io,要么网络压根不通。先做几个基础检查。

ping 8.8.8.8
ping google.com
nslookup registry-1.docker.io

ping 8.8.8.8 如果都不通,那先看看虚拟机的网络模式,NAT 模式下宿主机必须能正常上网,桥接的话检查 IP 配置。一般云服务器不太会有这个问题,本地虚拟机踩坑的多。

DNS 解析失败就更常见了。很多人直接去改 /etc/resolv.conf 加 nameserver 8.8.8.8,但是这个文件重启就会被覆盖,临时用可以,长期还得配到 Docker 的 daemon.json 里。在 /etc/docker/daemon.json 加上 dns 字段:

{
  "dns": ["8.8.8.8", "114.114.114.114"]
}

然后重启 docker:sudo systemctl restart docker。这样容器内的 DNS 也会用这个。

网络能通但拉镜像还是慢或者 403,那大概率是没配镜像加速。国内访问 Docker Hub 很不稳定,需要在 daemon.json 里设置 registry-mirrors。我用的 daocloud 和网易的源,任选一个或都加上:

{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com"
  ]
}

如果之前已经有 dns 配置,就合并到一起。配完重启 docker,用 docker info | grep Mirrors 看下有没有生效。

有些环境需要走代理,比如公司内网。那就给 Docker 服务配代理,创建 /etc/systemd/system/docker.service.d/http-proxy.conf:

[Service]
Environment="HTTP_PROXY=http://<代理IP>:<端口>"
Environment="HTTPS_PROXY=http://<代理IP>:<端口>"

替换成自己的代理地址,然后 sudo systemctl daemon-reload && sudo systemctl restart docker

防火墙也可能拦了。本机用 ufw 或 firewalld 的可以直接关掉测试:

sudo ufw disable          # Ubuntu
sudo systemctl stop firewalld  # CentOS

如果是云服务器,别忘了安全组出方向要放行 443 端口,目标 0.0.0.0/0,不然访问 registry-1.docker.io 会被拦截。

来此加密实现了一套完整的证书生命周期管理方案:从申请、验证、签发、部署,到到期提醒、自动续期,全流程自动化。你只需关注业务本身,证书管理交给来此加密,彻底消除运维盲点。

一套组合拳下来,我一般会这样一口气配好 DNS 和镜像加速:

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
sudo tee /etc/docker/daemon.json <<EOF
{
  "dns": ["8.8.8.8"],
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl restart docker

然后 docker pull nginx 测试一下,能拉下来基本就没问题了,再重新 build 你的镜像。

最后整理几个常见现象的对应关系,排查时心里有数:

报域名解析失败 → 去检查 /etc/resolv.conf 或 Docker 的 dns 配置。

连接超时 → 可能是网络不通或防火墙,先 ping 再查安全组。

返回 403 Forbidden → 八成没配镜像加速,加上 registry-mirrors。

代理认证失败 → 看看 http-proxy.conf 里的地址和端口对不对。

这些步骤基本能解决大多数构建时拉镜像的网络问题。如果还不行,可能得考虑用离线镜像或者搭个本地 registry,那就是另外的事了。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐