前言
Dockerhub 被限制使用之后,我尝试了一些方案去应对。
- 使用国内镜像源替代
- 国内镜像加速
- 使用代理
1 方案问题是目前大多数国内镜像源都无法使用,偶有能够访问的,镜像版本太落后。
2 方案我没有尝试成功(使用阿里云镜像加速)。
3 方案受限于某些场景,例如公司或客户的服务器,无法进行代理的配置。
之后我发现一种利用阿里云自建容器镜像服务的方法。
介绍
回到问题的最初,我们无法拉取Dockerhub的镜像是因为网络问题,而我们列出的方案核心都是解决网络问题。我们使用阿里云也是因为网络可连接,所以可以尝试使用Github Action去将镜像重新打包并推送至阿里云,然后我们再从阿里云拉取。
开始之前需要准备:阿里云账号和Github账号。
接下来,我将用 beancount-gs这个仓库演示如何去维护一个镜像仓库。
步骤
Fork目标项目
登录 Github 账号,Fork 一下目标仓库,前提是该存在Dockerfile,支持我们进行镜像构建。
当然有时候我们也会需要一些公共组件维护到私有镜像仓库,例如 nginx,这里我的方案是新建一个 Github 仓库维护一个 Dockerfile 文件,例如:nginx
创建镜像仓库
访问并登录阿里云 https://cr.console.aliyun.com/ ,进入容器镜像服务
选择左侧的代码源,绑定Github账号。
点击进入个人实例,再点击左侧镜像仓库,新建镜像仓库。
如下图,填写仓库信息。
如下图,找到对应的Github仓库,点击创建镜像仓库。
创建完成后,如下图,选择左侧构建菜单,构建规则一栏已经默认内置了一条规则,这条规则的意思是,当指定Github仓库的满足这个格式的release-v$version
的 Tag 出现变动时,阿里云镜像仓库会自动根据这个Tag进行代码的镜像构建。但我在这里的测试未成功,会出现无法获取基础镜像的网络问题。
不过没关系,接下来,我会介绍如何使用 Github Actions 去自动构建镜像并推送至阿里云。
构建&推送
在阿里云的镜像仓库左侧基本信息一栏的操作指南中,第三条:将镜像推送到Registry。
因为需要借助 Github Actions 进行镜像推送,所有需要先创建一个 docker-publish.yml
文件,这个文件是当 Github 仓库的分支变动时,会将对应的分支构建镜像并推送至阿里云。
这个 yml 我是使用 chatgpt 完成,也可以根据不同的需求进行完善。
1 | name: Docker Build and Push |
然后,在Github仓库新建下图的三个 secrets,分别是:
ALIYUN_USERNAME
阿里云镜像库用户名ALIYUN_PASSOWRD
阿里云镜像库访问密码ALIYUN_REGISTRY
阿里云镜像库仓库地址
构建完成后,回到阿里云镜像仓库,镜像版本已经存在。可以按照基本信息中的提示,进行拉取使用。
大功告成。
附加
同样的方法,也完成了对 BaoXuebin/nginx 仓库的镜像构建。