ubuntu系统中无法拉取docker镜像的问题及解决
作者:半壶清水
作者遇到的docker拉取mysql8.0镜像失败的问题,通过更换镜像加速器、更新配置、诊断DNS解析问题等步骤,最终成功使用DaoCloud镜像站拉取镜像,作者分享了解决问题的过程和经验,对遇到类似问题的人会有帮助
1、检查基础环境
1.1 查看docker运行状态
sudo systemctl status docker

1.2 查看docker镜像加速器
cat /etc/docker/daemon.json
- 如下图是阿里云的镜像加速器

以上说明环境配置正确。接下来我们拉取mysql的docker镜像。
2、故障描述
2.1、尝试拉取mysql 8.0 的docker镜像
sudo docker pull mysql:8.0
2.2 控制台输出的故障描述
Error response from daemon: unknown: failed to resolve reference
“docker.io/library/mysql:8.0”: unexpected status from HEAD request to
https://2u56bifc.mirror.aliyuncs.com/v2/library/mysql/manifests/8.0?ns=docker.io:
403 Forbidden

2.3 故障现象解读
根据上述错误日志,可以看出镜像服务器拒绝了访问请求。
表示系统无法识别或处理指定的引用或资源。
3、问题处理思路:
3.1 查看你 Docker 配置文件中关于镜像加速器的设置
cat /etc/docker/daemon.json
- 从下图可知,阿里云镜像加速器配置没有问题

3.2 更新镜像源配置
- 更新为网易源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3.3 重新拉取docker镜像
sudo docker pull mysql:8.0

3.4 分析新的故障现象
- 看看这次的故障现象和初始故障明显不同
Error response from daemon: failed to resolve reference
“docker.io/library/mysql:8.0”: failed to do request: Head
“https://hub-mirror.c.163.com/v2/library/mysql/manifests/8.0?ns=docker.io”:
dial tcp: lookup hub-mirror.c.163.com on 127.0.0.53:53: no such host
- 新故障现象解读
这个新的错误表明,系统无法将网易镜像的域名 hub-mirror.c.163.com 解析为IP地址。可见这是一个 DNS解析故障。
3.5 诊断DNS解析问题
- 尝试解析网易镜像源域名
nslookup hub-mirror.c.163.com

试试解析百度域名
nslookup www.baidu.com

- 通过对比,解析网易域名失败,但解析百度域名成功。可以确认我的DNS服务器工作正常,但可能无法解析网易这个特定域名。可见还是镜像站不可用。
3.6 继续更换新的镜像站
- 尝试使用DaoCloud 镜像站
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 我们先尝试解析IP:
nslookup docker.m.daocloud.io

- 上图中域名解析成功,我们再尝试拉取mysql:8.0镜像,这次可以成功下载。
sudo systemctl pull mysql:8.0


4、总结
如果你不知道哪个镜像站可用,你也可以将一些常用的站点一次写入到你的daemon.json文件中:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.comk",
"https://registry.docker-cn.com",
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
