前言

Dockerhub 被限制使用之后,我尝试了一些方案去应对。

  1. 使用国内镜像源替代
  2. 国内镜像加速
  3. 使用代理

1 方案问题是目前大多数国内镜像源都无法使用,偶有能够访问的,镜像版本太落后。
2 方案我没有尝试成功(使用阿里云镜像加速)。
3 方案受限于某些场景,例如公司或客户的服务器,无法进行代理的配置。

之后我发现一种利用阿里云自建容器镜像服务的方法。

介绍

回到问题的最初,我们无法拉取Dockerhub的镜像是因为网络问题,而我们列出的方案核心都是解决网络问题。我们使用阿里云也是因为网络可连接,所以可以尝试使用Github Action去将镜像重新打包并推送至阿里云,然后我们再从阿里云拉取。

01

开始之前需要准备:阿里云账号和Github账号。

接下来,我将用 beancount-gs这个仓库演示如何去维护一个镜像仓库。

步骤

Fork目标项目

登录 Github 账号,Fork 一下目标仓库,前提是该存在Dockerfile,支持我们进行镜像构建。

当然有时候我们也会需要一些公共组件维护到私有镜像仓库,例如 nginx,这里我的方案是新建一个 Github 仓库维护一个 Dockerfile 文件,例如:nginx

创建镜像仓库

访问并登录阿里云 https://cr.console.aliyun.com/ ,进入容器镜像服务

02

选择左侧的代码源,绑定Github账号。

04

点击进入个人实例,再点击左侧镜像仓库,新建镜像仓库。

03

如下图,填写仓库信息。

05

如下图,找到对应的Github仓库,点击创建镜像仓库。

06

创建完成后,如下图,选择左侧构建菜单,构建规则一栏已经默认内置了一条规则,这条规则的意思是,当指定Github仓库的满足这个格式的release-v$version的 Tag 出现变动时,阿里云镜像仓库会自动根据这个Tag进行代码的镜像构建。但我在这里的测试未成功,会出现无法获取基础镜像的网络问题。

07

不过没关系,接下来,我会介绍如何使用 Github Actions 去自动构建镜像并推送至阿里云。

构建&推送

在阿里云的镜像仓库左侧基本信息一栏的操作指南中,第三条:将镜像推送到Registry。

因为需要借助 Github Actions 进行镜像推送,所有需要先创建一个 docker-publish.yml 文件,这个文件是当 Github 仓库的分支变动时,会将对应的分支构建镜像并推送至阿里云。

这个 yml 我是使用 chatgpt 完成,也可以根据不同的需求进行完善。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
name: Docker Build and Push

on:
push:
branches:
- '**'

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Log in to Alibaba Cloud Container Registry
env:
REGISTRY: ${{ secrets.ALIYUN_REGISTRY }}
USERNAME: ${{ secrets.ALIYUN_USERNAME }}
PASSWORD: ${{ secrets.ALIYUN_PASSWORD }}
run: echo "${{ secrets.ALIYUN_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u ${{ secrets.ALIYUN_USERNAME }} --password-stdin

- name: Extract branch name
id: extract_branch
run: echo "branch_name=${GITHUB_REF##*/}" >> $GITHUB_ENV

- name: Build and Push Docker image
env:
## 修改为你对应的镜像名称
IMAGE_NAME: ${{ secrets.ALIYUN_REGISTRY }}/xdbin/beancount-gs
BRANCH: ${{ env.branch_name }}
run: |
docker build -t $IMAGE_NAME:$BRANCH .
docker push $IMAGE_NAME:$BRANCH

然后,在Github仓库新建下图的三个 secrets,分别是:

  • ALIYUN_USERNAME 阿里云镜像库用户名
  • ALIYUN_PASSOWRD 阿里云镜像库访问密码
  • ALIYUN_REGISTRY 阿里云镜像库仓库地址

08

构建完成后,回到阿里云镜像仓库,镜像版本已经存在。可以按照基本信息中的提示,进行拉取使用。

09

大功告成。

10

附加

同样的方法,也完成了对 BaoXuebin/nginx 仓库的镜像构建。

11