解構華為雲HE2E項目中的容器技術應用

摘要:本文從容器技術應用的角度解構了HE2E項目的程式碼倉庫配置、鏡像構建、及docker-compose的部署方式。希望通過本篇文章分享可以使更多的開發者了解容器技術和華為雲。

本文分享自華為雲社區《解構華為雲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中的鏡像地址才會變成我們所需的最終地址。例:swr.cn-north-4.myhuaweicloud.com/devcloud-bhd/redis:alpine、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-postgres
echo 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個容器進程。

與此同時,訪問//{ip}:5000和//{ip}:5001即可訪問項目的用戶端與管理端。

結語

本文從容器技術應用的角度解構了HE2E項目的程式碼倉庫配置、鏡像構建、及docker-compose的部署方式。希望通過本篇文章分享可以使更多的開發者了解容器技術和華為雲。

 

點擊關注,第一時間了解華為雲新鮮技術~