解構華為雲HE2E專案中的容器技術應用

華為雲開發者社群發表於2022-04-14
摘要:本文從容器技術應用的角度解構了HE2E專案的程式碼倉庫配置、映象構建、及docker-compose的部署方式。希望通過本篇文章分享可以使更多的開發者瞭解容器技術和華為雲。

本文分享自華為雲社群《解構華為雲HE2E專案中的容器技術應用》,作者: 敏捷小智。

華為雲DevCloud HE2E DevOps實踐當中,專案採用Docker技術進行構建部署。

容器技術應用,其實說簡單也很簡單,其流程無外乎:製作映象——上傳映象——拉取映象——啟動映象。

今天,我們就帶大家從容器技術應用的角度來解構HE2E專案。

HE2E技術架構圖:

解構華為雲HE2E專案中的容器技術應用

建立專案

在華為雲DevCloud中建立專案時選擇DevOps樣例專案,即可建立出預置了程式碼倉庫、編譯構建、部署等任務的DevOps樣例專案,此專案即HE2E專案。

解構華為雲HE2E專案中的容器技術應用

程式碼倉庫

HE2E專案中預置了程式碼倉庫phoenix-sample。

解構華為雲HE2E專案中的容器技術應用

在根目錄下可以看到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部署時所需的配置進行講解,大家不要心急噢。

解構華為雲HE2E專案中的容器技術應用

功能模組與製作映象的Dockerfile

result、vote、worker三個資料夾分別對應HE2E當中的三個功能模組:結果、投票、處理。

解構華為雲HE2E專案中的容器技術應用

解構華為雲HE2E專案中的容器技術應用

可以看到,三個資料夾下各自都有Dockerfile檔案。製作映象的時候就是靠這些Dockerfile檔案來進行製作的。

我們以result下的Dockerfile進行舉例說明:

解構華為雲HE2E專案中的容器技術應用

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。

解構華為雲HE2E專案中的容器技術應用

其餘的vote和worker兩個功能模組也是按此種辦法制作映象。值得一提的是,worker資料夾下有Dockerfile、Dockerfile.j和Dockerfile.j2三個檔案,但是在構建任務中,我們只需選擇一個檔案進行映象製作,選擇的是Dockerfile.j2這個檔案。

解構華為雲HE2E專案中的容器技術應用

在Dockerfile.j2檔案中,將target下的內容複製到code/target下,但是target資料夾又並不在程式碼當中。這是因為worker下的專案是Java專案,target資料夾是在Maven構建的過程產生的,所以在構建任務phoenix-sample-ci中,製作Worker映象之前需要先通過Maven進行構建。

解構華為雲HE2E專案中的容器技術應用

通過以上的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

解構華為雲HE2E專案中的容器技術應用

這句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是採用第三方應用,所以在映象版本方面會有區別。

解構華為雲HE2E專案中的容器技術應用

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個構建任務。

解構華為雲HE2E專案中的容器技術應用

我們僅分析phoenix-sample-ci任務即可。

解構華為雲HE2E專案中的容器技術應用

三個功能模組的構建

在進行程式碼解構時,對構建任務的部分內容已經進行過分析了,其中就包括如何通過指定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兩個檔案製作映象並上傳。

解構華為雲HE2E專案中的容器技術應用

替換部署配置檔案並打包

通過以上的步驟,映象就已完全上傳至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)所需的配置檔案修改為可部署、可應用的版本。

解構華為雲HE2E專案中的容器技術應用

這兩個檔案修改完畢後,都進行tar打包的操作。打包後的產物也通過接下來的兩個“上傳XX”步驟上傳軟體包到了軟體釋出庫。

Tips

在本專案的幫助文件中,提到了“配置基礎依賴映象”。整個這一段落是由於構建任務中使用的基礎映象源DockerHub拉取受限,採取了一個折中的辦法拉取映象。簡言之,整段操作即通過建立prebuild任務來實現基礎映象版本的替換,以避免開發者在進行構建phoenix-sample-ci任務時出現拉取映象失敗的情形。相應地,也在“配置並執行編譯構建任務”中禁用了Postgres和Redis映象的製作步驟。

部署

在編譯構建環節,我們已經成功將三個功能模組映象(vote、result、worker)和兩個第三方映象構建並上傳至SWR(容器映象倉庫)中了。接下來需要做的就是將SWR中的映象拉取到我們的部署主機並啟動。

在整個實踐中,提供了ECS部署和CCE部署兩種方式,並且在專案中預置了3個部署任務。

解構華為雲HE2E專案中的容器技術應用

我們僅分析phoenix-sample- standalone任務即可。

解構華為雲HE2E專案中的容器技術應用

傳輸軟體包至部署主機中

在構建環節,我們除了製成映象並上傳到SWR以外,還對配置檔案進行了修改、壓縮並上傳到了軟體釋出庫。在部署過程中,我們首先要做的,就是把配置檔案從軟體釋出庫中傳到部署主機當中。

結合實際的部署任務來看,就是:向[主機組] group-bhd部署一個[軟體包/構建任務(的產物)],我們選擇了[構建任務] phoenix-sample-ci的最新版本([構建版本][Latest])構建產物,將其[下載到主機的部署目錄]。

解構華為雲HE2E專案中的容器技術應用

這一步驟執行完畢後,在部署主機的/root/phoenix-sample-standalone-deploy路徑下,就會存在之前構建任務中壓縮的docker-stack.tar.gz和phoenix-sample-k8s.tar.gz。ECS部署中,我們僅需要解壓docker-stack.tar.gz,這個檔案是docker-compose-standalone.yml的壓縮包(回顧一下構建任務中的“替換部署配置檔案並打包”)。

解構華為雲HE2E專案中的容器技術應用

通過執行shell命令啟動docker-compose

解壓完成後,我們就可以通過執行docker-compose啟動命令來啟動專案了。

解構華為雲HE2E專案中的容器技術應用

在這一步驟當中,前三行分別輸出了三個引數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個容器程式。

解構華為雲HE2E專案中的容器技術應用

與此同時,訪問http://{ip}:5000和http://{ip}:5001即可訪問專案的使用者端與管理端。

解構華為雲HE2E專案中的容器技術應用解構華為雲HE2E專案中的容器技術應用

結語

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

 

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

相關文章