1. 程式人生 > >測試環境docker化(一)—基於ndp部署模式的docker基礎鏡像制作

測試環境docker化(一)—基於ndp部署模式的docker基礎鏡像制作

XML spl nec 快速部署 onf 問題 java 加載 ons

本文來自網易雲社區

作者:孫婷婷


背景

我所在測試項目組目前的測試環境只有一套,在項目版本叠代過程中,開發或產品偶爾會在測試環境進行數據校驗,QA人數在不斷增加,各個人員在負責不同模塊工作時也會產生臟數據,導致QA在功能測試和接口測試過程中需要清理測試環境增加工作量,同時QA組在進行異常測試等多維度質量保障時也希望有多套環境進行數據隔離。但目前測試環境多套隔離操作麻煩,每隔離一套環境需要修改大量配置、數據庫重新建表到調試可用,在開發的幫助下至少需要3天的時間,在這種場景下,我們借鑒組內大數據QA的思路和探索路線,考慮嘗試引入docker技術來解決測試環境問題。

在實踐測試環境docker化的過程中,考慮到項目的部署流程都已經遷移至運維的ndp平臺,由於項目屬於多模塊項目,同時為盡量保證docker化後的測試環境能與現有生產環境的配置和結構保持一致,我們設計借鑒ndp的發布配置和模式進行docker化後的測試環境部署。


ndp部署流程

經過學習、對比和摸索,了解到ndp的部署流程基本如下圖所示(基本都是自己摸索,未專門請求運維同事,如果運維部的同事發現有錯誤,歡迎指正(*^▽^*))

技術分享圖片

  1. 用戶在ndp管理平臺配置代碼地址、構建文件build.xml、部署定制配置(主要配置端口號、內存分配、應用名、應用入口等)

  2. 當點擊項目構建時,ndp服務器會拉取代碼,然後按照編寫的構建文件build.xml對項目模塊進行ant構建,模塊構建完成後進行模塊打包

  3. 當點擊項目部署時,將打包模塊分發至部署服務器,進行項目部署

基於以上背景,考慮設計docker化的環境發布接口為1個compile容器+多個deploy模塊容器接口,首先啟動一個compile容器完成所有模塊的編譯,並啟動一個httpServer發布端口號,然後逐個啟動deploy容器,拉取打包模塊完成整個項目部署。因此,首先需要設計compile和deploy兩類基礎鏡像。

技術分享圖片

基礎編譯鏡像compile

  1. 我們的鏡像使用Dockerfile制作,首先安裝項目編譯需要的軟件,包括jdk(註意是jdk不是jre)、ant、maven,其中,maven需要配置公司的依賴倉庫,因此可以通過COPY將公司的settings.xml放入鏡像中相應位置;

  2. 容器通過git下載代碼時需要ssh權限,可以通過找一臺服務器生成一個ssh-key,公鑰放入git上相關項目的deploy-key中獲取下載權限,私鑰通過COPY放入鏡像root下的.ssh文件中;

  3. 機器首次git clone代碼時git會提示“Are you sure you want to continue connecting (yes/no)?”,由於需要容器運行後自動下載代碼編譯,中間不需要任何人工操作,則需要去除這條提示,通過網上搜索,解決辦法是可以修改/etc/ssh_config文件中的配置來跳過此處詢問,如下所示去掉文件中“StrictHostKeyChecking”前的“#”。可以事先修改好配置,通過COPY替換鏡像中相應文件即可。

#   CheckHostIP yes#   AddressFamily any#   ConnectTimeout 0
    StrictHostKeyChecking no#   IdentityFile ~/.ssh/identity

將以上操作通過Dockerfile命令方式寫入後運行docker build就可以生成我們定制的compile鏡像,創建容器時通過掛載的方式將項目各模塊的build.xml加載到容器中,指定容器運行代碼為一個entry.sh文件,該entry.sh主要實現代碼拉取、各模塊ant構建和最後啟動一個httpServer的功能,啟動httpServer後compile容器即發布成功!


基礎部署鏡像javaappp和tomcat

由於項目中模塊基本都是javaapp和javaweb項目,我們就考慮制作了兩個鏡像,一個為javaapp鏡像,專門用於部署javaapp模塊,對應於ndp上的應用類型為java app;一個為tomcat鏡像,專門用於部署java web模塊,對應於ndp上的應用類型為java web。

a. javaapp鏡像

  1. javaapp鏡像主要用於運行javaapp應用,只需要有jre環境即可,因此首先安裝jre;

  2. 將現有測試環境服務器部署模塊中生成的config文件放入自定義路徑下,該文件用於定制化jvm參數、內存分配、應用名、端口號等,對應ndp上模塊-配置-發布配置頁面內容,如下圖

技術分享圖片

3. 將現有測試環境服務器部署模塊中的appCtrl.sh通過COPY放置在自定義路徑下,該文件為調用config參數後啟動java的項目啟動文件,需要啟動項目時只需運行./appCtrl.sh start即可,具體其他功能可學習該文件。

創建容器時通過掛載的方式將entry.sh文件加載到容器中,該entry.sh主要實現從compile容器拉取部署模塊、修改config配置(增加特定入口main方法)和啟動appCtrl.sh的功能,啟動模塊後該模塊容器即發布成功!


b. tomcat鏡像

  1. 由於web項目需要使用tomcat,鏡像首先安裝jre和tomcat

  2. 將現有測試環境服務器部署模塊中的default_tomcat文件放入自定義路徑下,該文件用於定制化內存分配、應用名、端口號等,對應ndp上模塊-配置-發布配置頁面內容

  3. 修改tomcat中server.xml,主要是將docBase的路徑指定為後續打包模塊的存放路徑,比如我是指定為"/usr/local/compressed"(由於一個容器中只會運行一個模塊,所以此處可固定填寫)

  4. 將現有測試環境服務器部署模塊中的用於tomcat服務啟動的tomcat腳本文件放入自定義路徑下,該文件類似於javaapp鏡像中的appCtrl.sh文件((需刪除java、修改start-stop-daemon路徑))。同時由於該文件調用了init-functions和rotatelogs,需修改init-functions的調用路徑為系統文件路徑,並在自定義路徑下加入rotatelogs用於日誌切割

創建容器時通過掛載的方式將entry.sh文件加載到容器中,該entry.sh主要實現從compile容器拉取部署模塊、修改配置和啟動tomcat的功能,啟動模塊後該模塊容器即發布成功!


總結

此部署結構和鏡像一方面對標了ndp的環境部署方式;另一方面,部分jar包會被其他其他模塊依賴,但基於安全原因未上傳至倉庫,而是先打包後給其他模塊使用,此時集中在一個容器中打包則不需要在各個模塊編譯的時候重復打包依賴jar包;同時保證各個模塊屬於同一個版本的代碼,保證每套環境部署時各個模塊的版本一致性。

從目前實踐結果來看,本組項目已基本完成各個模塊的容器發布,只要一套環境發布的各個配置文件、build.xml、entry.sh整理好,即可實現三行命令發布一套環境的需求,大大縮減了測試環境部署時間。故在這裏寫出來給有需要的小夥伴參考,也希望有類似經歷的同事可以多提建議,多多指教。


有實踐就會有坑,此處簡單羅列鏡像制作過程中的各種奇怪的坑,以避免夥伴們重復踩坑!

1. 在tomcat鏡像制作過程中,使用的基礎鏡像是docker-library中的tomcat的Dockerfile,但是該鏡像在執行過程中會再安裝一遍jdk,在安裝後刪除導致build到一半時找不到jdk,解決方法:刪除重新安裝的代碼。

2. ndp上build.xml中的執行工具mvn的名稱默認為服務器中的mvn名稱“mvnJDK7”,需要修改為我們安裝在鏡像中的mvn名稱,一般為“mvn”。

3. 註意修改各COPY到鏡像中的可執行文件的執行權限,如rotatelogs/config/default-tomcat等

4. 在compile+deploy結構中,我最終在compile容器中起了一個httpServer,各deploy通過wget獲取編譯後的文件夾,但是若文件夾中有index.html,wget會默認讀取index.html及index.html中的鏈接文件,這樣就違背了我希望獲取所有文件的預期,最後解決辦法是先將文件夾壓縮,通過wget獲取後再解壓

5. 容器入口使用entry.sh運行,最後運行完./tomcat start或./appCtrl start後會退出容器,原因是docker容器中的前臺線程結束即會退出。解決辦法,可以在腳本最後添加命令“tail -f /dev/null”使線程始終掛起。


網易雲容器服務為用戶提供了無服務器容器,讓企業能夠快速部署業務,輕松運維服務。容器服務支持彈性伸縮、垂直擴容、灰度升級、服務發現、服務編排、錯誤恢復及性能監測等功能,點擊可免費試用。


網易雲免費體驗館,0成本體驗20+款雲產品!

更多網易研發、產品、運營經驗分享請訪問網易雲社區。


相關文章:
【推薦】 Wireshark對HTTPS數據的解密

測試環境docker化(一)—基於ndp部署模式的docker基礎鏡像制作