互聯網+的時代已經到來了,Docker+的時代還遠嗎?ThreadFix團隊成功將Docker運用到測試環境的案例告訴咱們,Docker+的時代已經來臨。下面希雲把ThreadFix團隊成功運用Docker的案例和你們作個分享。git
ThreadFix的技術團隊發現他們常常要面臨一些很是通用的問題:如何快速構建應用實例。從開發部門到質量控制部門都有這個需求,由於它帶來的好處很是明顯,能讓用戶用上最新、最穩定的代碼版本。咱們基於Docker構建的容器系統(咱們內部稱爲"ThreadFix + Docker"),使實現這個需求史無前例的簡單。web
## sql
組件docker
這小節會概述一下「ThreadFix + Docker」系統的組件。shell
Docker以及Docker守護進程數據庫
這個系統最不可或缺的一塊就是Docker守護進程,這個進程部署在一個遠程Ubuntu虛擬機上,它和相關的文件組成了"ThreadFix + Docker"的後端。json
簡單來講,Docker就是一個工具,能讓咱們動態地生成容器,或者說是能與系統進程空間共存的輕量獨立進程空間。這讓咱們能不用在全虛擬化的虛擬機中部署獨立的ThreadFix實例,也就是說虛擬機相關的負載也能夠省了下來。後端
Docker守護進程運行在宿主虛擬機上,等待着指令來建立新的容器,當它接收到相應的指令,它就會以一個鏡像做爲模板來建立新的容器。Docker鏡像表明容器一啓動時就會擁有的系統環境,而鏡像又是經過一個面向過程的配置腳原本生成(稱爲"Dockerfile"),這套系統能很是迅速地啓動一個開箱即用的容器。咱們會在本文的「Jenkins持續集成「小節中講到這部份內容。tomcat
這是一個簡單的Dockerfile。app
```sh
FROM tomcat:7.0.65-jre7
ADD ./threadfix /usr/local/tomcat/webapps/threadfix
LABEL branch="Dev-QA"
LABEL version="Enterprise"
```
這是"ThreadFix + Docker"界面上的可用鏡像列表,以及各自的建立時間:
Docker API
Docker提供了一套REST風格的API,經過簡單的配置修改,咱們把Docker守護進程的API暴露在虛擬機上的Unix端口上,「ThreadFix + Docker」中有兩個組件會經過這個通道與Docker進程通信。
管理Shell腳本
咱們有一個交互式shell腳本,用來與虛擬機中的Docker進程通信,從而實現建立或者殺死容器,因爲這個腳本中是使用Unix的<code>curl</code>程序來調用Docker的REST接口,因此這個腳本也能在用戶的機器上運行,而不必定必須從宿主機上運行。這個腳本能夠指定這些參數:
- 顯示容器的名稱(用於AngularJS界面)
- ThreadFix的git版本和分支(社區版或企業版,開發版或穩定版,等等)
- 虛擬機暴露出來的端口
- ThreadFix實例要用到的數據庫文件
- 要調用的數據庫操做(建立 或者 更新)
輕量的AngularJS客戶端
終端用戶主要會用到的「ThreadFix + Docker」組件是web界面,這個頁面是由AngularJS構建的,它會直接調用GET請求與Docker進程通信,從而獲取到Docker中可用鏡像和容器的相關信息。
對每一個運行中的容器來講,都有一個連接是帶有ThreadFix實例的映射端口,用戶訪問這些連接會跳轉到具體某個ThreadFix實例首頁。
另外,還有一個連接是能夠查看那個容器的運行日誌,這對於測試團隊來講是很是方便的,能簡化發現以及重現問題的流程。
最後,警告圖標會告訴用戶容器還沒構建,他們所使用的鏡像和代碼極可能不是最新的。
更有趣的是,ThreadFix + Docker的Web界面它自己也運行在一個容器中。
Jenkins持續集成
拼圖上最後一塊是把咱們現有的Jenkins持續集成任務也整合到這套系統中,咱們利用了現有的CI任務,特別是那些會在代碼更改後構建ThreadFix包,以及會做單元測試來驗證代碼質量的任務,這些任務被修改爲了把構建好的包複製到Docker運行着的虛擬機中,而後運行腳本去構建新的Docker鏡像,並指定特定的ThreadFix版本號。這樣的話,當用戶操做一個ThreadFix實例時,他們就能確保是正在使用由最新代碼所構建的鏡像。
背後原理
如今咱們將討論一下ThreadFix + Docker背後的進程,當一個ThreadFix容器被管理腳本建立,在界面上將能調用REST API來配置一些運行時參數。
做爲參數傳進腳本的端口號,會把在容器內的ThreadFix 應用8080端口,映射到宿主虛擬機上,這樣實現了用戶經過不一樣端口同時訪問他們的實例。
ThreadFix 的版本和分支(社區版或企業版,開發版或穩定版,等等)讓Docker進程知道啓動容器時應該使用哪一個鏡像,正如上邊所說,Jenkins任務會確保這些鏡像是最新構建的。
數據庫名稱參數會在虛擬宿主機上查找同名的目錄,若是這個目錄不存在將會被建立。ThreadFix容器會關聯這個目錄做爲「卷」,掛載容器中的一個路徑到這個捲上。在Docker術語中,一個「卷」是宿主機上的文件路徑,這個路徑會被映射到容器中的一個路徑上。咱們的ThreadFix應用利用了這個特性,應用中把生成的HSQL數據庫文件放在卷中,這樣的話,當這個容器以新的鏡像啓動,只要關聯回這個捲上,那數據仍然是完整的。
數據庫操做參數一樣也是利用了卷的特性,若是你指定「建立」操做,ThreadFix + Docker會替換默認的jdbc.properties文件,相似地,「更新」會使用一個「update. jdbc.properties「文件來創建數據庫鏈接。
最後,必定要記得ThreadFix + Docker並無用到獨立的後端,而是直接與Docker進程通信了。要存儲容器的元數據,咱們依賴於Docker的「標籤",這些鍵值對能夠生成鏡像前在Dockerfile中指定,而後大家在Web界面上看到這些信息,諸如容器名稱、版本、分支等等。
管理腳本打印出來的建立容器結果是一串Json,如下是一段摘要:
```json
# Craft JSON Data for Create Call
json="{\"OpenStdin\": true, \"Image\": \"threadfix/${version}\", \"Tty\": true, \"Labels\": {\"user\":\"${name}\", \"db\": \"${database}\", \"dbMethod\": \"${dbMethod}\"},\"HostConfig\": {${databaseJson} \"PortBindings\": { \"8080/tcp\": [{ \"HostPort\": \"${port}\" }]}, \"DnsSearch\": [\"denimgroup.com\"]}}"
```
總結
上邊咱們介紹了ThreadFix + Docker系統的各個組件,咱們另外還遇到另外一些用例,也是但願能經過Docker來提高咱們的效率的,例如在一個遠程ThreadFix容器中鏈接一個本地Mysql數據庫,或者運行一個SQL Server數據庫實例來做數據庫驅動測試。
就目前來講,ThreadFix + Docker已經顯著地減小了咱們的構建時間,而且提升了咱們產品的魯棒性,使有時須要10分鐘的工做量變成了如今的30秒。不管是開發第三方集成應用,排查問題,跟蹤缺陷或者使新成員快速上手,Docker帶給咱們的好處不止上邊這些。
感謝您閱讀此文!下週咱們將繼續分享!
如瞭解更多docker相關知識,請觀看培訓視頻:https://csphere.cn/training!
如須要docker相關產品,請訪問希雲官網首頁:https://csphere.cn!