文档

构建Docker镜像, 上传至ACR并部署到ECS

更新时间:

本示例模板是用于从Git拉取代码构建Docker镜像,并上传至ACR,然后批量部署到多台ECS。适用的场景为构建镜像,保存到镜像仓库并部署。该模板既支持在您账号下已有ECS上构建,也支持临时开启一台ECS构建后释放。同时,该模板支持企业版ACR(收费)和个人版ACR(免费)的上传和拉取,多种方式供您选择。

前提条件

步骤总览

下图展示了该示例模板的三个步骤:

  • 第一步:由您指定代码源,比如OSS对象存储或者Git,OOS将为代码源生成临时链接,用于后续拉取。

  • 第二步:拉取代码,安装Docker,并执行构建脚本。镜像构建完成后,连接ACR,将镜像上传指定仓库。

  • 第三步:拉取上一步构建的镜像,批量在多台ECS上以Docker容器部署拉取的镜像。

image

使用示例

本示例使用了一个Spring Boot的示例项目代码来演示,代码已上传到gitee和github仓库,如果想要使用,请先fork到自己的仓库。代码地址:

gitee:gitee示例代码(中国内地建议使用gitee)

github:github示例代码

以下演示是在Alibaba Cloud Linux 3.2104操作系统下,不同环境可能会相关的构建部署命令不同,请按需调整。

创建模板

  1. 系统运维管理控制台,选择自动化任务 > 自定义任务模板,单击创建模板。

  2. 选择构建Docker镜像,上传至ACR并部署到ECS(git代码源)示例模板,单击下一步image

  3. 单击全部收起,可以看到该模板的步骤。image

  4. 单击全部展开,开始填写模板。

    1. 第一个步骤是指定您的代码源。为下一步骤拉取代码。生成一个临时链接。

      1. 本示例以gitee为代码源,在填写所有者、组织、仓库前,请先完成授权。image

      2. 授权后选择您想要拉取的代码仓库(如果您之前已经fork示例代码,您只需下拉仓库,会自动展示您账号下所有仓库,请选择fork的示例代码仓库),后续执行模板时,OOS会生成该仓库的临时链接,并作为任务输出authorizedUrl,给后续任务使用。image

    2. 第二个步骤是构建Docker镜像,并上传到ACR。

      1. 首先您需要指定代码源,本示例是Git,代码源链接引用了上一个任务的输出authorizedUrl。image

        说明

        OOS会自动帮您拉取代码到一个特定文件夹,如下图,后续所有命令都以该文件夹为工作路径。image

      2. 接下来您需要选择构建的ECS,您可以选择在已有ECS构建,或者新启动临时ECS构建,构建完成后自动释放。注意,临时ECS会以按量付费的方式产生费用。OOS会自动检测ECS上是否已经安装Docker,如果没有安装,会自动为您安装Docker社区版。image

      3. 接下来您可以按需提供构建准备命令,这些命令会在docker build之前执行,以便您做一些前期构建准备。如前所述,这些命令会以代码的根目录为工作路径来执行。当前示例的所有构建都会在Dockerfile内完成,不需要额外的准备。image

      4. 最后,Docker构建并上传ACR仓库。这里,OOS会为您执行docker build命令构建镜像。您需要指定Dockerfile的路径和docker build命令执行的上下文路径,具体细节可参考对应参数下的详细描述。image以本示例为例,如下图,Dockerfile就在代码根目录,所以直接填写文件名 Dockerfile,contextpath也是根目录,所以不填,默认为和Dockerfile同一目录。image另外,您需要提供上传到的ACR的相关信息,这里我们支持企业版(付费)和个人版(免费),您可以按需选择。

        • 企业版用户您可以依次下拉选择当前账号下的容器镜像服务实例ID,命名空间,和要上传的仓库名称。image

        • 个人版用户,您需要填入您的用户名、密码,并下拉选择您想要上传的仓库名称。具体个人版仓库的使用方法,请参考创建个人版实例image

        最后您需要提供构建的镜像版本,默认值是基于当前日期和执行ID构成的,您可按需替换成适合您项目的镜像版本。然后您还需要确认是否通过内网上传镜像,可参考配置专有网络的访问控制

      输出:该任务会将imageVersion,username,password,acrId,namespace,repoName作为输出,给后续任务使用。后续任务可直接引用这些输出,不用重新填写。image

    3. 第三个步骤是从ACR拉取镜像,并部署。

      1. 首先,选择要部署到的ECS,这里您可以选择多个ECS批量部署。image

      2. 另外,选择要拉取的镜像信息,这里我们要拉取上一步上传到ACR的镜像,请您选择您上传到的ACR类型,其他信息我们可以引用上一步的输出,无需重复填写。能否通过内网拉取和上一步内网上传是同样的条件,参考文档配置专有网络的访问控制image

      3. 您还可以指定docker run的运行选项。image例如当前示例请填写-p 8080:8080,这些选项会被添加到docker run命令中,最终会执行。

        docker run -p 8080:8080 <image_name>
        说明

        --name选项不开放指定,因为OOS会把容器命名为一个默认的、与ACR仓库名称一一对应的名字。每次docker run运行当前镜像版本之前,会先检查是否有同名镜像正在运行,如有,会先停止该容器再docker run运行当前版本。这样您下次再往ACR仓库上传最新版本镜像后,可直接再次运行该模板,无需手动停止上个版本的镜像对应的容器。

      4. 最后,选择任务的并发控制参数(可选),控制批量部署到多台ECS的并发速率。image

    4. 填写完毕,单击创建模板,完成创建。

执行模板

  1. 自定义任务模板页面找到刚才创建的模板,单击创建执行,即可执行该模板。无需配置参数,单击下一步:确定imageimage

  2. 等待执行成功后,请去往ECS控制台,找到您选择的ECS实例,远程连接进入ECS。image

  3. 执行以下命令。

    curl http://localhost:8080/hello

    看到返回字段,即表明部署成功。image

    您也可以执行docker ps来查看对应的容器。image如果您代码有改动,可以把改动的代码上传到Git仓库,再次执行该模板,该模板会先停止上面的容器,拉取您本次构建的镜像并部署。如下图,我们修改并上传代码再次执行该模板后,停止了之前的容器,重新运行了最新版镜像对应的容器。image

后续使用

后续如果您的代码有更新,您只需把代码推送到相应Git仓库,然后重新执行该CI/CD模板,该流水线会为您拉取最新代码,重新生成镜像并推送至ACR。然后,会批量的部署最新版本的镜像到您指定的ECS上。当然,如果您有需要调整模板,也可以更新模板后再重新执行。