利用cloudflare的worker服务搭建DockerHub镜像加速
前因
由于国内的docker镜像源(上海交通大学、中科大、网易、阿里)都关闭了,作为一个docker的重度用户,如果不能方便的拉取一些基础镜像将会大大影响后面的工作效率。反正支持国家政策,我就自己先临时解决吧
解决方案
选择合适的国内镜像源
参考一些大佬整理的仓库:https://github.com/kubesre/docker-registry-mirrors
目前来看国内还能使用的只有m.daocloud.io
可用了,具体使用也可参考:https://github.com/DaoCloud/public-image-mirror
自建镜像代理-正在使用
利用cloudflare的worker服务搭建自己的registry-mirrors,cf的workers每日总计免费10w次请求额度,普通人是几乎不可能用完,但为防止滥用仍建议添加路由和规则限制他人使用,这个方法的本质上是利用cf来进行流量中转,受限于cf的速度,如果自己所在地区cf不可用或者速度偏低,那可以自己用服务器搭建对应的中转服务
项目地址: https://github.com/ciiiii/cloudflare-docker-proxy
前提
- 有 Cloudflare 账号
- 有自定义的域名,且域名托管在 Cloudflare 上(不想花钱购买域名可以用免费的二级域名,比如
eu.org的二级域名
) - Cloudflare Workers 额度足够
cloudflare-docker-proxy使用部署
这里使用 Cloudflare Worker - cloudflare-docker-proxy
搭建。可根据原文 README 步骤来实施。
这里以 自定义域名 配置方式举例, 步骤如下:
- Fork Repo -- 克隆仓库到您的github
-
修改克隆后您仓库的
src/index.js
的const routes
块的内容const routes = { "docker.199604.com": "https://registry-1.docker.io", "quay.199604.com": "https://quay.io", "gcr.199604.com": "https://gcr.io", "k8s-gcr.199604.com": "https://k8s.gcr.io", "k8s.199604.com": "https://registry.k8s.io", "ghcr.199604.com": "https://ghcr.io", "cloudsmith.199604.com": "https://docker.cloudsmith.io", };
- 点击
Deploy
按钮部署,根据步骤一步一步操作即可,部署后如下
- 在 Cloudflare 的 DNS 记录里添加
CNAME
指向部署后的{workername}.{username}.workers.dev
地址。
- 在 Workers 的 HTTP Routes 里,添加
xxx.your-domain.com/*
路由指向 cloudflare-docker-proxy, xxx 就是docker,quay,gcr
等,如下:
Docker Registry Mirror 配置
将配置后的 docker.<your-domain>.com
Mirror 添加到 /etc/docker/daemon.json
的 registry-mirrors
中并重启 Docker 生效。
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.xxxx.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore":true,
"log-driver":"json-file",
"log-opts": {"max-size":"200m", "max-file":"3"},
"max-concurrent-downloads": 10,
"storage-driver": "overlay2",
"experimental": true
}
# 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
进行测试
补充说明
最近使用时候会发现这样下载一些镜像比如 nginx
会出现如下错误:
docker pull docker.xxx.com/nginx:1.21
Error response from daemon: pull access denied for docker.xxx.com/nginx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
这个错误其实是docker官方提供的镜像,默认是在library这个命名空间下的,library
命名空间下的镜像是docker官方维护的,我们通过docker官方地址下载是可以省略命名空间的名字,下载nginx镜像实际上下载的是docker.io/library/nginx:1.21
因此我们使用CF代理的地址下载时候命名空间名称就不能省略,需要使用docker.xxx.com/library/nginx:1.21
下载,如果是镜像本身就有命名空间,比如docker.io/grafana/grafana:8.3.1
是由 Grafana Labs 维护的镜像,就直接使用docker.xxx.com/grafana/grafana:8.3.1
下载即可
参考
1.https://mp.weixin.qq.com/s/BSo3vFJoVe8KzAt3vxJQYA
2.https://mp.weixin.qq.com/s/9yAN9wj152vZNMZb1ReXqA
--cf 添加域名(添加域名ns服务器,免费的二级域名)
3.https://mp.weixin.qq.com/s/5UMqMRvZUGT0TzWMWuF_fw
4.https://github.com/ciiiii/cloudflare-docker-proxy
--仓库
5.https://mp.weixin.qq.com/s/fQ4LLZQBDQw7yDS7DKwHnQ