1.3 脱颖而出的容器技术
1.3.1 容器技术的历史
X86上的虚拟机技术与容器技术基本上是并行独立发展的,初期虚拟机技术占上风,到了2005年,容器技术开始慢慢脱颖而出。容器技术的发展离不开谷歌的推动,我们一直以为Docker公司是容器技术的领头羊,但实际上谷歌才是容器技术真正的幕后推手。
谷歌的整个生产系统中一直没有使用虚拟机技术,而是全部采用容器技术来支撑。在2015年的EuroSys会议上,谷歌公布了多年以来的容器集群方面的秘密:谷歌早些年构建了一个管理系统,它可以用来管理集群、容器、网络以及命名系统。第一个版本被称为Borg,后续版本称为Omega。目前每秒会启动大约7000个容器,每周可能会启动超过20亿个容器。利用多年在大规模容器技术上的实践经验和技术积累,谷歌构建了一个基于Docker容器的开源项目Kubernetes,借此奠定了自己在容器界的霸主地位。
2006年KVM开始发展,随后谷歌也开源了容器的底层核心技术Cgroups, Cgroups随后被纳入Linux内核中,接下来的开源项目LXC(Linux Container)提供了创建Linux容器的一站式API封装,从此之后,容器技术开始被大家所关注,而Docker早期就采用了LXC项目来完成具体容器的创建过程。但LXC技术对环境的依赖性很强,在一台机器上用LXC打包出来的镜像,如果迁移到别的机器上运行就会出现问题。所以,容器技术一直没有流行开来,Docker的出现彻底改变了容器技术的尴尬状况。Docker对容器技术做了一次革命性升级,创建了自己一整套的分层文件系统,标准化了容器镜像,使容器化在不同的环境、不同的操作系统迁移的时候,完全不受外界环境的影响,提高了整个系统的可迁移性,使容器化技术真正成为可实用的技术,彻底解决了LXC迁移性、独立性、可管控性的问题。于是2013年以Docker为代表的容器技术开始爆发,从此以后,Docker成为容器技术的代言人。
2015年也成为容器化发展历程上的一个重要里程碑,全球容器化标准组织云原生计算基金会(Cloud Native Computing Foundation, CNCF)正式成立,这是由谷歌策划、Linux基金会支持的一个新组织,旨在推动容器技术标准化发展。2016年,微软在其Windows Server 2016操作系统版本里首次支持Docker,解决了基于Windows系统使用容器的难题。这样一来,未来Docker不仅可以运行在Linux上,也可以在Windows上运行,我们可以看到,容器正在改变整个世界,不管是什么样的操作系统,容器技术都已经开始得到支撑。
提到容器,我们经常会碰到一个问题:容器和虚拟机真正的区别是什么?图1-7很好地解释了虚拟机和容器的区别。
图1-7 虚拟机和容器的区别
图1-7左侧是虚拟机,我们看到,虚拟机需要一个完整的操作系统,而容器则是共享同一个宿主机的操作系统,因此容器是非常轻量级的,容器里面仅仅包括相关的用户代码和所依赖的类库,因此容器也被称为是进程级的虚拟化。在一个操作系统上建立一个容器,实际上就相当于在一个操作系统上建立一个应用,因此它的启动速度和响应速度与虚拟机完全不在一个层面上。
另外,两者打包的镜像尺寸大小也不同,因为要包含一个完整的操作系统和各种类库,所以虚拟机的镜像非常大,一个生产环境中的虚拟机的镜像经常超过1 GB,但是容器化镜像通常只有几十到几百兆。此外,镜像大小会大大影响整个系统弹性伸缩和快速部署的速度,例如,容器可以实现秒级的快速弹性伸缩,最主要的原因就是它的镜像尺寸比虚拟机要小很多,很快就能通过网络下载到目标机器并启动起来,而虚拟机可能仅仅下载镜像就需要几分钟,甚至更长的时间。
容器也可以部署在虚拟机上,那么,容器直接部署在物理机上还是部署在虚拟机上好?这是目前业界经常争论的焦点,目前的容器尤其是电信行业的容器,一般部署在裸机上,因为在虚拟机上部署容器会经过两层的虚拟化,网络I/O和存储I/O都会受到很大的影响,因此建议容器尤其是关键类的应用最好部署在裸机上,这样在管理上、扩展上就完全没有障碍。但是如果公司内部已经有基于虚拟机的私有云平台,在上面部署容器也没有太大问题,不过需要将性能损耗考虑其中。
1.3.2 dotCloud发现了“金矿”
谷歌发明了容器,Docker成就了容器,那么就有必要了解一下Docker是如何诞生的?
Docker公司的原名叫做dotCloud,最初的产品是一个商业化的PaaS平台,但PaaS市场从未真正火热起来,有实力的公司都是自己开发PaaS平台,很少有公司会花钱买。市场本来就很小,又有很多厂商争夺,所以每家的日子都不好过,对于创业型的小公司dotCloud来说日子越来越难,背后的投资公司则急着要创办者找到新出路,于是dotCloud的创办人Solomon Hykes(目前在Docker公司担任CTO)决定放手一搏,效法开源运动的精神,把公司在开发PaaS平台时为了方便采用Linux Container而研发的一套工具(即Docker的原始版本)开源出来。开源之后的这套新颖的容器工具受到了很多软件工程师的追捧,开发人员开发完程序之后只要用Docker打包成镜像交给测试人员,测试人员在本机就能使用这个镜像启动容器并进行快速测试,不同的版本被固化为不同的镜像,所以很容易进行回归测试,几个不同的镜像版本可以同时测试。由此开始,Docker在业界赢得了很好的口碑并迅速风靡开来。后来dotCloud公司就改名为Docker,2014年6月对于Docker来说是非常重要的一个发展节点,谷歌宣布支持Docker,并且投资了Docker公司,有了互联网巨头谷歌的号召,其他公司纷纷跟风,越来越多的企业开始尝试并使用Docker技术。
以下是Docker发展过程中的一些重要事件。
❑ 2013年3月27日,正式作为public项目发布。
❑ 2014年1月,被Black Duck评选为2013年十大开源新项目。
❑ 2014年6月9日,Docker社区正式发布了Docker 1.0。
❑ 2014年6月,谷歌宣布自主融合Docker技术的云计算服务Google App Engine和Google Compute Engine。
❑ 2014年9月,获得4000万美元的融资,此时已经累计融资6600万美元。
❑ 2015年4月,获得了9500万美元的融资,已经确立了在第三代PaaS市场的主导地位。
❑ 2015年,容器技术异军突起,其融合DevOps的敏捷特性备受业界关注,IBM、微软等传统厂商纷纷向Docker伸出橄榄枝。
❑ 2015年1月,腾讯云计算公司对外宣布成为中国首家支持Docker Machine的云计算厂商,并将自身定位于Docker基础设施的服务商。
❑ 2015年6月,Linux基金会与行业巨头联手建立云原生计算基金会(CNCF)。
2015年6月容器化标准组织OCP成立后,更多的大企业和创业公司开始拥抱Docker,2015年谷歌开源的Kubernetes奠定了其在容器领域微服务架构之王的地位,随后Docker公司的Swarm项目开始“模仿”Kubernetes, Mesos则第一时间拥抱了Kubernetes这个重量级新事物。2016年中国移动率先成功地在电信领域尝试大规模地部署和应用Docker & Kubernetes平台。Docker项目的社区代码贡献者也由2016年年初的900多增加到目前的1200多。
图1-8为我们展示了Docker生态圈的样貌,我们可以看到,操作系统厂商、虚拟化厂商、公有云厂商、服务器厂商和传统的IT巨头都成为Docker生态圈的一份子,而IBM、微软、惠普等公司都是Docker主要的战略伙伴和投资人,容器技术不仅仅对运维的帮助很大,它对软件开发的生命周期管理也带来了很大的冲击,大大促进了DevOps理念的落地。
图1-8 Docker生态圈
1.3.3 容器技术带来的变革
容器技术带来了诸多的变革。首先,Docker推动了微服务架构设计理念的落地,把一个原来很庞大的复杂的单体(单进程)应用拆成一个个基于业务功能的完全独立的小程序,并且分布式部署在一个集群中,以增加系统的稳定性、水平扩展能力,这就是微服务架构的核心思想和做法。微服务架构相对于传统单体应用来说,有两个明显的优势:第一,在开发上一个很大的团队完全可以拆成一个个小的专业团队,各自关注不同的业务功能的开发,因此系统的开发迭代、更新和升级就会变得非常敏捷;第二,由于微服务架构本身就是分布式架构,所以很容易实现系统的高可用以及快速弹性扩容能力,当某一个业务随着访问量的增大而出现性能瓶颈时,我们就能快速地对其进行弹性伸缩,增加服务实例数量,以改善整个系统的性能。
实际上微服务的理念很早就已经提出,微服务要求我们把一个完整的应用拆成一个个独立部署的微服务进程,并且部署在多个机器组成的一个集群中,每个机器上会部署很多微服务进程,不仅大大增加了系统发布、测试和部署的工作量,后续系统升级和运维管理的难度和复杂度也会大大提升。因此在缺乏自动化工具和相关平台支撑的情况下,微服务架构很难落地,长期以来只在一些大的互联网公司推行。
但Docker的出现改变了这一切。在Docker的帮助下,我们可以把每个微服务进程打包成独立的镜像,存储在统一的镜像仓库中,升级后的版本打包新镜像,采用新的Tag标签来区别于旧版本。只要写一个简单的脚本,以容器方式启动各个微服务程序,就能很快地在集群中完成整个系统的部署。还可以借助Docker引擎提供的API,以编程方式来实现图形化的管理系统,一键发布系统、一键升级、自动修复系统等高级功能也都容易实现了。实际上谷歌开源的Kubernetes平台首次将微服务架构的思想贯穿到底,在Kubernetes的世界里,任何一个应用都由一个个独立的服务(Service)组成,一个具体业务流程实际上是由一个个服务串联在一起而完成的,部署应用的时候也按照服务的方式部署,不用关注服务到底会分布到哪些机器上,因为Kubernetes会自动调度Service对应的容器实例到可用的节点上,并提供高可用和弹性伸缩功能。实际上Kubernetes目前实现的功能特性早已超过微服务架构本身的要求,因此越来越多的公司开始使用Kubernetes平台打造自己的微服务架构系统。
其次,Docker大大提升了软件开发和系统运维的效率,促进了DevOps体系的成熟与发展。
Docker最大的特点是对应用的发布版做了一个标准化的封装,解决了应用的环境依赖难题,并且不再需要安装部署过程。开发人员打包应用镜像之后就可以将镜像原封不动地转给测试人员,只要执行一个简单的启动命令,测试人员就可以在任意支持Docker的机器上成功运行应用程序并进入测试阶段。如果测试通过了就可以把这个镜像上传到镜像库中,随后运维人员可以直接从镜像库里把镜像拿出来并部署在生产集群中。这个过程完全可以建立一套标准化流程,因为每个环节传递的都是经过认证的标准化镜像,因此可以在后台通过一系列工具来控制整个流程的实现和度量。
通过一个流水线串联并驱动整个应用的开发生命周期过程,包括源码编译、镜像打包、自动部署或升级(测试环境)、自动化测试,以及运维阶段的监控告警、自动扩容等环节,这就是DevOps的实践思路。由于在这个过程中引入了Docker技术,从而很大程度上提升了系统运维的可管控性、可度量性、可监控性等重要指标,这就是Docker带来的第二个重要变革:进一步促进了DevOps的落地和发展。因此,在容器化平台改造建设完成之后,下一个重点目标就是建设DevOps平台,以促进整个软件的开发运维流程进一步向自动化、可管控性的目标迈进。
容器技术虽然是由Docker公司开源出来并发扬光大的,但背后是以谷歌为首的IT巨头在推进并且其已经成为标准规范,类似当年的J2EE组织,所以容器技术的影响力和影响范围会进一步扩张。
容器技术也是搭建企业PaaS平台以及新一代私有云最核心的技术,当前流行的Kubernetes和Mesos,其底层都是以容器技术为基础搭建的,而且越来越多的企业正基于Docker和Kubernetes来改造或新建自己新一代的PaaS平台。
容器技术正在加速侵入IT的各个领域,并且影响和改变着整个生态圈,软件的设计理念、软件生命周期流程都因为容器技术的引入而发生革命性的变革。因此,可以毫不夸张地说,容器技术正在改变整个世界。