介绍阿里云容器镜像服务

阿汤2020-10-24AliyunAliyun-CR Docker

《使用阿里云ECS搭建Docker部署环境》这篇文章中,我们有提到过阿里云的容器镜像服务,不过当时只是为了给Docker配置镜像加速器而已,而阿里云容器镜像服务更主要的功能是为我们提供镜像托管、镜像构建等服务。

对于Docker镜像的托管,我们首先想到的是使用 docker hub,不过使用docker hub存在两个不足点:首先是镜像的拉取速度。在大陆地区从docker hub上拉取镜像是非常慢的;其次是私有镜像受限,docker hub对注册的用户目前只提供一个免费的私有仓库,再多的话要成为付费用户才行。而使用阿里云容像镜像服务就可以解决这两个问题。

使用容像镜像服务后,在阿里云ECS上就可以通过阿里云提供的网络拉取我们存放的镜像,速度那叫一个快啊!其次,容像镜像服务的普通版是不收费的,我们可以利用它创建N多个私有镜像仓库。此外,阿里云的容器镜像服务还和很多代码托管平台进行了集成,比如说Github、Bitbucket、阿里云自家的云Code等等。通过集成我们就可以很方便的实现从源代码的发布再到私有镜像的自动构建与存储。如果我们想为自己的项目实现Devops,利用容像镜像服务其实是一个不错的选择。

下面我就和你分享一下关于容器镜像服务自己的一些使用经验。

了解其工作流程

我们首先来了解下使用容器镜像服务的整个工作流程,大致流程如图所示:

首先,开发人员为远程仓库(这里的远程仓库我以Github为例)推送一个新的tag,因为这个Git仓库和容器镜像服务曾做过绑定(后面会介绍如何绑定),所以tag创建之后Github就会立刻通知容器镜像构建服务器,构建服务器接着会从Github上根据我们刚刚创建的tag拉取源代码并根据源代码根目录下的Dockerfile文件自动进行镜像的构建,构建完成后,再将结果存放在容器镜像存放服务器中,这样我们就有了一个可以直接部署的镜像。最后,如果我们想要利用刚刚构建的镜像,就可以在一台ECS中快速的对镜像进行拉取。

TIP

本文提到了“容器镜像构建服务器”和“容器镜像存放服务器”这两个词汇是我根据自己的理解,为了方便讲解而杜撰的。

为了更好的理解上面的流程,接下来我们通过做一次实验来了解一下上面的所有操作,实验一共被分成五步。

第一步:在Github上创建一个仓库

镜像的生成首先需要有一个代码源,这里我选择使用Github对源代码进行托管。首先我们在Github上新建了一个空仓库,我这里使用的仓库地址是:https://github.com/tsq-blog/aliyun-cr-demoopen in new window 。接着将这个项目克隆到本地,并在项目根目录下创建两个文件它们分别是Dockerfile和index.php。

Dockerfile的内容如下:

FROM php:7.4.6-apache
COPY index.php /var/www/html/

index.php的内容如下:

<?php
    echo "hello world";

TIP

这个演示项目其实是使用php-apache这个镜像来完成对index.php文件的解析

为了验证项目没有问题,我们可以在本地运行一下这个项目,首先在项目根目录下如下所示,使用docker build命令先构建镜像,这里我将镜像命名为了 my-php-app

docker build -t my-php-app .

构建完成后再利用刚刚生成的镜像启动一个容器,这里使用的是 docker run 命令。

docker run -p 8080:80 my-php-app

容器成功启动后,因为上面-p参数指定的是 8080:80 ,所以会在本地8080端口监听来自外界的http请求,这时我们可以打开浏览器并访问: http://localhost:8080open in new window 。如果一切正常,就可以看到页面输出了index.php中的内容:hello world

输出了hello world 就代表我们的项目是没有问题的。最后我们对刚刚的修改进行git addgit commit,并使用 git push 将修改提交到Github,这样第一步操作就完成了。

git add .
git commit -m 'init'
git push -u origin master

第二步:新建私有镜像仓库

接下来我们就回到阿里云的容器镜像服务控制台 https://cr.console.aliyun.comopen in new window,来新建一个私有镜像仓库。如下图所示,我们这里先选择“华北3(张家口)”地域的容器镜像服务。确定好地域后,点击“镜像仓库”菜单项,接着点击“创建镜像仓库”按钮。

在弹出的窗口中我们就可以看到整个过程被分成了两步,第一步是仓库信息,需要为这个镜像指定一些基本信息,我们按照自己的需要填写就好,没有什么要特别注意的。这里的“命名空间”如果你之前没创建过,点击按钮创建一个即可,名称随意。其次是“仓库名称”,它最好和我们的项目名称保持一致,这里我们把它写为:aliyun-cr-demo。还有一个必填项是“摘要”,可以留一些备注信息,这里我们简单的把它写为: aliyun-cr-demo。

完成后,点击“下一步”按钮,进入的是代码源的配置界面,如下图所示,在这一步我们需要为这个镜像关联一个代码源。因为我们使用的是Github,所以在“代码源”的地方切换到GitHub标签页。如果容器镜像服务还没有和Github绑定过,页面会提示先“绑定账号”。

我们点击“绑定账号”按钮后,需要按照页面给出的提示完成相应的绑定操作(绑定完成后,当前页面可能会消失,这时候需要重新点击“创建镜像仓库”按钮重新创建一次)。完成和Github的绑定后,就可以在下拉列表中找到第一步所创建的仓库。至于其它的设置项,保持默认选项就行,这样我们就完成了新建镜像仓库的操作,并为这个镜像仓库绑定了一个代码源。

TIP

上图中在“构建设置”的地方可以看到有个叫“海外机器构建”的选项,有些时候,勾选它之后,镜像的构建会更快完成。

创建成功后,我们回到镜像仓库列表页,如下图所示,就可以看到刚刚创建的镜像仓库了。

接着我们可以点击操作栏中的“管理”按钮,如下图所示,进入该镜像仓库的管理页面并点击“构建”菜单项,显示的页面中,我们就能看到默认的构建规则。

在“构建规则设置”列表中,我们可以看到阿里云给出了一个默认规则:tags:release-v$version。它的意思是指:如果我们为刚刚在Github上创建的 aliyun-cr-demo项目打上一个tag并且tag的命名符合以 “release-“开头,比如:release-v1release-v2, 那么每次提交一个新的tag,阿里云容器镜像构建服务器就会启动对该项目的构建工作,它会根据相应的tag名前往Github拉取该tag下的源代码并利用源代码根目录下的Dockerfile文件进行镜像的构建。而上图“镜像版本”中的“$version”意思是指:镜像构建工作完成后,会将该镜像的tag命名为除去release-的部分,比如我们如果给aliyun-cr-demo这个项目打的tag名为 release-v1,那么构建后的镜像就会被打上名为1的tag(这个tag指的是Docker镜像的tag,不要和Git的tag混淆了)。当然我们也可以通过点击“添加规则”按钮自定义一个规则,这里我就不演示了,我们还是利用阿里云提供的默认规则来进行下一步操作。

第三步:为源代码打一个tag

从刚刚的介绍中我们得知,如果要想让容器镜像构建服务器自动构建我们放在Github上的 aliyun-cr-demo项目,我们就需要在本地为项目打上一个tag再将这个tag提交至Github,为此我们回到本地开发环境,在项目根目录下打上一个叫 release-v1的tag,并提交至Github。

git tag release-v1
git push --tags

第四步:查看构建是否被触发

tag提交完成后,我们就可以刷新刚刚上图的页面,如果一切正常,如下图所示,在“构建日志”的地方会多出一行,那一行就是我们刚刚打的tag所触发的一次镜像构建。

如果上图的“构建状态”一栏处显示的是绿色的“成功”,那么就代表构建已完成。通过上图,我们也可以看到该版本的名字叫:1

TIP

构建后的镜像,阿里云会负责帮我们托管,我们可以将这个托管的地方称作:容器镜像存放服务器

至此,我们就完成了源代码的发布到镜像的生成。Github和容器镜像服务之间因为有之前的配置,所以镜像的构建工作完全是自动化,这一点真的是非常棒。有了镜像,那么如何在阿里云ECS中利用这个私有镜像呢?接下来我们就在一台ECS上看一下如何利用刚刚生成的镜像。

第五步:在ECS上利用私有镜像

镜像创建好了之后,最后一步也是最重要的一步就是要学会如何利用该私有镜像。为此,我们在阿里云上创建一台按量付费的ECS,关于ECS的地域,这需要和之前的容器镜像服务地域保持一致(原因是我们以后还可以利用专有网路地址来快速拉取镜像)。因为之前我们使用的是“华北3(张家口)“容器镜像服务,所以ECS的地域我们也选择“华北3(张家口)“。

ECS创建完成后,我们首先需要安装Docker,Docker的安装可以参考《在阿里云ECS上快速安装Docker》这篇文章。接下来,为了使用刚刚构建生成的私有镜像,我们需要完成四步操作:

1.创建访问凭证

在拉取私有镜像或者上传镜像前,我们首先需要使用docker login并输入我们的凭证信息。为了创建凭证,我们回到容器镜像服务控制台,点击左侧的“访问凭证”菜单项,进入“访问凭证”设置界面。如下图所示,通过点击“设置固定密码”按钮,创建我们的密码。

2.docker login

为了使用私有仓库,我们必须首先使用 docker login 命令来登录我们的私有仓库。完整的登录命令,如下图所示,我们可以在“访问凭证”界面的最下方看到,将其复制即可。

将复制的命令,如下图所示,在ECS上进行粘贴并回车,这时候会提示输入密码,我们输入刚刚设置过的“固定密码”即可。

3.运行私有镜像

这一步就到了最为关键的时刻:运行私有镜像。前面我们做了那么多准备,花了那么多精力,为的就是将源代码转化为一个可运行的docker容器。我们将使用docker run命令来直接运行刚刚构建好的镜像,不过首先得知道镜像的地址才行。为了获取镜像的地址,我们还是回到容器镜像服务控制台,点击“镜像仓库”菜单项,在仓库列表中,点击我们之前创建的“aliyun-cr-demo”仓库,这样就进入了下图的“基本信息”界面。在“从Registry中拉取镜像”的地方,我们可以看到“docker pull”的后面就是我们的镜像地址,而冒号后面的“镜像版本号”还记得之前生成的是什么吗?对得,是1

这样我们就有了镜像地址+镜像版本号,所以完整的docker run命令如下,我们使用-p参数指定 本地的8080端口绑定容器的80端口,使用-d参数让容器后台运行。

docker run -d -p 8080:80 registry.cn-zhangjiakou.aliyuncs.com/tsq/aliyun-cr-demo:1

4.校验容器是否运行正常

我们首先使用docker ps看一下容器是否处于正常运行状态,接着使用curl命令访问本地的8080,来看一下是否返回 hello world

如果一切运行正常,你会看到和下面一样的结果,curl的返回值会输出来自容器的响应值: hello world

  ~ docker ps
CONTAINER ID        IMAGE                                                       COMMAND                  CREATED             STATUS              PORTS                  NAMES
40b3017db3c7        registry.cn-zhangjiakou.aliyuncs.com/tsq/aliyun-cr-demo:1   "docker-php-entrypoi…"   5 seconds ago       Up 3 seconds        0.0.0.0:8080->80/tcp   naughty_euler
➜  ~ curl localhost:8080
hello world

至此,我们就完成了私有镜像的运行及校验工作。

总结

本文通过一个具体的实验来详细演示了如何使用阿里云容器镜像服务。如果你是一名容器镜像服务的初学者,我个人觉得,最关键的就是要理清容器镜像服务的整个工作流程,也就是本文的第一张图例,在这个基础上,自己动手多做几次实验就能明白它具体的用法。

TIP

容器镜像服务自己用了有一段时间了,感受真的非常的棒。它不仅提供了私有镜像的免费托管,而且还和各大代码托管平台进行了集成,从而实现了镜像的自动化构建。如果你正在用阿里云,并且也是在使用Docker进行私有镜像的部署,向你推荐容器镜像服务!