配置Docker国内镜像后仍访问docker.io失败,如何彻底改用镜像源?
问题描述
执行docker pull时触发超时错误:
Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
已在/etc/docker/daemon.json中配置国内镜像源:
{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ] }
执行重载配置与重启命令后:
sudo systemctl daemon-reload sudo systemctl restart docker
通过docker info确认镜像源已配置成功,但docker pull仍报错;ping docker.io无法连通,将dig得到的IP添加到/etc/hosts也无效。需求是让Docker不再访问docker.io,仅使用已配置的国内镜像源。
解决方案
1. 直接指定国内镜像源拉取镜像
默认不带仓库地址的docker pull命令(如docker pull nginx)会优先请求docker.io。可以直接指定国内镜像源的完整地址拉取,示例:
docker pull docker.mirrors.ustc.edu.cn/library/nginx
拉取完成后给镜像打本地标签,方便后续使用:
docker tag docker.mirrors.ustc.edu.cn/library/nginx nginx:latest
2. 配置Docker禁止访问官方仓库
编辑/etc/docker/daemon.json,添加blocked-registries字段来禁止访问docker.io相关地址:
{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ], "blocked-registries": ["docker.io", "registry-1.docker.io"] }
保存文件后重启Docker服务:
sudo systemctl daemon-reload sudo systemctl restart docker
此时执行不带仓库地址的docker pull,Docker会直接使用配置的国内镜像源拉取。
3. 排查代理配置干扰
检查当前环境是否存在代理变量,可能导致请求被强制导向docker.io:
echo $HTTP_PROXY $HTTPS_PROXY
如果输出代理地址,可临时取消设置:
unset HTTP_PROXY HTTPS_PROXY
同时检查Docker的系统服务代理配置文件(如/etc/systemd/system/docker.service.d/http-proxy.conf),若存在代理配置,可注释或删除后重启Docker。
4. 清理Docker缓存
缓存的镜像元数据可能导致Docker仍尝试访问官方仓库,执行以下命令清理:
docker system prune -a
按提示确认后,会清理未使用的镜像、容器、网络及缓存数据。
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

