背景
当我们使用docker pull 镜像的时候,经常会遇到网络问题导致镜像无法下载,然后我们可通过设置别人搭建的镜像地址访问,但是用了一段时间,会发现别人的地址失效了,那可以尝试自己搭建。
条件
- 可以访问 registry-1.docker.io/ 云服务器
云服务器
建议用已有云服务器,没有的话想尝试,推荐衡云天毕竟12元/月就可以买到境外服务器
docker
云服务器安装docker,我的云服务器是ubuntu系统,参照菜鸟教程上安装
# 使用ssl脚本安装
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
docker部署代理 Registry,可以让你在本地缓存镜像,同时从远程仓库(如 Docker Hub)自动拉取缺失的镜像。
# 对外使用80端口,这样一来就不用开安全组了,5000是容器里面的端口
docker run -d -p 80:5000 --name registry -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io registry:2
本机docker配置
修改Docker daemon配置,添加insecure-registries不安全注册表,因为不是https,registry-mirrors仓库地址。也可以把他变成https,需要购买一个域名,在阿里上申请免费证书,然后通过nginx配置证书指向这个应用。
"insecure-registries": ["217.194.133.147:80"],
"registry-mirrors": [
"http://217.194.133.147:80"
]
如图下,配置好点击Apply & restart 应用并重启一下
通过cmd命令拉取redis镜像如下
PS C:\Users\22787\Videos> docker pull redis:7.4.1
7.4.1: Pulling from library/redis
a480a496ba95: Pull complete
89511e3ccef2: Pull complete
4ca428e0bb5e: Pull complete
41cc262fb5bb: Pull complete
228fc9e0b0ff: Pull complete 23d1d45ab415: Pull complete
4f4fb700ef54: Pull complete
6adf9ee29d6f: Pull complete
Digest: sha256:a06cea905344470eb49c972f3d030e22f28f632c1b4f43bbe4a26a4329dd6be5
Status: Downloaded newer image for redis:7.4.1
docker.io/library/redis:7.4.1
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview redis:7.4.1
PS C:\Users\22787\Videos>
通过curl查看缓存镜像,可以看到里面有redis。
C:\Users\22787>curl http://217.194.133.147:80/v2/_catalog
{"repositories":["library/redis"]}
总结
自己搭建的需要一定的成本,下载速度受带宽限制,但是稳定能用。
题外-registry怎么被拦截的
简单 ping registry-1.docker.io 发现他指向一个ipv6。
PS C:\Users\22787\Videos> ping registry-1.docker.io
正在 Ping registry-1.docker.io [2a03:2880:f134:183:face:b00c:0:25de] 具有 32 字节的数据:
找一个能访问registry-1.docker.io去ping一下,指向的是一个ipv4。
root@ht2024102144439:~# ping registry-1.docker.io
PING registry-1.docker.io (54.227.20.253) 56(84) bytes of data.
本机尝试curl访问,发现ip是可以访问。
C:\Users\22787>curl 54.227.20.253
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
修改C:\Windows\System32\Drivers\etc\hosts,将registry指向正确的ip,添加如下
54.227.20.253 registry-1.docker.io
如下,尝试本机访问,会发现连接重置了,实际上本机和54.227.20.253三次握手成功了,中间有机器窥视tcp包里下http协议的host,发现有registry-1.docker.io就返回rest标志,感兴趣的可以抓包看看。
C:\Users\22787>curl registry-1.docker.io
curl: (56) Recv failure: Connection was reset
简单修改一下hosts,docker变成docker1。
54.227.20.253 registry-1.docker1.io
如下,发现是可以访问的,估计他的规则是发现域名是*.docker.io就是返回一个rest标志重置连接。
C:\Users\22787>curl registry-1.docker1.io
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
本来还想通过配置registry-1.docker.io配置一个正确的ip就可以访问的,是不可行的。