你说你是一个程序员,你连Github都打不开?好了,现在又多一项,dockerhub也打不开了。
1.背景分析
近期做开发和运维的同学都发现了,dockerhub镜像仓库已经无法正常的访问,同时也无法拉取镜像了,直接访问时出现“无法访问此网站”,并给出超时的返回:ERR_CONNECTION_TIMED_OUT
尝试从用docker去拉一些常用的镜像,也是timeout无法拉取,我这台是腾讯云主机,官方云服务器亦是如此。测试发现,默认镜像站点的DNS也被污染和SNI阻断。
同时国内的众多镜像站点也纷纷停止服务,比如上海交通大学 Linux 用户组发布的公告:“即时起中止对 Docker Hub 仓库的镜像。Docker 相关工具默认会自动处理失效镜像的回退,如果对官方源有访问困难问题,建议尝试使用其他仍在服务的镜像源”。
其它国内镜像加速站点也逐渐无法使用,如腾讯docker镜像站:
网易docker镜像站:
百度docker镜像站:
中国科技大学docker镜像站:
这波操作打的各位互联网从业者措手不及,纷纷寻求解决办法。你是否受到影响?
2.解决方法
dockerhub无法访问的原因,我们不再去深究,感兴趣的小伙伴可以去检索相关的内容。本次主要讨论解决措施。
如果是企业用户,可能大多数都有自己的镜像仓库,如harbor,短期内可能没有太大的影响,主要为源头拉取镜像时的故障。如果是非自建用户,影响会较大,以下为大家提供了几种解决办法。
2.1 方法1:更换镜像源
经测试,当前还有一些镜像源可以正常使用,可供临时使用,修改方式如下:
sudo mkdir -p /etc/docker
sudo cp -f /etc/docker/daemon.{json,json.bak}
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
再次拉取,发现已经可以正常拉取了,我以nginx/mysql为例:
docker pull nginx
docker pull mysql
可以看到已经正常的拉取下来了。
注意的是,镜像加速可能随时会失效,注意提前将需要拉取的镜像存放本地,以备不时之需。
2.2 方法2:转储文件
如果你的业务不是很复杂,仅仅需要在工作或生活偶尔拉取几个镜像文件,可以采用手动拉取镜像的方式实现,前提是你需要有一台能够连接国际互联网的云服务器。
假设具备这样的条件,那么可以在云服务器上进行拉取,并手动转储至本地环境进行导入,具体操作如下:
从云服务器上拉取需要的镜像文件,以nginx为例:
# 执行镜像拉取
docker pull nginx
在云服务器上导出镜像并下载至需要导入的目标服务器上
# 转储
docker images | grep nginx
docker save -o nginx.tar nginx:latest
# 执行文件下载并传输至需要导入的服务器
在目标机器上执行导入
docker load -i nginx.tar
这样就完成了镜像的部署。
2.3 方法3:转储仓库
在方法2的条件下,如果你有一台可以连接国际互联网的机器,并且有一台国内云服务器或具备公网的云服务器,那么可以在私有服务器上部署镜像仓库(或使用阿里云镜像服务),在通过拉取镜像后,修改私服的tag,最后推送到私服仓库。
我以阿里云私有镜像仓库为例,阿里云镜像服务:https://cr.console.aliyun.com/
在阿里云中搜索容器镜像服务。
找到个人实例:
点击创建镜像仓库,比如我创建了一个nginx的仓库,并修改命名空间为yunweizeichuan。
点击创建本地仓库。
根据下方的操作指南在海外服务器上登录,以推送nginx:1.24镜像为例子。
所以我这里执行的命令为:
# 登录仓库,xxx为实际用户名
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
# 修改tag
docker tag nginx:1.24 registry.cn-hangzhou.aliyuncs.com/yunweizeichuan/nginx:1.24
# 推送镜像
docker push registry.cn-hangzhou.aliyuncs.com/yunweizeichuan/nginx:1.24
即可实现推送,然后使用预先定义的tag即可在任意服务器上下载软件。
2.4 方法4:自建加速代理
此处自建代理的方式,不展开讨论实现过程,感兴趣的朋友可自行研究实现。此处提供github地址,供各位朋友参考:
https://github.com/dqzboy/Docker-Proxy
3.总结
以上提供了4种方法解决docker无法拉取镜像的问题,希望能对各位有帮助。
评论区