張延冬,邢艷芳
(1.南京南瑞繼保電氣有限公司,江蘇 南京 211102;2.中國傳媒大學(xué)南廣學(xué)院)
由于軟件開發(fā)人員與軟件測(cè)試或運(yùn)維人員的環(huán)境信息不對(duì)稱,傳統(tǒng)的軟件交付方式存在很多問題。如軟件發(fā)布分散,使用者安裝軟件時(shí)需要解決軟件的依賴關(guān)系。這些問題不但降低了軟件交付效率,而且難以實(shí)現(xiàn)持續(xù)交付和集成。
作為開源的應(yīng)用容器引擎,Docker很好地解決了上述問題。本文研究了基于Docker的輕量級(jí)虛擬化方案,以及類似于版本管理的映像管理模式。
Docker的運(yùn)行主要依賴以下幾個(gè)模塊:①Linux操作系統(tǒng),Docker依賴于像Linux容器(LXC)這樣的Linux技術(shù),以及Cgroups和命名空間功能,這些在Windows操作系統(tǒng)尚不存在,所以Linux的操作系統(tǒng)是Docker必不可少的基礎(chǔ)。②虛擬機(jī),由于普遍采用Windows操作系統(tǒng),所以需要虛擬機(jī)安裝Linux操作系統(tǒng)。③VMware虛擬機(jī)軟件,創(chuàng)建虛擬機(jī)并完成配置,以滿足Docker正常使用。配置好基本的硬件信息之后,在虛擬機(jī)上安裝Linux系統(tǒng),采用centOS6.8的操作系統(tǒng),下載并安裝Docker[1]。
Docker是軟件工業(yè)的集裝箱技術(shù),它提供了一個(gè)可供應(yīng)用程序運(yùn)行的獨(dú)立空間或者說容器。Docker最初采用Go語言編寫,相當(dāng)于是加在Linux容器上的管道,允許開發(fā)者在更高層次的概念上工作。Docker擴(kuò)展了Linux容器,通過一個(gè)高層次的API為進(jìn)程單獨(dú)提供輕量級(jí)的虛擬環(huán)境。與傳統(tǒng)虛擬機(jī)不同的是,一個(gè)Docker容器并不包含一個(gè)單獨(dú)的操作系統(tǒng),而是基于已有基礎(chǔ)設(shè)施中操作系統(tǒng)所提所供的功能來運(yùn)行[2]。
Docker基于C/S架構(gòu),由客戶端和服務(wù)端組成,主要包含以下組件:①Docker Client,Docker的客戶端。②Docker Server,是Docker daemon的主要組成部分,用于接收用戶通過Docker Client發(fā)來的請(qǐng)求,并按照相應(yīng)的路由規(guī)則實(shí)現(xiàn)路由分發(fā)。③Docker Registry,是Docker鏡像的中央存儲(chǔ)倉庫,用于儲(chǔ)存上傳的私有和公有Docker容器的鏡像備份。Docker的三個(gè)基本要素分別是:①Docker容器,負(fù)責(zé)應(yīng)用程序的運(yùn)行,程序可以是操作系統(tǒng),或者用戶添加的文件和元數(shù)據(jù)。②Docker鏡像,是一個(gè)只讀文件,用來運(yùn)行創(chuàng)建的Docker容器。③Dockerfile文件指令集,用來創(chuàng)建Docker鏡像,其命令用來構(gòu)建容器的每一層[3]。
⑴ 自定義指令集,依據(jù)基礎(chǔ)鏡像,結(jié)合實(shí)際的需要,在Dockerfile指令集中增添命令,創(chuàng)建符合實(shí)際需求的Docker鏡像。
⑵ 創(chuàng)建鏡像,可以通過Dockerfile文件創(chuàng)建,也可以通過倉庫拉取,還可以通過壓縮文件解壓生成鏡像,或者通過容器的反向Commit生成鏡像。
⑶ 生成容器,所有的鏡像文件都是為了生成Docker容器,容器是Docker的核心部分,在容器中部署、運(yùn)維、測(cè)試。
⑷ 上傳和下載鏡像,通過Docker官方提供的開源平臺(tái)Registry倉庫,方便鏡像的使用和傳播[4]。
虛擬機(jī)采用VMware12,可以虛擬所有的操作系統(tǒng),而且操作簡單。首先安裝VMware12,創(chuàng)建典型虛擬機(jī)。隨后用鏡像的centOS系統(tǒng)文件進(jìn)行安裝,選擇好鏡像文件后,對(duì)虛擬機(jī)的硬件進(jìn)行配置,分配內(nèi)存和硬盤空間,網(wǎng)絡(luò)適配器和光驅(qū)/聲卡等其他配置。虛擬機(jī)中安裝centOS系統(tǒng),在操作系統(tǒng)命令行終端,使用Linux命令對(duì)系統(tǒng)進(jìn)行操作。
在Linux操作系統(tǒng)下安裝Docker。首先打開命令終端檢查本地是否有Linux中的curl命令,如果沒有,輸入sudo yum install curl從yum庫中安裝curl命令。安裝好curl命令后,輸入curl-fsSL http://get.docker.com|sh進(jìn)入Docker官網(wǎng)獲取最新的Docker安裝包進(jìn)行安裝,具體操作參見圖1。

圖1 安裝Docker
使用命令Docker version檢查Docker的版本,正常情況下同時(shí)顯示client版本和server版本。只顯示client版本,表示Docker運(yùn)行時(shí)沒有超級(jí)用戶權(quán)限,命令不能執(zhí)行。使用命令Docker info檢查Docker基本信息,能正確顯示表示Docker已經(jīng)安裝完成。
在Linux中使用Vim創(chuàng)建Docker鏡像,編寫Python程序,完成下載和上傳等操作。使用Python語言編寫一段程序放到創(chuàng)建的容器中,測(cè)試程序在容器中的運(yùn)行情況和程序的輸出情況[5]。
創(chuàng)建Docker鏡像有很多種辦法,可以在官方網(wǎng)站上使用pull命令下載,也可以用Linux中的Vim命令編寫Dockerfile本地文件系統(tǒng)創(chuàng)建Docker鏡像。分別用兩種方法創(chuàng)建兩個(gè)Docker鏡像。
⑴ 在官方網(wǎng)站上使用pull命令下載
在Docker Registry和云平臺(tái)上存放的鏡像,都是按照用戶名/鏡像名的方式來存儲(chǔ)的。但有一類鏡像比較特殊,比如centos、ubuntu這類基礎(chǔ)鏡像,經(jīng)過官方驗(yàn)證,安全可靠,可以直接通過鏡像名來檢索到。輸入命令:$docker pull busybox,通過Docker命令下載busybox鏡像。執(zhí)行pull命令的時(shí)候要輸入完整的鏡像名稱。
⑵ 使用DockerFile文件創(chuàng)建鏡像
首先創(chuàng)建一個(gè)Dockerfile,包含一些創(chuàng)建鏡像的指令。新建一個(gè)目錄和一個(gè)Dockerfile。

在Dockerfile中每一條指令都創(chuàng)建鏡像的一個(gè)層。Dockerfile使用#來注釋,F(xiàn)ROM命令說明使用哪個(gè)鏡像作為基礎(chǔ)(即父鏡像),已RUN開頭的指令會(huì)在創(chuàng)建過程中運(yùn)行。Dockerfile文件可以通過網(wǎng)上下載或自己編寫,使用git命令從網(wǎng)站clone下載Dockerfile,使用Docker build命令來生成鏡像,如圖2所示。

圖2 創(chuàng)建鏡像
Docker容器可以理解為將一個(gè)進(jìn)程在一個(gè)安全封閉的環(huán)境中運(yùn)行。這個(gè)環(huán)境包含了該進(jìn)程運(yùn)行所必須的資源,包括文件系統(tǒng)、系統(tǒng)類庫、shell腳本等等。這個(gè)環(huán)境默認(rèn)不運(yùn)行任何程序,需要在環(huán)境中運(yùn)行一個(gè)進(jìn)程來啟動(dòng)這一個(gè)容器。這個(gè)進(jìn)程是該容器的惟一進(jìn)程,所以當(dāng)該進(jìn)程結(jié)束的時(shí)候,容器也會(huì)完全停止。
創(chuàng)建容器首先要有鏡像文件,通過Docker鏡像文件使用Docker run命令,將鏡像文件運(yùn)行成為Docker容器。啟動(dòng)容器,在容器中運(yùn)行相應(yīng)的程序以達(dá)到快速部署,應(yīng)用隔離。將之前通過兩種方法構(gòu)建的boyan_py和busybox兩個(gè)鏡像文件運(yùn)行成容器。

容器運(yùn)行后,在Python中運(yùn)行寫好的程序,進(jìn)行測(cè)試,檢測(cè)程序的可行性和容器是否已部署完成。
當(dāng)修改了某一個(gè)容器之后,通過執(zhí)行Docker中的commit命令,可以保存對(duì)容器的修改。Docker中保存狀態(tài)的過程稱之為committing,為了與舊版本區(qū)別,會(huì)產(chǎn)生新的版本號(hào)。使用docker ps-l命令獲得容器的id,輸入命令:$docker commit 83ae boyan/centos:7.1,把這個(gè)鏡像保存為boyan/centos:7.1。無需拷貝完整的id,通常起始的三至四個(gè)字母即可區(qū)分,如圖3所示。

圖3 容器封裝成鏡像
通過docker push命令可以將某一個(gè)鏡像發(fā)布到官方的索引網(wǎng)站,分享到這樣的開源平臺(tái),一方面可以重用,另一方面也可以分享使用,提高使用效率,避免重復(fù)勞動(dòng)。docker images命令可以列出所有安裝過的鏡像。
在已經(jīng)安裝好的VMware上虛擬第二臺(tái)計(jì)算機(jī),配置和第一臺(tái)相同。同樣在創(chuàng)建好的虛擬機(jī)中安裝Linux系統(tǒng),登錄之后安裝Docker,配置與之前相同。新建好Docker之后,從registry中pull之前上傳的鏡像文件,pull回本地的鏡像文件名與上傳時(shí)一致。
使用docker run命令運(yùn)行鏡像文件,使其生成docker容器,在容器中檢驗(yàn)編寫的python程序,測(cè)試容器的性能。執(zhí)行完docker run命令后,生成73f5a93600f8這個(gè)容器,在容器中運(yùn)行python檢測(cè)程序是否可以執(zhí)行,如圖4所示。

圖4 在容器驗(yàn)證Python程序運(yùn)行
Python程序成功運(yùn)行,表明了運(yùn)維系統(tǒng)的可行性。本文通過創(chuàng)建鏡像、運(yùn)行容器和鏡像共享,驗(yàn)證了Docker容器的快速部署和輕量級(jí)的特點(diǎn),展現(xiàn)了Docker類似集裝箱的技術(shù)在運(yùn)維平臺(tái)搭建中的廣泛應(yīng)用前景[6-7]。
伴隨互聯(lián)網(wǎng)時(shí)代的發(fā)展,程序開發(fā)和運(yùn)維項(xiàng)目日益增多,快捷方便地搭建環(huán)境必將成為趨勢(shì)。Docker降低了開發(fā)人員的繁瑣勞動(dòng),簡化了與測(cè)試運(yùn)維人員的配合,方便在持續(xù)的集成環(huán)境中進(jìn)行部署和驗(yàn)證工作。未來還需考慮Docker在Windows系統(tǒng)中的應(yīng)用,以及共享的安全性,私有庫的身份驗(yàn)證,安全機(jī)制等方面。
參考文獻(xiàn)(References):
[1]陳康,黃炳良.基于openstack云平臺(tái)的docker應(yīng)用[J].軟件,2014.11:73-76
[2]張怡.基于Docker的虛擬化應(yīng)用平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)[D].華南理工大學(xué)碩士學(xué)位論文,2016.
[3]王飛.基于Docker的研發(fā)部署管理平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京交通大學(xué)碩士學(xué)位論文,2015.
[4]劉琳羽,南凱.一種基于Docker的開發(fā)者服務(wù)平臺(tái)設(shè)計(jì)[J].科研信息化技術(shù)與應(yīng)用,2015.5:65-72
[5]胡湘菲.軟件自動(dòng)化測(cè)試環(huán)境搭建中的Docker應(yīng)用[J].計(jì)算機(jī)時(shí)代,2017.3:26-29
[6]逸凡.從Docker的流行談云計(jì)算的走向[N].網(wǎng)絡(luò)世界,2015-03-09(014).
[7]E.Mazzoni,S.Arezzini,T.Boccali,A.Ciampa,S.Coscetti,D.Bonacorsi.Docker experience at INFN-Pisa Grid Data Center[J].Journal of Physics:Conference Series,2015.664(2).