劉晶晶 朱寅非



摘? 要: Docker作為一種新興技術,給企業的應用帶來了新的變革。它不僅降低了工程開發難度,更為重要的是它屏蔽了底層的異構環境。本文首先分析了傳統的虛擬機架構,然后給出了自己平臺即服務的架構。為了獲得新的平臺架構與傳統的虛擬機架構的有關參數對比數據,本文同時在上述兩種平臺上部署了Tomcat、Oracle和Mysql三種應用。通過改變CPU的核數、內存的大小等方式,得到服務器最大響應時間等指標。通過測試數據的分析,我們發現基于Docker引擎的PAAS平臺更適合輕量級的應用。
關鍵詞: 虛擬化;Docker;吞吐量
中圖分類號: TP391? ? 文獻標識碼: A? ? DOI:10.3969/j.issn.1003-6970.2020.10.001
本文著錄格式:劉晶晶,朱寅非. 基于Docker引擎虛擬化技術的應用研究[J]. 軟件,2020,41(10):0104
【Abstract】: Docker as an emerging technology, to the enterprise application has brought new changes. It not only reduces the difficulty of project development, more importantly, it shields the underlying heterogeneous environment. This paper first analyzes the traditional virtual machine architecture, and then gives its own platform as a service architecture. In order to obtain the new platform architecture and the traditional virtual machine architecture parameters of the comparative data, this paper also in the two platforms on the deployment of Tomcat, Oracle and Mysql three applications. By changing the number of cores, the size of the memory, etc, get the maximum response time of the server and other indicators. Through the test data analysis, we found that the PAAS platform based on Docker engine is more suitable for lightweight applications.
【Key words】: Virtualization; Docker; Throughput
0? 引言
云計算包括基礎設施即服務(IaaS),平臺即服務(PaaS)和軟件即服務(SaaS),對于開發人員來說,可以方便的將各種應用程序部署在PaaS上,這種PaaS平臺上部署有利于降低運行成本[1]。對于云計算來說,核心技術是虛擬化技術[2]。虛擬化技術在底層和上層操作系統之間插入了一個新的軟件層,它實現了底層和上層的解耦,降低因過多上層應用給底層主機帶來的壓力[3]。當上層虛擬機進行規模的部署時,會在底層宿主機上形成大量重復的內存分頁,最終導致虛擬機啟動變慢。而基于Docker引擎的虛擬化技術,雖然存在固有的缺陷,但在啟動速度、隔離度等方面有諸多優勢[4]。
1? 技術背景
Docker作為一種高級容器引擎,基于Go語言開發,在LXC之上做進一步封裝,提高了標準化和可移植性。LXC主要實現在單個宿主機上同時運行多個Linux系統,為每個虛擬化環境,提供自己的進程和網絡空間,保證多個容器之間的隔離。所以與傳統的虛擬化技術相比,它是一種輕量級技術,在虛擬機數量和資源消耗方面做了很好的平衡[4]。
基于Docker引擎虛擬化技術,存在兩個重要的概念:鏡像(Image)和容器(Container)。容器提供了一個虛擬化環境,這個虛擬化環境基本與完整的Linux環境保持一致。鏡像可以理解為一個純凈的操作系統,可以在基礎鏡像上做安裝應用、配置某些環境變量等操作,形成自己的鏡像,利用此鏡像可以構建一個可運行的環境[4]。
2? 基于Docker虛擬化架構
傳統的基于硬件的虛擬化技術如圖1所示,對于每一個上層虛擬化應用而言都需要一個獨立完整的操作系統,通過在Host OS上構建Guest OS來達到資源環境的隔離,基于獨立的操作系統再配置各種應用[5]。由處于基礎物理服務器和操作系統中間層的Hypervisors負責協調不同虛擬機對于CPU、內存、硬盤、網絡組件等資源的訪問,虛擬子系統的指令集通過硬件或者進制轉換為宿主機指令集[6]。不同主機上的應用通過網絡等間接方式進行數據交換。這種需要獨立操作系統的虛擬化技術對于宿主機要求較高,而且維護性不是很好,缺乏靈活性,增量的擴展能力比較弱,最主要的是應用程序之間的通信比較復雜。而基于Docker引擎的虛擬化技術,可以很好的擺脫上面的約束。
與傳統虛擬化技術不同的是,基于Docker引擎的虛擬化技術是系統級的虛擬,并沒有針對硬件層虛擬,通過共享底層虛擬的容器,去構建獨立的應用系統。一方面降低對物理資源的占用[7],減少鏡像消耗的空間,另一方面,可以提供宿主機的分發能力,提供虛機部署的靈活性。
3? Docker引擎體系架構
Docker引擎采用如圖2所示的架構模式。Client與Host之間通過RESTful API或者socket進行的通信。Docker Host主要由Server、Engine和Container三個部件組成。Server通過路由與分發調度機制,找到Engine中的相應job來處理客戶端的請求。Engine是系統結構中的運行引擎,同時也是容器運行的核心模塊,通過在Engine中創建job的方式來操縱管理所有客戶端發送的請求[8-9]。
Docker Host是服務端中一個常駐在后臺的守護服務進程,該守護進程在后臺啟動一個Server進程,其工作職責是接受客戶端發送的請求。Host中的Container是Docker系統結構中服務交付的最終體現方式。Docker可以直接調用Libcontainer庫文件,從而直接操縱Kernel中的namespace、cgroups、網絡等其它設備[8]。
Kernel主要由Namespaces和Cgroups(Controlgroups)構成。Namespaces實現了容器之間的隔離,為每個容器提供不同的主機名,保證每個容器都有獨立的運行空間。Cgroups主要用來管控系統的資源分配、權限限制等問題,保證容器之間可以平等使用系統的物理資源[7]。
4? PAAS平臺測試環境搭建
本次搭建的基于Docker引擎的PAAS平臺采用圖3的技術架構。Master通過Scheculer將各個任務和資源分配到每個節點上,Docker容器在啟動的時候會將消息通知Etcd服務,Etcd服務將已經啟動容器信息注冊到Etcd鍵值庫中。KLBEPROXY將Etcd中相關的服務變化,記錄到自己的cfg配置文件中并執行重新加載命令,使相關變化生效,同樣當容器停止時也會觸發KLBPROXY更新cfg配置文件并重新加載,達到動態服務注冊。業務請求通過KLBEPROXY分發到Docker容器中的應用[10]。Docker倉庫(Docker Registry)是存儲容器鏡像的管理倉庫。用戶或組織創建的各種應用包、鏡像可以通過PUSH指令將其上傳到Docker倉庫中。可以通過PULL指令從Docker Registry中下載鏡像。
本次測試過程中采用了如下所示網絡拓撲結構,流量無需經過防火墻,直接在內網內流通,其網絡架構如圖4所示。
VMware與PaaS平臺上均部署了Tomcat、Oracle和Mysql。1核CPU,2G內存的配置虛擬機創建3臺,2核CPU,4G內存的配置虛擬機創建3臺,4核CPU,8G內存的配置虛擬機創建3臺。
5? 試驗結果分析
采用圖4的測試環境,將Tomcat分別部署在PaaS平臺和VMware虛擬機上,設置100個線程、1000次循環,我們得到如下的測試結果。
在請求量為10000次的情況下,采用2核CPU、4 G內存配置的情況下,Docker的平均響應時間為175毫秒,中位數為45毫秒,99%用戶的響應時間為813.6毫秒,最大響應時間為45121.6毫秒,吞吐量為541.4,每秒從服務器端接收到的數據量為79.8 KB。而Vmware的平均響應時間為47毫秒,中位數為47毫秒,99%用戶的響應時間為59.6毫秒,最大響應時間為1249.6毫秒,吞吐量為2098.3,每秒從服務器端接收到的數據量為309.4 KB。對于4核CPU、8G內存的配置而言,Docker的平均響應時間為5.3毫秒,中位數為6毫秒,99%用戶的響應時間為13毫秒,最大響應時間為52.3毫秒,吞吐量為14036,每秒從服務器端接收到的數據量為2072.3 KB。而Vmware的平均響應時間為25毫秒,中位數為25.3毫秒,99%用戶的響應時間為33.6毫秒,最大響應時間為361.3毫秒,吞吐量為3852.3,每秒從服務器端接收到的數據量為568 KB。
對于Tomcat應用而言,當采用2核CPU、4 G內存配置的時候,Vmware在平均響應時間、中位數、最大響應時間、吞吐量等指標都要優于Docker。將系統的配置變為4核CPU、8 G內存在做測試的時候,相對于2核CPU、4 G內存而言,Docker和VMware的各項指標都有所提升,但Docker的性能提升更加明顯。
對于Mysql進行空表插入,設置500個線程、100次循環,對于1核CPU、2 G內存,2核CPU、4 G內存,我們得到如下的測試結果。
在請求量為50000次的情況下,采用1核CPU、2G內存配置的情況下,Docker的平均響應時間為119.6毫秒,中位數為27.3毫秒,99%用戶的響應時間為1723.3毫秒,最大響應時間為6012.3毫秒,吞吐量為3224.5,每秒從服務器端接收到的數據量為129.1 KB。而Vmware的平均響應時間為212.6毫秒,中位數為202.3毫秒,99%用戶的響應時間為891.3毫秒,最大響應時間為2210.6毫秒,吞吐量為2139.8,每秒從服務器端接收到的數據量為85.6KB。對于2核CPU、4G內存的配置而言,Docker的平均響應時間為111毫秒,中位數為24毫秒,99%用戶的響應時間為1574毫秒,最大響應時間為5061.3毫秒,吞吐量為3470.5,每秒從服務器端接收到的數據量為138.9 KB。而Vmware的平均響應時間為127毫秒,中位數為121.3毫秒,99%用戶的響應時間為514.6毫秒,最大響應時間為1258.6毫秒,吞吐量為3476.8,每秒從服務器端接收到的數據量為139.2 KB。
對于Mysql這一應用而言,無論采用1核CPU、2 G內存,還是采用2核CPU、4 G內存,Docker在平均響應時間、最大響應時間、吞吐量等性能指標都要優于Vmware,但當系統配置提高的時候,兩者之間的差距被縮小。