最近在服务器上 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,那就是另外的事了。