刘晶晶 朱寅非
摘 要: 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,但当系统配置提高的时候,两者之间的差距被缩小。