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

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

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

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

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

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

圖4 在容器驗證Python程序運行
Python程序成功運行,表明了運維系統的可行性。本文通過創建鏡像、運行容器和鏡像共享,驗證了Docker容器的快速部署和輕量級的特點,展現了Docker類似集裝箱的技術在運維平臺搭建中的廣泛應用前景[6-7]。
伴隨互聯網時代的發展,程序開發和運維項目日益增多,快捷方便地搭建環境必將成為趨勢。Docker降低了開發人員的繁瑣勞動,簡化了與測試運維人員的配合,方便在持續的集成環境中進行部署和驗證工作。未來還需考慮Docker在Windows系統中的應用,以及共享的安全性,私有庫的身份驗證,安全機制等方面。
參考文獻(References):
[1]陳康,黃炳良.基于openstack云平臺的docker應用[J].軟件,2014.11:73-76
[2]張怡.基于Docker的虛擬化應用平臺設計與實現[D].華南理工大學碩士學位論文,2016.
[3]王飛.基于Docker的研發部署管理平臺的設計與實現[D].北京交通大學碩士學位論文,2015.
[4]劉琳羽,南凱.一種基于Docker的開發者服務平臺設計[J].科研信息化技術與應用,2015.5:65-72
[5]胡湘菲.軟件自動化測試環境搭建中的Docker應用[J].計算機時代,2017.3:26-29
[6]逸凡.從Docker的流行談云計算的走向[N].網絡世界,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).