自己简单搭建docker镜像源加速,稳定可用

473 阅读3分钟

背景

当我们使用docker pull 镜像的时候,经常会遇到网络问题导致镜像无法下载,然后我们可通过设置别人搭建的镜像地址访问,但是用了一段时间,会发现别人的地址失效了,那可以尝试自己搭建。

条件

云服务器

建议用已有云服务器,没有的话想尝试,推荐衡云天毕竟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 应用并重启一下

QQ20241101-054035.png

通过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就可以访问的,是不可行的。