这类问题我又碰上了一次。Ubuntu 20.04 上在 daemon.json 里加了国内镜像加速地址,systemctl restart docker 之后 docker pull nginx 依旧卡在 waiting,十分钟后报 TLS handshake timeout。
第一反应是「只对 docker.io 生效,拉的是 quay.io 的镜像,镜像站并不代理」,验证下来不成立。
排查方向其实有限,先把可能性排一排。daemon.json 里同时写了 registry-mirrors 和旧的 insecure-registries,格式错导致整份配置没加载;镜像地址少写了 https 前缀或者多了结尾斜杠,docker 直接忽略;改完没有真正重启 dockerd,只是 reload 了配置。
先确认 docker 实际加载的配置
docker info | grep -A3 'Registry Mirrors'
校验 daemon.json 的 JSON 语法
python3 -m json.tool /etc/docker/daemon.json
接着按官方格式重写并重启服务
systemctl daemon-reload && systemctl restart docker
等前面都确认过,再用带完整域名的镜像再试一次
docker pull docker.io/library/nginx:1.25
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
恢复的判定其实很直接。docker info 的 Registry Mirrors 里能看到配置的地址,docker pull 在 30 秒内完成,docker images 里出现 nginx 1.25。
镜像加速只代理 docker.io,其他仓库要单独配;配置文件语法错时 dockerd 只打一行警告仍会启动,容易误以为配置已生效。这类问题最好一次改到位,反复小改反而容易把原因搅混。
