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

      網友投稿 619 2022-05-30

      華為云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當中的三個功能模塊:結果、投票、處理。

      在用戶端通過點擊LIKE按鈕,為產品投票

      投票數據寫入緩存redis

      vote

      處理投票數據

      數據從緩存redis寫入數據庫postgres

      worker

      在管理端展示各個產品對應的數據

      從數據庫postgres提取數據進行展示

      result

      可以看到,三個文件夾下各自都有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:<工作目錄>/,即./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

      基本的編譯構建任務。

      phoenix-sample-ci-test

      測試環境對應的編譯構建任務。

      phoenix-sample-ci-worker

      Worker功能對應的編譯構建任務。

      phoenix-sample-ci-result

      Result功能對應的編譯構建任務。

      phoenix-sample-ci-vote

      Vote功能對應的編譯構建任務。

      我們僅分析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兩個文件制作鏡像并上傳。

      替換部署配置文件并打包

      通過以上的步驟,鏡像就已完全上傳至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

      部署至彈性云服務器流程對應的部署任務。

      phoenix-cd-cce

      部署至云容器引擎流程對應的部署任務。

      phoenix-sample-test

      測試環境對應的部署任務。

      我們僅分析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的部署方式。希望通過本篇文章分享可以使更多的開發者了解容器技術和華為云。

      此文由DevSecOps專家服務團隊出品,前往 專家服務?,獲取更多DevSecOps工程方法、工具平臺、最佳實踐等干貨。

      DevSecOps 代碼托管 CodeHub 容器 容器鏡像服務 SWR 部署 CloudDeploy

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:【FPGA】Buffer專題介紹(一)
      下一篇:藍橋ROS之f1tenth簡單PID沿墻跑起來(Python)
      相關文章
      亚洲日本乱码卡2卡3卡新区| 中文字幕一精品亚洲无线一区| 亚洲JIZZJIZZ中国少妇中文| 亚洲乱码一区av春药高潮| 亚洲av成人无码久久精品| 国产亚洲大尺度无码无码专线 | 久久青青草原亚洲av无码app| 亚洲精品无码午夜福利中文字幕| 国产亚洲欧洲Aⅴ综合一区| 看亚洲a级一级毛片| 国产亚洲精品精品精品| 亚洲成av人片不卡无码久久| 亚洲精品高清在线| 亚洲精品国产高清嫩草影院| 亚洲国产精品国产自在在线| 亚洲精品成人片在线观看| 亚洲精品一级无码鲁丝片| 亚洲中文字幕伊人久久无码| 久久久久亚洲av成人无码电影 | WWW亚洲色大成网络.COM| 亚洲av日韩专区在线观看| 亚洲成a人无码亚洲成www牛牛 | 久久精品亚洲综合| 亚洲AV日韩精品久久久久久| 亚洲成年人在线观看| 亚洲爆乳精品无码一区二区三区| 亚洲av无码成人黄网站在线观看| 亚洲成AV人片在线观看ww| 亚洲国产天堂久久综合网站| 亚洲人成网www| 亚洲理论片在线观看| 亚洲二区在线视频| 亚洲精品无码你懂的| 国产成人亚洲精品蜜芽影院| 久久精品亚洲男人的天堂| 亚洲AV本道一区二区三区四区| 亚洲理论片在线中文字幕| 亚洲久热无码av中文字幕| 亚洲高清视频一视频二视频三| 亚洲午夜福利在线观看| 日韩亚洲Av人人夜夜澡人人爽|