蔣少華,陳德健,蔡裕源,唐麗蓉,夏 楠,張燦源
(韶關(guān)學(xué)院信息科學(xué)與工程學(xué)院,廣東韶關(guān)512005)
隨著大數(shù)據(jù)、云計(jì)算的興起,人們對網(wǎng)絡(luò)的依賴越來越強(qiáng),巨大的網(wǎng)絡(luò)業(yè)務(wù)隨之卷土而來,這既是機(jī)遇也是挑戰(zhàn),快速拓展互聯(lián)網(wǎng)業(yè)務(wù)成為很多公司的核心戰(zhàn)略.若業(yè)務(wù)容量超過預(yù)期,需要在一個(gè)新的操作系統(tǒng)再重新部署一次軟件環(huán)境,傳統(tǒng)業(yè)務(wù)部署的流程總是需要經(jīng)過開發(fā)人員部署軟件環(huán)境→測試運(yùn)行→排錯(cuò)→再測試運(yùn)行→再排錯(cuò)→業(yè)務(wù)上線,整個(gè)過程消耗至少3天,耗時(shí)耗力,不利于公司的良好發(fā)展.
Docker是一個(gè)近幾年興起的,開源的應(yīng)用容器引擎,它重新定義了程序的開發(fā)、測試、交付以及程序的部署過程,開發(fā)人員可以打包自己的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux機(jī)器上,也可以實(shí)現(xiàn)虛擬化[1].每個(gè)運(yùn)行的容器與容器之間,是相互隔離的,沒有任何接口,完全使用沙箱機(jī)制,類似i-Phone的各個(gè)應(yīng)用之間的關(guān)系[2].性能開銷接近于零,可以很容易地在機(jī)器和數(shù)據(jù)中心中運(yùn)行.Docker還有不依賴任何語言、框架或包裝系統(tǒng)的優(yōu)點(diǎn)[3].
Docker引擎創(chuàng)建的容器進(jìn)程伸縮性強(qiáng),用戶可以方便、快捷增刪容器,數(shù)秒內(nèi)就可以完成操作.用戶通過對Docker容器的優(yōu)化配置,大大地減少了資源的浪費(fèi),降低資源成本,提高數(shù)據(jù)中心的利用率,使服務(wù)器資源得到最有效的利用[4].現(xiàn)今市場上己有各種比較成熟的PaaS(Platform-as-a-Service)平臺,例如:國外谷歌的Google App Engine,微軟的Windows Azure Platform,國內(nèi)百度的百度應(yīng)用引擎Baidu App Enginee(BAE),阿里的阿里云Aliyun Cloud Enginee(ACE)等.
針對傳統(tǒng)業(yè)務(wù)部署出現(xiàn)的軟件交付困難,產(chǎn)品上線困難等問題,設(shè)計(jì)了基于Docker的計(jì)算機(jī)應(yīng)用PaaS服務(wù)模式平臺,可以有效實(shí)現(xiàn)工程快速構(gòu)建、環(huán)境迅速部署、平臺便捷管理等功能.
Docker技術(shù)快速部署系統(tǒng)需要完成的模塊與主要功能為:
(1)服務(wù)器虛擬化:利用kvm對服務(wù)器進(jìn)行虛擬化,可以極大地提高服務(wù)器的利用效率,虛擬機(jī)之間隔離性比較好,就好像每臺獨(dú)立的物理機(jī),相互之間不會有影響.
(2)Docker容器集群:通過部署一個(gè)Docker容器集群,達(dá)到業(yè)務(wù)上的負(fù)載均衡,有效避免單點(diǎn)失效的災(zāi)難,提高了系統(tǒng)的可靠性和安全性.
(3)Docker儲存驅(qū)動(dòng)更換:DockerEngine的存儲驅(qū)動(dòng)有l(wèi)oop-lvm和direct-lvm兩種配置模式,其中l(wèi)oop-lvm是默認(rèn)的模式,由于官方明確不推薦使用該模式用于生產(chǎn)環(huán)境,在生產(chǎn)環(huán)境下應(yīng)該使用direct-lvm驅(qū)動(dòng)配置模式.
(4)Ceph集群:Ceph是一個(gè)強(qiáng)大穩(wěn)定的分布式文件存儲系統(tǒng),可以通過部署分布式文件系統(tǒng),給Docker提供儲存塊RBD,實(shí)現(xiàn)Docker的rootfs也跑在網(wǎng)絡(luò)存儲之上,打造一個(gè)無本地磁盤的容器服務(wù)系統(tǒng).
(5)本地私有鏡像庫:常用的鏡像可以自己寫Dockerfile自動(dòng)生成,并且儲存在本地的鏡像庫,當(dāng)需要的時(shí)候就可以直接拿來用,無需占用外網(wǎng)資源,而且Docker hup官網(wǎng)服務(wù)器在國外,進(jìn)行鏡像拉取速度很慢,本地鏡像庫可以實(shí)現(xiàn)鏡像資源自給自足,節(jié)省大量的時(shí)間和網(wǎng)絡(luò)資源.
(6)gitlab版本控制器:基于Docker的計(jì)算機(jī)應(yīng)用快速部署平臺作為一個(gè)PaaS服務(wù)模式的平臺,需要給開發(fā)者提供一個(gè)本地的代碼托管平臺,提高開發(fā)團(tuán)隊(duì)的協(xié)同開發(fā)效率,用戶在開發(fā)好項(xiàng)目的同時(shí)可以立即利用快速部署平臺測試,同時(shí)開發(fā)者也可以在gitlab上進(jìn)行自動(dòng)化構(gòu)建.
(7)shipyard容器集中管理平臺:在shipyard平臺上,用戶可以比較直觀地看到容器的情況,而且可以直接在瀏覽器頁面上對容器進(jìn)行增刪查改的工作,通過web頁面了解和管理業(yè)務(wù),對于技術(shù)人員或者非技術(shù)人員都方便操作.
系統(tǒng)方案設(shè)計(jì)包括集群設(shè)計(jì)、集群管理、業(yè)務(wù)管理3部分[5].系統(tǒng)利用Docker技術(shù)將應(yīng)用標(biāo)準(zhǔn)化,實(shí)現(xiàn)資源的最大利用,節(jié)省應(yīng)用部署時(shí)間.
Docker集群主要采用層次結(jié)構(gòu)模型,整套結(jié)構(gòu)設(shè)計(jì)見圖1.首先,需搭建部署開發(fā)環(huán)境:為了節(jié)省資源,提高開發(fā)效率,采用最小化Linux系統(tǒng)安裝(即沒有圖形界面的純命令行系統(tǒng));其次,在這些環(huán)境下利用kvm虛擬化技術(shù),對系統(tǒng)、網(wǎng)絡(luò)進(jìn)行虛擬化;然后進(jìn)行Docker集群的設(shè)計(jì),利用ansible自動(dòng)化運(yùn)維工具,對各個(gè)虛擬子系統(tǒng)進(jìn)行自動(dòng)化管理,再通過安裝Docker服務(wù),在Docker上構(gòu)建registry、gitlab等服務(wù)的鏡像和容器,并且打通Docker hub,方便用戶對Docker服務(wù)的使用;最后利用shipyard技術(shù)對各個(gè)節(jié)點(diǎn)以及其容器和鏡像進(jìn)行web界面管理,采用強(qiáng)大的rethinkdb數(shù)據(jù)庫對數(shù)據(jù)進(jìn)行相關(guān)管理[6].
采用層次結(jié)構(gòu)有兩個(gè)特點(diǎn):①業(yè)務(wù)隔離:業(yè)務(wù)互相隔離,層次清晰;②故障定位快速:當(dāng)發(fā)生故障時(shí),可以根據(jù)故障原因快速定位故障點(diǎn).
集群管理采用樹形拓?fù)浣Y(jié)構(gòu)(見圖2),集群管理結(jié)構(gòu)有兩個(gè)優(yōu)點(diǎn):①業(yè)務(wù)易于伸縮.這種結(jié)構(gòu)可以延伸出很多分支和子分支,這些新節(jié)點(diǎn)和新分支都能容易地加入拓?fù)鋬?nèi);②故障隔離較容易.如果某一分支的節(jié)點(diǎn)或線路發(fā)生故障,很容易將故障分支與整個(gè)系統(tǒng)隔離開來.
業(yè)務(wù)管理主要采用web頁面對容器進(jìn)行管理,所有在系統(tǒng)上的業(yè)務(wù)都可以通過web頁面來進(jìn)行管理,響應(yīng)用戶操作,并且收集日志方便問題排查.頁面采用JS進(jìn)行編寫,框架采用AngularJS.
采用AngularJS有兩個(gè)優(yōu)點(diǎn):①自定義Directive,比jQuery插件還靈活,封裝容易;②模塊化設(shè)計(jì)可以很容易的寫出可復(fù)用的代碼,對于敏捷開發(fā)的項(xiàng)目非常有幫助,業(yè)務(wù)流程見圖3.
圖1 集群設(shè)計(jì)結(jié)構(gòu)
圖2 集群管理結(jié)構(gòu)
圖3 業(yè)務(wù)管理流程圖
用shell編寫一個(gè)自動(dòng)化測試腳本進(jìn)行比對測試,具體腳本如下:
#!/bin/bash
function handle()
{start=$(date+%s%N)
start_ms=${start:0:16}
#輸入要執(zhí)行的代碼或腳本
dockerstart f999dc296f34>/dev/null end=$(date+%s%N)
end_ms=${end:0:16}
echo"open the containercost time:"
echo"scale=6;($end_ms-$start_ms)/1000000"|bc}
handle.
物理機(jī)、虛擬機(jī)測試腳本:
#!/bin/sh
#ip為對應(yīng)的物理機(jī)或虛擬機(jī)的ip
#把腳本放在容器測試腳本里面運(yùn)行即可
ping-i 0.1-c 1 192.168.1.116>/dev/null
while((1==$?));
do
ping-i 0.1-c 1 192.168.1.116>/dev/null
done.
當(dāng)測試開啟同樣版本的一個(gè)centos純命令行系統(tǒng)的響應(yīng)時(shí)間,結(jié)果如下:Docker容器只用了1.56 s,物理機(jī)上耗時(shí)21.31s,在虛擬機(jī)上耗時(shí)33.74s,從測試數(shù)據(jù)來看,Docker的響應(yīng)時(shí)間遠(yuǎn)遠(yuǎn)少于其他虛擬機(jī),測試結(jié)果見圖4.
當(dāng)測試開啟同樣版本的一個(gè)centos純命令行系統(tǒng)的鏡像大小,結(jié)果如下:Docker容器只有198 MB,而物理機(jī)和虛擬機(jī)的系統(tǒng)鏡像都要4 096 MB,資源占用較大.Docker容器、物理機(jī)和虛擬機(jī)測試比對結(jié)果見圖5.
從測試結(jié)果看,Docker容器有響應(yīng)速度快,占有資源小的優(yōu)點(diǎn);物理機(jī)或虛擬機(jī)系統(tǒng)壞死需要重裝時(shí)也比較麻煩,耗時(shí)較多,而Docker引擎刪除和重建一個(gè)容器僅需一條命令,非??旖?,用在商業(yè)上,可以快速應(yīng)對業(yè)務(wù)的伸縮,可以省時(shí)省資源.
測試通過利用負(fù)載均衡技術(shù),將客戶的請求負(fù)載均衡地分配到各個(gè)不同的web節(jié)點(diǎn)中,從而大大提高了web服務(wù)器的可靠性和安全性,使其在高并發(fā)的訪問下可以持續(xù)地提供服務(wù),避免宕機(jī).在本地web服務(wù)器和Internet之間架設(shè)反向代理服務(wù)器,可以阻止用戶請求對web服務(wù)器的直接訪問,而且它會自動(dòng)承擔(dān)對原始web服務(wù)器的靜態(tài)頁面請求,將服務(wù)請求按照預(yù)先配置的負(fù)載均衡策略分配給不同的Docker容器,以防止服務(wù)器過載,保護(hù)業(yè)務(wù)的安全性和穩(wěn)定性.web集群服務(wù)器通過容器的快速響應(yīng)部署,可以給業(yè)務(wù)的彈性伸縮帶來了極大的便利.web集群框架圖見圖6.
圖4 Docker容器、物理機(jī)、虛擬機(jī)的響應(yīng)速度測試結(jié)果
圖5 Docker容器、物理機(jī)、虛擬機(jī)對比
圖6 web集群框架
測試方案模擬中小型公司的網(wǎng)站業(yè)務(wù)進(jìn)行,在Docker集群中部署相同業(yè)務(wù)的網(wǎng)站(為了驗(yàn)證負(fù)載均衡的效果,設(shè)計(jì)中每個(gè)網(wǎng)站的內(nèi)容會不一樣),進(jìn)行均衡負(fù)載.首先利用Dockerfile把需要的網(wǎng)站鏡像快速構(gòu)建好,鏡像基于Ubuntu14.04,網(wǎng)站中部署好Nginx反向代理服務(wù)器,并且做好負(fù)載均配置.在不同的Docker節(jié)點(diǎn)中部署相同配置的網(wǎng)站,在宿主機(jī)上部署Nginx反向代理服務(wù)器,設(shè)置ip域名映射,采用平均策略的負(fù)載均衡,把Internet對宿主機(jī)web請求的訪問量以輪詢的方式分配給web集群中所有服務(wù)器,使得所有服務(wù)節(jié)點(diǎn)同時(shí)承擔(dān)外界對服務(wù)器的訪問,分解訪問壓力.訪問用戶在自己的客戶端設(shè)置web主機(jī)的域名解析,即可在瀏覽器上輸入域名訪問了.
實(shí)驗(yàn)測試結(jié)果見圖7.當(dāng)訪問主服務(wù)器的時(shí)候,web請求會將訪問壓力以輪詢的方式平均分配給每個(gè)服務(wù)節(jié)點(diǎn),保證了公司業(yè)務(wù)的可靠性和穩(wěn)定性.通過使用Docker容器技術(shù),在設(shè)計(jì)的快速應(yīng)用部署系統(tǒng)下,該web集群應(yīng)用可以進(jìn)行快速的部署和拓展,符合當(dāng)下很多公司應(yīng)對互聯(lián)網(wǎng)業(yè)務(wù)快速變化的需要,具有良好的應(yīng)用前景.
圖7 web集群測試效果
系統(tǒng)利用Docker技術(shù)可以實(shí)現(xiàn)快速部署所需的應(yīng)用系統(tǒng),以最小的時(shí)間代價(jià)和成本代價(jià)快速完成繁瑣的環(huán)境部署工作,大大縮短了開發(fā)周期和部署時(shí)間,可以實(shí)現(xiàn)用最低的成本創(chuàng)造最大的效益,解決了傳統(tǒng)互聯(lián)網(wǎng)業(yè)務(wù)拓展時(shí)間普遍較長的問題.系統(tǒng)簡單、快速,滿足IT開發(fā)公司、企業(yè)、學(xué)校實(shí)驗(yàn)室快速構(gòu)建開放、測試和產(chǎn)品環(huán)境等各種需求.
[1]張忠琳,黃炳良.基于 openstack 云平臺的 docker應(yīng)用[J].軟件,2014,35(11):73-76.
[2]張建,謝天鈞.基于Docker的平臺即服務(wù)架構(gòu)研究[J].信息技術(shù)與信息化,2014(10):131-134.
[3]劉思堯,李強(qiáng),李斌.基于 Docker技術(shù)的容器隔離性研究[J].軟件,2015,36(4):110-113.
[4]吳義鵬.基于容器虛擬化技術(shù)研究[J].軟件,2010,31(11):28-30.
[5]劉琳羽,南凱.一種基于Docker的開發(fā)者服務(wù)平臺設(shè)計(jì)[J].科研信息化技術(shù)與應(yīng)用,2015,6(5):65-72.
[6]鄭玲,江萌.基于Docker彈性調(diào)度架構(gòu)的研究[J].電腦編程技巧與維護(hù),2016(23):15-17.