这类问题我又碰上了一次。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 只打一行警告仍会启动,容易误以为配置已生效。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189