搭建私有的镜像代理服务

less than 1 minute read

在 Kubernetes 和 Docker 的使用场景中,经常需要从各种公共镜像仓库(如 k8s.gcr.io, docker.io 等)拉取镜像。然而,由于网络问题或镜像仓库访问限制,直接拉取可能会失败。这里介绍一个轻量级镜像代理服务 DaoCloud/crproxy,帮助你快速搭建自己的镜像代理,解决镜像拉取难题。

注意:当前方案适用于少量用户的场景。如果用户量较大,可能会出现性能瓶颈。作者项目中已包含适用于大规模场景的代码,但尚未完善文档。如果你有兴趣,欢迎提交 PR 贡献代码和文档!

前提条件

  • 准备一台访问网络畅通的服务器;

  • 准备一个域名(无需备案)并做好 DNS 解析:添加两条解析记录 @ 记录 和 * 记录到准备好的服务器的 IP;

    如果想使用二级域名,如 cr.aluopy.cn ,则可以将 cr*.cr 解析到服务器 IP。

  • 安装好 docker 和 docker-compose。

开始部署

本文使用的域名为 cr.aluopy.cn

# 拉取代码
git clone https://github.com/DaoCloud/crproxy.git

# 进入项目目录
cd crproxy/examples/default

# 修改域名
# 将cr.aluopy.cn换成你自己的域名
sed -i "s,m.daocloud.io,cr.aluopy.cn,g" start.sh

# 启动服务
./start.sh

如果出现了报错大概率是申请 ssl 证书时,ca 机构检查到没有将域名解析到当前服务器导致的。

如果刚刚添加了域名解析,等解析生效后重新执行 ./start.sh 即可。

如果一切正常这时候你就可以通过添加前缀的方式拉取镜像了。

使用方法

1. 增加前缀 (推荐方式)

注意事项

适用于所有 Registry

使用方式

映射关系如下:

k8s.gcr.io/coredns/coredns:v1.8.6 => cr.aluopy.cn/k8s.gcr.io/coredns/coredns:v1.8.6

拉取镜像:

docker pull cr.aluopy.cn/k8s.gcr.io/coredns/coredns:v1.8.6

2. 前缀替换

注意事项

此方式只支持已配置域名别名的 Registry,如果有需要可以再添加。

使用方式

映射关系如下:

k8s.gcr.io/coredns/coredns:v1.8.6 => k8s-gcr.cr.aluopy.cn/coredns/coredns:v1.8.6

拉取镜像:

docker pull k8s-gcr.cr.aluopy.cn/coredns/coredns:v1.8.6

已配置别名的 Registry

目前已配置的 Registry 域名别名如下:

源站 别名
cr.l5d.io l5d.kubesre.xyz
docker.elastic.co elastic.kubesre.xyz
docker.io docker.kubesre.xyz
gcr.io gcr.kubesre.xyz
ghcr.io ghcr.kubesre.xyz
k8s.gcr.io k8s-gcr.kubesre.xyz
registry.k8s.io k8s.kubesre.xyz
mcr.microsoft.com mcr.kubesre.xyz
nvcr.io nvcr.kubesre.xyz
quay.io quay.kubesre.xyz
registry.jujucharms.com jujucharms.kubesre.xyz

3. 透明拉取

注意事项

通过这种方式只能加速 docker hub 的镜像,对于其他镜像仓库,比如 k8s.gcr.io, quay.io 等,需要使用前面的方式进行加速。

使用方式

Ubuntu14.04、Debian7Wheezy

对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址:

DOCKER_OPTS="--registry-mirror=https://docker.cr.aluopy.cn"

Ubuntu16.04+、Debian8+、CentOS7

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

{
  "registry-mirrors": [
    "https://docker.cr.aluopy.cn"
  ]
}

镜像拉取

以上配置完成后,直接输入镜像原地址拉取即可:

docker pull mysql:5.7

扩展

新增前缀替换支持的 Registry

k8s.gcr.io 镜像仓库为例。

添加别名

# 设置环境变量
GETEWAY=cr.aluopy.cn

# 设置别名
./setup-alias.sh k8s-gcr.${GETEWAY} k8s.gcr.io ${GETEWAY}

为别名申请证书

./update-tls.sh k8s-gcr.${GETEWAY}

重启 nginx 服务

./reload.sh

不出意外这时候你就可以使用前缀替换方式拉取 k8s.gcr.io 的镜像了。