Docker技术在Web服务系统中的应用研究
2016-11-24钟良侃
钟良侃
摘要:对现有信息系统进行云化的一种可行的方法就是使用SOA架构将现有系统转变为Web服务系统。通过分析基于虚拟机部署的Web服务系统局限性,探讨Docker虚拟化技术对Web服务系统设计、开发及运维的影响。利用Docker技术的应用组件级虚拟化特性,将Web服务组件封装为Docker镜像,从而实现Web服务组件在Docker容器中的自动化部署和统一管理。根据实验可以给出一种基于Docker技术的Web服务系统设计和实现方案,让Web服务系统在未来云平台部署和运维更加快捷方便。
关键词:SOA;Docker;虚拟化;云平台
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)26-0123-04
Study on the Application of Docker Technology in Web Service System
ZHONG Liang-kan
(Academic Affair Office, Shanghai Open University, Shanghai 200000, China)
Abstract: A feasible way to deploy existing information system on the cloud platform is to reconstruct it into web service system based on SOA architecture. This article analyzed the limitations of the web service system which is deployed on visual machine, and studied the influences of using Docker virtualization technology in web service system development and implementation. Due to the Docker feature in Application components level virtualization, web service components can be packaged into specified Docker images. This paper provided a new method on design and implementation of web service system based on Docker technology. Web service components can be automated deployment and unified management by this method. Experiment results show that the method is feasible, and web service system can be run and deployed easier and quicker on cloud platform by using Docker technology in the future.
Key words: SOA; Docker; Virtualization; Cloud Platform
1 背景
随着云计算的提出,越来越多的企事业单位开始接受云计算按需服务的理念,这使一些软件行业的跨国公司看到了商机。以亚马逊、谷歌、微软和IBM为首的云计算巨头,正在不断推进云计算相关业务的开展,其所带来服务营收的快速增长正在使云计算服务成为这些跨国公司的主营业务之一,据Gartner 估计,2016年全球云应用服务(SaaS)市场的收入预计增长20.3%,达到377 亿美元[1]。随着云计算商业模式的日渐成熟,越来越多的企业和政府部门都开始考虑将内部使用的软件应用迁移到云端,从而降低IT运维的成本。这些变化都将改变传统信息系统的建设及部署方式,使原来存在于各企事业单位中定制化的信息系统逐步向面向服务架构以及云部署的方向转变。
云计算的实现离不开虚拟化技术的支撑以及面向服务架构的广泛应用。虚拟化技术将计算机物理硬件资源进行重新整合和抽象,并形成可被动态调用的资源,降低了信息系统对于物理硬件的依赖,而面向服务架构使信息系统从单一业务转变成可以通过网络访问的一组互相连接的服务模块[2]。这些技术的逐渐成熟正在推动着企业内部信息系统进行面向服务改造,并向云端迁移。近些年逐步流行的Docker虚拟化技术,正在利用操作系统虚拟化本身已有的特性实现轻量级的应用组件虚拟化,从而使采用若干组件构建的信息系统在云平台上部署更加快捷方便。
2 Docker技术简介
Docker 是一个基于 LXC[3] (Linux Containers)虚拟化技术的高级容器引擎,使用Go语言实现的一种面向云平台的虚拟化技术。对比传统的虚拟化技术,Docker粒度更小、更轻量级,它不需要虚拟化硬件,也不需要指令级模拟和即时编译。传统的虚拟化技术如 vSphere 和 Hyper-V 的目标是建立一个可以执行应用的整套系统沙盒环境,即虚拟机;而 Docker 所利用的Linux容器技术则是将应用所需要的相关源码、依赖库、环境配置等都打包起来建立一个沙盒执行环境[4]。Docker虚拟化技术有效的将由一个单独操作系统管理的资源划分到一个个孤立的组中,平衡了孤立的组之间资源使用需求的冲突,使资源的利用率大大提升。而对于运行于Docker容器中的应用程序来说,会产生一种错觉:就好像运行在一个独立的Linux主机中一样[5]。容器可以在核心CPU运行本地指令而不需要任何特殊的解释机制,避免了半虚拟化[6]和系统调用替换的复杂性,实现接近宿主机的运行性能。
Docker虚拟化基于应用组件级虚拟化技术进行构建,这使容器具有独立性和封闭性的特征,一个容器的运行不会影响其他容器或者宿主环境。每一个容器都有自己的存储空间、进程以及网络接口,并包含Linux系统运行所需的应用程序。但与传统操作系统级虚拟化技术不同,基于容器运行的Docker虚拟化技术并没有虚拟一个完整的Linux操作系统,而只保留了应用程序运行所必需的核心操作系统环境。因此它具有启动时间短、空间占用少、分发和复制方便、资源开销少等特点,却具备和传统虚拟机一样的隔离性和安全性。Docker容器与传统虚拟机对比如表1所示[7]:
表1 Docker容器与虚拟机之间性能差异
[特性\&Docker容器\&虚拟机\&启动速度\&秒级\&分钟级\&硬盘使用\&一般为MB\&一般为GB\&性能\&接近原生\&弱于\&系统支持量\&单机支持上千个容器\&一般几十个\&隔离性\&安全隔离\&完全隔离\&]
Docker自2013年发布以来,已成为炙手可热的PaaS虚拟化技术。Redhat、Google、IBM、百度、阿里巴巴等公司都相继集成了对Docker虚拟化的支持[8]。在众多云计算服务提供商的参与下,Docker容器应用组件级“一次封装,到处运行”的目标正在变成现实,为应用系统在各种云平台和操作系统上实现跨平台部署和运行提供了全新的解决方案。Docker容器就像一个集装箱,它并不关心你运行的到底是什么程序,所有应用的运行方式都一样——创建、开始、停止、重启和销毁;容器也不在乎在什么样的环境中运行,可在个人电脑、虚拟机、云服务器、各种操作系统上运行[9]。
3 基于Docker的Web服务系统改造方案
3.1 基于虚拟机部署的Web服务系统局限性
要将现有信息系统按照云平台理念进行重构,其中一种可行的方法就是打破现有信息系统设计架构,使用SOA架构将现有系统模块化、服务化,使其成为一个由若干轻量级服务组件构建的可分布式部署的Web服务系统。这样做既降低了原信息系统复杂度,也降低了信息系统部署所需资源的量级,使信息系统能够更加灵活的向云平台扩展。根据SOA架构的设计方案,部署Web服务提供组件的宿主机的网络环境和操作系统环境直接影响着Web服务系统运维是否便捷。由于虚拟主机提供了相对统一的网络环境和操作系统环境,因此越来越多的Web服务系统被部署在虚拟主机上。但是由于虚拟机所消耗的大量系统资源被分配给操作系统而非Web服务组件,使在一台虚拟机中到底部署多少Web服务组件为宜成为困扰IT运维人员的难题。另外,若遇到Web服务组件在某一时段内需要大量被复制和扩展的情况,最快的方法则是复制和扩展虚拟机。由于一台物理主机能够承载的虚拟机是极为有限的,复制的虚拟机镜像副本反而会增加了宿主机系统资源开销和运行效率。
3.2 基于Docker部署的Web服务系统优势
Docker虚拟化技术为解决上述问题提供了新方案。其核心思想就是将若干Web服务系统组件部署在若干个Docker容器中,并将整个Web服务系统组件连同运行环境固化为一个PaaS服务,便于向云端迁移和扩展。Docker使用平台即服务的理念实现Web服务系统的敏捷性、共享性、分布性和可伸缩性。其应用优势主要集中在以下四个方面。
1)快速获取或创建服务镜像
由于Docker容器是一个轻量级的应用组件级虚拟机,因此Web服务组件所需的系统环境可以在Docker容器中搭建。通过这样的改造,使承载Web服务程序的虚拟镜像由原先采用虚拟机技术的几个GB缩小为采用Docker容器技术几百MB,所需的存储空间大大降低,并且在网络中复制和传输的效率更高。
2)服务镜像内环境可度量
Docker容器的隔离性使其中的Web服务组件感觉自己似乎运行在一个独立的Linux主机中一样。Docker 可以对外开放容器内部网络端口,并映射到宿主机的实际端口中去,而Docker内环境经过配置后可以模拟Web服务组件的操作系统运行时。这些特性都极大提高了Web服务系统开发时的网络无关性和运行环境无关性。
3)服务镜像具备高伸缩性
Docker容器的运行是基于Docker镜像的,要使用Docker容器,首先要创建Docker镜像。Docker镜像就好比是一个模板,而Docker容器就好像这个模板的实例,一个Docker镜像可以创建多个Docker容器,这个特性使Docker容器的扩展变得十分方便。通过已经固化的Docker镜像,可以方便地在宿主机中执行新建、运行、停止、删除容器操作,从而可快速建立和启动Web服务组件的多个副本,并在服务空闲时段删除多余的副本。
4)服务镜像云端应用便捷
在云计算主要服务提供商的支持下,Docker技术正受到越来越多云计算公司的关注和应用。两大软件巨头——微软公司以及Oracle公司都对该技术提供支持,这使Docker容器可以承载由两大主流语言——Java和C#所开发的各种Web服务组件。不仅如此,亚马逊、微软以及Google公司均宣布可以让用户创建的Docker镜像在旗下的云平台中直接运行,这使Docker镜像跨平台兼容性得到了极大的提高。可以预见,Docker镜像未来可以在各大云计算服务提供商的云主机中直接调用和运行,并承载由多种语言开发的、可能需要不同运行时环境运行的Web服务组件,真正实现一次开发,到处运行。
3.3 基于Docker的Web服务系统设计
一般来说,Web服务系统主要由一个服务调度组件和若干服务提供组件组成,提供相应服务给服务消费者。基于虚拟机部署的Web服务系统中,Web服务调度组件主要实现对服务提供组件的发现和调用,并监控服务提供组件的运行状态,保证Web服务系统的正常运行。而对于服务提供组件的启动、停止以及迁移都交由虚拟机管理软件来实现。这样做有一个弊端,就是Web服务调度组件并没有对所注册的服务具有完全管辖权,实现对Web服务系统的运维主要依赖虚拟机管理软件,运维人员要将服务调度组件以及虚拟机管理软件结合起来才能实现Web服务系统的自动化管理功能。
而将Web服务提供组件部署在Docker容器后,Web服务调度组件除了实现对服务的发现和调用等基本功能外,还可以实现对于Web服务提供组件的启动、停止、复制和删除,这意味着Web服务调度组件可以对所注册的服务实现完全监管。此时服务调度组件不仅存储实际Web服务提供组件的调用地址和端口信息,还维护着承载Web服务提供组件的Docker容器信息,包括Docker镜像的位置以及创建、运行、停止和删除Docker容器的Shell脚本。通过Shell脚本和JAVA管理程序开发就可以自动化调用Docker技术所提供的容器配置命令完成服务重新配置和运行。基于Docker容器部署的Web服务调度组件的运行步骤如图1所示:
从图1可知,若服务可用,服务调度组件的执行顺序与之前无异,一旦服务不可用,服务调度组件可以通过Shell脚本快速重启Docker容器。这得益于Docker容器是通过Docker镜像创建的,再下一次遇到同样错误停止前,Web服务会保持刚开始运行时的状态。而由于Web服务所需要调用或生成的业务数据其实并不存储在容器内,因此容器的重启和还原对业务数据没有任何影响,Docker容器的秒级启动速度保证了服务的高可用性。当服务需要扩展时,服务调度组件可以通过执行预设的Shell脚本,在Docker宿主机内快速创建并运行一个新的承载服务提供组件的容器副本,并将后续的服务请求引导到新的Web服务提供组件副本中去。对于不再需要使用的Docker容器副本,服务调度组件也可以通过执行脚本实现对Web服务提供组件副本的停止和删除,实现Web服务系统的自动伸缩。应用Docker容器技术后,可以通过简单的程序开发就实现服务的高可用性和可伸缩性,而不需要依赖专业的虚拟机管理软件的辅助来实现这些功能,真正实现了服务调度组件作为“服务管理者”角色在SOA系统中所起的管理者作用。
Docker技术要求Web服务提供组件在设计时尽量小型化。因此在Web服务提供组件设计中,明确服务提供组件的所提供的单一逻辑功能,即一个服务提供组件完成单一业务,而复杂业务由多个服务组件组合提供。
经过对服务调度组件以及服务提供组件的改造,基于Docker技术的Web服务系统设计模型如图2所示。
从图2我们可以看到,基于实体主机的Web服务系统的服务调度组件被分解为两个部分,一个是面向服务消费者的服务注册组件,一个是部署于Linux宿主机的服务管理组件。若Docker服务镜像分布在不同的主机中部署,那么就需要为每个主机部署服务管理组件,并建立服务注册组件与服务管理组件之间的固定联系。而若将Web服务系统放在云平台上,考虑到云主机的资源可伸缩性,也可以将服务注册组件和服务管理组件合并为服务调度组件部署在运行Docker服务镜像的云主机中。
4 基于Docker的Web服务系统实现
根据Web服务系统改造方案,可以基于JAX-WS 2.0框架通过编程方式完成对服务管理组件和服务注册组件的实现,并将服务提供组件部署在自行创建的Docker容器中,从而实现Web服务系统基于Docker的部署。这里我们以Linux 6.4实体主机部署为例描述基于Docker技术的Web服务系统实现过程。
1)创建运行环境并完成Docker镜像创建
Tomcat在Docker Hub库中发布了官方的Docker镜像,由于Web服务系统采用的是Tomcat 7.0运行环境,可以使用docker pull命令下载对应的Tomcat 7.0镜像。我们使用docker run命令启动Tomcat容器,先将服务提供组件和所需JAR包拷入Docker容器中,并在容器中挂载服务提供组件目录实现部署文件在容器内共享,并将容器中Tomcat的8080端口映射到宿主机的6000端口上,实现承载Web服务组件的特定服务镜像创建。
2)部署Docker镜像并编写Shell远程管理脚本
完成对装载Web服务提供组件的服务镜像创建后,将这个镜像包复制到拟运行Docker容器的Linux宿主机中。为方便起见,我们采用编写Shell脚本的方式实现对Web服务容器的启动、停止以及重启,并将这个脚本作为服务管理组件部署在Linux宿主机中。
3)完成服务注册并实现管理脚本远程调用
编写完Shell管理脚本后,可以通过Java编写的服务注册组件来远程管理Docker 容器了。使用Java语言开发程序实现对宿主机服务管理组件的远程调用。在JAVA项目中引用Ganymed-SSH2包,使用JAR包中的Connection类实现基于用户名密码的宿主机远程登录。登录成功后,使用session类的openSession()方法创建新的用户会话,最后使用execCommand()方法远程调用在服务组件部署主机上已经完成的shell管理脚本,实现对Docker容器的管理。而服务提供组件所在的宿主机IP地址、调用端口、宿主机SSH登录用户名和密码等信息存储在服务管理数据库中供服务注册组件查询和调用。
实现以上三个步骤后,基于Docker容器的Web服务系统就可以对外提供服务了。而且通过改造后的Web服务注册组件和管理组件,可以实现Web服务系统的自动化管理和自适应伸缩功能。
5 结束语
Docker正在让Web服务系统的开发和运维变得越来越简单,利用这一技术,Web服务系统在敏捷开发、灵活部署、自动运维和可伸缩性方面比采用其他软件架构的系统更具优势。只要通过创建服务的容器运行环境,并承载自行开发的轻量级Web服务组件,就可以将该组件发布为Docker服务镜像,在不同的平台和系统中运行,并灵活组合成不同的Web服务系统满足实际需求。随着对该技术应用研究的深入,相信在云计算服务提供商以及众多开发者的支持下,未来该技术会得到更多开发者的认同并得到广泛应用。
参考文献:
[1] Gartner Says Worldwide Public Cloud Services Market Is Forecast to Reach $204 Billion in 2016[EB/OL].(2016-01-25).http://www.gartner.com/newsroom/id/3188817.
[2] 王庆波, 金涬, 何乐, 等. 虚拟化和云计算[M]. 北京: 电子工业出版社, 2010: 133-134.
[3] 汪恺, 张功萱, 周秀敏. 基于容器虚拟化技术研究[J]. 计算机技术与发展, 2015(8): 138-141.
[4] 张建, 谢天钧. 基于Docker的平台即服务架构研究[J]. 信息技术与信息化, 2014(10): 131-134.
[5] 姜渠. 一种基于Linux容器的动态迁移方法[J]. 信息技术与信息化, 2015(2): 66-68.
[6] 尹文开. 云平台中虚拟机生命周期管理的研究与实现[D]. 北京: 北京邮电大学, 2015.
[7] 杨保华, 戴王剑, 曹亚仑. Docker技术入门与实践[M]. 北京: 机械工业出版社, 2015: 7-8.
[8] 陈清金, 陈存香, 张岩. Docker技术实现分析[J]. 信息通信技术, 2015(2): 37-39.
[9] 肖俊. 基于Docker的跨主机容器集群自动伸缩设计与实现[D]. 西安: 西北大学, 2015.