写点什么

解构华为云 HE2E 项目中的容器技术应用

  • 2022 年 4 月 14 日
  • 本文字数:4445 字

    阅读完需:约 15 分钟

本文分享自华为云社区《解构华为云HE2E项目中的容器技术应用》,作者: 敏捷小智。


华为云DevCloud HE2E DevOps实践当中,项目采用 Docker 技术进行构建部署。


容器技术应用,其实说简单也很简单,其流程无外乎:制作镜像——上传镜像——拉取镜像——启动镜像。


今天,我们就带大家从容器技术应用的角度来解构 HE2E 项目


HE2E 技术架构图:

创建项目

在华为云 DevCloud 中创建项目时选择 DevOps 样例项目,即可创建出预置了代码仓库、编译构建、部署等任务的 DevOps 样例项目,此项目即 HE2E 项目。

代码仓库

HE2E 项目中预置了代码仓库 phoenix-sample。

在根目录下可以看到 images、kompose、result、vote、worker 五个文件夹,以及 LICENSE、README.md 和 docker-compose-standalone、docker-compose 两个 yml 文件。Images 文件夹存了几张图片,LICENSE 和 README 也与代码内容无关,docker-compose.yml 文件是应用于本地开发时的测试文件,这些都无需理会。

配置 Kubectl 的 kompose 文件夹

我们先看一下 kompose 文件夹,此文件夹下有多个 yaml 文件,通过命名可以看出这些文件是针对于每个微服务应用的配置。当我们进行 CCE 部署时就读取这里的配置(在部署时进行配置)。本着由浅入深的精神,本文先对 ECS 部署时所需的配置进行讲解,大家不要心急噢。

功能模块与制作镜像的 Dockerfile

result、vote、worker 三个文件夹分别对应 HE2E 当中的三个功能模块:结果、投票、处理。


可以看到,三个文件夹下各自都有 Dockerfile 文件。制作镜像的时候就是靠这些 Dockerfile 文件来进行制作的。


我们以 result 下的 Dockerfile 进行举例说明:

FROM:定制的镜像都是基于 FROM 的镜像,这里的 node:5.11.0-slim 就是定制需要的基础镜像。后续的操作都是基于 node:5.11.0-slim。


WORKDIR /app:指定并创建工作目录/app。


RUN <命令>:执行<命令>。


ADD <文件> <目录>:复制<文件>至<目录>。


5-9 行:执行 npm 安装操作,并将相关文件存放入相应目录。


ENV PORT 80:定义环境变量 PORT=80


EXPOSE 80:声明端口 80。


CMD <命令>:在 docker run 时运行<命令>。


在编译构建任务 phoenix-sample-ci 中,“制作 Result 镜像并推送到 SWR 仓库”步骤,通过“工作目录”、“Dockerfile 路径”两个选项确定制作镜像时读取的 Dockerfile:<工作目录>/<Dockerfile 路径>,即./result/Dockerfile。

其余的 vote 和 worker 两个功能模块也是按此种办法制作镜像。值得一提的是,worker 文件夹下有 Dockerfile、Dockerfile.j 和 Dockerfile.j2 三个文件,但是在构建任务中,我们只需选择一个文件进行镜像制作,选择的是 Dockerfile.j2 这个文件。

在 Dockerfile.j2 文件中,将 target 下的内容复制到 code/target 下,但是 target 文件夹又并不在代码当中。这是因为 worker 下的项目是 Java 项目,target 文件夹是在 Maven 构建的过程产生的,所以在构建任务 phoenix-sample-ci 中,制作 Worker 镜像之前需要先通过 Maven 进行构建。

通过以上的 Dockerfile 文件已经可以制作出三大功能模块对应的容器镜像了。在部署主机中,直接使用 docker login、docker pull 和 docker run 命令就可以登录、拉取并启动相应的镜像。但是这种方式要求对每个镜像都进行拉取和启动,不能一次性配置全部镜像。故此,我们引入了 docker compose,通过 docker compose 实现对 Docker 容器集群的快速编排。一键(一个配置文件)配置本项目所需的各个功能模块。

配置 docker-compose 的 docker-compose-standalone.yml 文件

当我们部署本项目到服务器时,采取 docker-compose 的方式启动。


在部署任务 phoenix-sample-standalone 中,最终通过执行 shell 命令启动本项目:

docker-compose -f docker-compose-standalone.yml up -d
复制代码


这句 shell 命令中的 docker-compose-standalone.yml 正是我们代码仓库根目录的 docker-compose-standalone.yml 文件。


下面对 docker-compose-standalone.yml 文件进行解读。


version:指定本 yml 依从的 compose 哪个版本制定的。


services:包含的服务。


本 yml 中含有 redis、db、vote、result、worker 五个服务。其中 db 即数据库 postgres。


image:镜像地址。


以 redis 和 worker 服务为例,其镜像为 docker-server/docker-org/redis:alpine、docker-server/docker-org/worker:image-version,这里采用的是参数化替换的形式定义镜像地址的。


在构建任务 phoenix-sample-ci 中,“替换 Docker-Compose 部署文件镜像版本”步骤的 shell 命令正是将 docker-compose-standalone.yml 文件中的 docker-server、docker-org、image-version 三处替换为我们在该构建任务中定义的三个参数 dockerServer、dockerOrg、BUILDNUMBER。


进行这样的替换以后,我们的 docker-compose-standalone.yml 中的镜像地址才会变成我们所需的最终地址。例:http://swr.cn-north-4.myhuaweicloud.com/devcloud-bhd/redis:alpinehttp://swr.cn-north-4.myhuaweicloud.com/devcloud-bhd/worker:20220303.1


五个服务中,vote、result、worker 是本项目构建生成的,redis 和 db 是采用第三方应用,所以在镜像版本方面会有区别。

ports:端口号。将容器和主机绑定到暴露的端口。


在 vote 当中 ports: 5000:80 就是将容器所使用的 80 端口号绑定到主机的 5000 端口号,这样我们就可以通过<主机 ip>:5000 来访问本项目的用户端界面了。


networks:配置容器连接的网络。这里使用的是最简单的两种声明网络名称。


frontend 即前端,backend 即后端。


environment:添加环境变量。POSTGRES_HOST_AUTH_METHOD: "trust",此变量防止访问 postgres 时无法登录。


volumes:将主机的数据卷或着文件挂载到容器里。db-data:/var/lib/postgresql/data 下的内容即成为 postgres 当中的数据内容。


deploy:指定与服务的部署和运行有关的配置。placement:constraints: [node.role == manager]即:权限设置为管理员。


depends_on:设置依赖关系。vote 依赖 redis、result 依赖 db。


至此,整个 HE2E 项目的代码结构已经解构完毕。

编译构建

其实在完成代码解构之后,整个项目已经非常清晰了。代码中包括 vote、result、worker 三个功能模块,项目还用到了 redis 和 postgres 两个第三方应用。所以,我们在编译构建环节的主要目的就是把这些服务的镜像制作出来并上传到 SWR 容器镜像仓库中。


本项目中预置了 5 个构建任务。

我们仅分析 phoenix-sample-ci 任务即可。

三个功能模块的构建

在进行代码解构时,对构建任务的部分内容已经进行过分析了,其中就包括如何通过指定 Dockerfile 文件制作镜像,即 docker build(制作)的操作。除此之外,制作 XX 镜像并推送到 SWR 的步骤中还包括了推送镜像所需的信息。这里设置了推送区域、组织、镜像名字、镜像标签,其实就是我们进行 docker tag(打标签)和 docker push(推送)的操作。


在 vote、result、worker 的镜像制作并推送的过程中,通过参数 BUILDNUMBER 定义镜像的版本号。BUILDNUMBER 是系统预定义参数,随着构建日期及次数变化。


worker 镜像在制作之前,需要先对 worker 目录下的工程进行 Maven 构建,这样就会生成 Dockerfile.j2 中(制作镜像时)所需的 target 文件。

Postgres 和 Redis 的构建

在制作了三个功能模块镜像以后,接下来要做的是生成 Postgres 和 Redis 镜像。这里选择的办法是,通过 shell 命令写出这两个应用的 Dockerfile。

echo from postgres:9.4 > Dockerfile-postgresecho from redis:alpine > Dockerfile-redis
复制代码

通过这段 shell 命令就会在当前的工作目录下生成 Dockerfile-postgres 和 Dockerfile-redis 两个文件。


Dockerfile-postgres:

FROM postgres:9.4

Dockerfile-redis:

FROM redis:alpine


在接下来的步骤当中,指定当前目录下的 Dockerfile-postgres 和 Dockerfile-redis 两个文件制作镜像并上传。

替换部署配置文件并打包

通过以上的步骤,镜像就已完全上传至 SWR 仓库了。后续的“替换 Docker-Compose 部署文件镜像版本”和“替换 Kubernates 部署文件镜像版本”两个步骤分别将代码仓根目录下的 docker-compose-standalone.yml 和 kompose 下的所有 XX-deployment.yaml 文件中的 docker-server、docker-org、image-version 替换为构建任务中的参数 dockerServer、dockerOrg、BUILDNUMBER。这两步骤的意义就是将 ECS 部署(docker-compose/docker-compose-standalone.yml)和 CCE 部署(Kubernates/Kompose)所需的配置文件修改为可部署、可应用的版本。

这两个文件修改完毕后,都进行 tar 打包的操作。打包后的产物也通过接下来的两个“上传 XX”步骤上传软件包到了软件发布库。

Tips

在本项目的帮助文档中,提到了“配置基础依赖镜像”。整个这一段落是由于构建任务中使用的基础镜像源 DockerHub 拉取受限,采取了一个折中的办法拉取镜像。简言之,整段操作即通过创建 prebuild 任务来实现基础镜像版本的替换,以避免开发者在进行构建 phoenix-sample-ci 任务时出现拉取镜像失败的情形。相应地,也在“配置并执行编译构建任务”中禁用了 Postgres 和 Redis 镜像的制作步骤。

部署

在编译构建环节,我们已经成功将三个功能模块镜像(vote、result、worker)和两个第三方镜像构建并上传至 SWR(容器镜像仓库)中了。接下来需要做的就是将 SWR 中的镜像拉取到我们的部署主机并启动。

在整个实践中,提供了 ECS 部署和 CCE 部署两种方式,并且在项目中预置了 3 个部署任务。

我们仅分析 phoenix-sample- standalone 任务即可。

传输软件包至部署主机中

在构建环节,我们除了制成镜像并上传到 SWR 以外,还对配置文件进行了修改、压缩并上传到了软件发布库。在部署过程中,我们首先要做的,就是把配置文件从软件发布库中传到部署主机当中。


结合实际的部署任务来看,就是:向[主机组] group-bhd 部署一个[软件包/构建任务(的产物)],我们选择了[构建任务] phoenix-sample-ci 的最新版本([构建版本][Latest])构建产物,将其[下载到主机的部署目录]。

这一步骤执行完毕后,在部署主机的/root/phoenix-sample-standalone-deploy 路径下,就会存在之前构建任务中压缩的 docker-stack.tar.gz 和 phoenix-sample-k8s.tar.gz。ECS 部署中,我们仅需要解压 docker-stack.tar.gz,这个文件是 docker-compose-standalone.yml 的压缩包(回顾一下构建任务中的“替换部署配置文件并打包”)。

通过执行 shell 命令启动 docker-compose

解压完成后,我们就可以通过执行 docker-compose 启动命令来启动项目了。

在这一步骤当中,前三行分别输出了三个参数 docker-username、docker-password、docker-server。这三个参数是用以进行 docker login 操作的。因为我们在 docker-compose-standalone.yml 中涉及到拉取镜像的操作,需要在拉取镜像前先登录 SWR 镜像仓库。


登录完毕后,就可以进入/root/phoenix-sample-standalone-deploy 目录下(cd /root/phoenix-sample-standalone-deploy)

启动 docker-compose(docker-compose -f docker-compose-standalone.yml up -d)。


至此,项目已经部署至主机当中,在主机中,通过 docker ps -a 指令可以看到 5 个容器进程。

与此同时,访问 http://{ip}:5000 和 http://{ip}:5001 即可访问项目的用户端与管理端。


结语

本文从容器技术应用的角度解构了 HE2E 项目的代码仓库配置、镜像构建、及 docker-compose 的部署方式。希望通过本篇文章分享可以使更多的开发者了解容器技术和华为云。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
解构华为云HE2E项目中的容器技术应用_容器_华为云开发者社区_InfoQ写作平台