资源整理 | 国内可用镜像仓库代理
noteId
4
date
Aug 1, 2024
slug
china-mirror-proxy
status
Published
tags
科技
容器
Docker
summary
举例国内可以的使用的镜像代理
type
Post
起因
今日购入一台阿里云 ECS,在折腾的时候发现部分国外的镜像拉取速度过慢,并且阿里云 ACR 镜像加速下载的镜像都不是最新的,寻找了些一些解决方案和国内可用的镜像代理服务,在这里做个记录。
由于不可抗力,多数镜像代理服务平台已经下线代理,于 2024/10/12 对此文进行更新,下表为收集的加速器列表,不定时更新,有失效可能。
镜像加速器列表
供应商
加速器地址
官网
备注
https://docker.m.daocloud.io
仅限境内机器使用,白名单模式,不在名单的镜像需要提交申请。
https://docker.1panel.live
https://dockerproxy.1panel.live
https://proxy.1panel.live
仅限境内机器使用,可能会有流量限制。
我搜索到是很多人在使用 Cloudflare Wokers 自建镜像代理,对于此种方式我不予评价,有兴趣的可以自行搜索相关教程。
目前提供镜像加速服务的供应商较少,由于我使用的是阿里云 ECS,因此为了方便,我通过 GitHub Action 定时同步镜像到阿里云 ACR 来使用 Docker,本文的目的就是想跟大家分享一下我在同步镜像的经验,希望可以给大家提供一个参考。
使用 GitHub Action 定时同步镜像到阿里云 ACR
本文主要有以下几个部分:
- 如何在 ACR 中创建镜像仓库命名空间和仓库
- 如何获取 ACR 的授权信息
- 如何配置 GitHub Actions 同步镜像
事不宜迟,那让我们马上开始吧!
Step 1. 在 ACR 中创建镜像仓库命名空间和仓库
搭建第一步是在阿里云容器镜像服务(Aliyun Container Registry)中创建命名空间(namespace)和镜像仓库(repository)。在开始之前,我想先解释一下这个镜像服务地址、命名空间、以及仓库名字的含义。因为明白它们的含义有助于理解下文,理解现在做到哪一步。在下载 Docker image 的时候,一个仓库的全称可能长成下面这样:
也就是:
具体来说,
REGISTRY
是阿里云容器镜像服务地址,其中的cn-shenzhen
是区域的地址,你只需要替换到离你最近的区域即可,可用的区域列表请参考地域和可用区列表中的地域ID
。
NAMESPACE
是镜像的命名空间,管理该命名空间下的仓库集合,包括仓库权限和仓库属性,这里你随意设置一个自己记得住的字符串即可。
REPOSITORY
是镜像仓库的名称,尽量输入易于辨别的字符串,比如我同步vaultwarden/server
镜像到ACR就是registry.cn-shenzhen.aliyuncs.com/qinyangwang/vaultwarden
。
了解了镜像名称之后,我们开始创建镜像仓库实例:
- 登录容器镜像服务控制台。
- 使用账号登录,需要设置Registry登录密码。
- 使用RAM角色登录,需要调用接口获取临时账号密码登录。具体操作,请参见GetAuthorizationToken - 获取用于登录实例的临时账号和临时密码。
若您是首次登录容器镜像服务控制台,您需要设置Registry登录密码,以便镜像的上传和下载。
- 在顶部菜单栏,选择所需地域。
- 在左侧导航栏,选择实例列表。
- 在实例列表页面,单击个人版区域任意位置。
- 在提示对话框单击创建个人版。
- 在个人版实例管理页面选择仓库管理 > 命名空间。
- 在命名空间页面单击创建命名空间。
- 在创建命名空间对话框中设置命名空间名称,单击确定。
Step 2. 获取 ACR 的授权信息
获取镜像仓库的登录名
- 如果您使用的是阿里云账号,阿里云账号就是您的镜像仓库登录名。
- 如果您使用的是RAM用户,去掉RAM用户账号aliyundoc.com后的名称就是您的镜像仓库登录名。例如您的RAM用户为28768383240243****@aliyundoc.com,则您的镜像仓库登录名为28768383240243****。
设置镜像仓库登录密码
- 登录容器镜像服务控制台。
- 单击设置Registry登录密码。
如果您忘记设置的Registry登录密码,您可以在个人实例 > 仓库管理 > 访问凭证来重置密码。
- 在设置Registry登录密码对话框中输入密码和确认密码,单击确定。
Step 3. 配置 GitHub Actions 同步镜像
配置 GitHub Actions 可以参考我的 GitHub 仓库:
- 准备
auth.yaml
,images.yaml
,image-sync.yml
这 3 个文件,它们分别是镜像仓库认证信息,源和目标镜像映射关系,Action 工作流模板,按下面的路径存储:
- 除了
image-sync.yml
的路径是固定的,其他两个路径可以自定义,只需要在image-sync.yml
修改参数即可:
- 需要在
auth.yaml
中输入目标 registry 的鉴权信息(如果源 registry 也需要鉴权,则源 registry 的鉴权信息也需要输入),最佳实践是将鉴权信息输入到 Secrets 中,然后在image-sync.yml
中作为env
使用,最后在auth.yaml
中以${XXX}
的形式引用:
在GitHub 仓库的 Settings 中点击 Secrets and variables > Actions,然后在 Repository secrets 点击 New repository secret 来添加鉴权信息:
- 镜像同步配置文件定义了所有的镜像同步规则。每条规则都是一个键值对,键表示“源镜像地址”,值表示“目标镜像地址”。源/目标镜像地址与我们在
docker pull/push
命令中使用的 url 基本相同,但在“tags 和 digest”部分还是有区别的: - 源镜像url和目标镜像url都不能为空。
- 如果源镜像url不包含tags或digest,则源仓库的所有tags都会被同步。
- 源镜像url可以有多个tags,tags之间用逗号隔开,只有指定的tags才会被同步。
- 源镜像url最多只能有一个digest,目标镜像url只能没有digest或者同时有相同的digest。
- 源镜像url的“tags”部分可以是一个正则表达式,需要有一个额外的前缀和后缀字符串/。源仓库中所有符合正则表达式的标签都会被同步,不支持多个正则表达式。
- 如果目标镜像url没有摘要或标签,则表示源镜像在同步后会保留相同的标签或摘要。
- 目标镜像url可以有多个标签,标签数量必须与源镜像url中的标签数量相同,则所有源镜像的标签都会更改为新标签(从左到右对应)。
- “目标镜像url”也可以是一个数组,每个数组都遵循上述规则。
- 我在
image-sync.yml
中配置了两个触发条件,你可以参考 GitHub 文档按需修改: - 每日0点(UTC时间)
- 当
main
分支有新的提交 - 配置完成之后,此 Action 会每日定时同步镜像到 ACR 中,我目前使用的镜像较少没有什么特殊的问题,如果你有什么使用问题请在 QinYangWang/actions 这个仓库下提交 issues,我会尽量解答或修复相关问题。