发布于 2016-05-28 00:23:58 | 124 次阅读 | 评论: 0 | 来源: InfoQ
Docker 开源应用容器引擎
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
“很多时候,我们面临未来的预测和期望,其实很多答案已经存在在历史中。”
“没有集装箱,就不会有全球化。”《经济学家》这个评论可以说是对于这个普通的箱子的历史性地位的一个总结。1956年4月26日,当集装箱之父麦克莱恩第一次将集装箱这种方式用于货物运输时,他肯定想像不到他的这个看似普通的发明,会对这个世界的影响如此深远。因为如果把全球经济比作一个高速运转的复杂的机器,那么以集装箱为核心的现代运输体系就是带动这台机器高速运转的齿轮和传送带。
这只普通的箱子,技术含量不高,也并不复杂。和其他很多伟大的发明一样,它的发展也是历经坎坷。集装箱的概念在20世纪二三十年代就出现了,但是直到1957年,才由麦克莱恩开始运用于大规模的货物运输。在之后,经历了码头工人的抵制,标准化之争,直到20世纪70年代中后期才大规模流行开来,但是一旦它开始普及,就立刻掀起了一股巨大的变革性的浪潮。站在浪潮之巅的国家和港口,快速地崛起。而落后于浪潮的人和物,被时代快速地抛弃。无数国家的命运因此而改变。整个世界的生产体系被重构。它带来了商品生产的地域分布的改变、协助方式的改变、分工的改变。不仅仅影响整个行业,更影响了我们每一个人的生活。
很多时候,我们面临未来的预测和期望,其实很多答案已经存在在历史中。对于传统行业如此,对于高速发展的IT行业,更是如此。在IT的世界里,是否已经出现了这样一只改变它的“箱子”呢?
Docker,顾名思义,是码头工人的意思。它从诞生起,就和集装箱的思想有着千丝万缕的联系。Docker的发展历史,其实很像集装箱早期的发展史。和传统的集装箱萌芽一样,Container(容器)技术其实早在多年前就出现了。从2005年的Solaris Containers到2008年LXC 0.1版本的推出。再到后来的Google推出开源的容器管理工具lmctfy。也将近经历了10年的发展。直到2013年,Docker的出现。才代表着容器技术一个新的时代的来临。
很多人将Docker等同于Container,其实这是不对的。就像传统的集装箱运输体系一样,集装箱只是其中一个最核心的部件,用它来代表整个以集装箱为核心的运输体系。那么Docker其实就是以容器为核心的IT交付与运行体系。它包括了Docker Engine(容器的运行管理),Docker Registry(容器的分发管理),以及相关的一系列的API接口。包括后来发展起来的Docker Machine,Swarm,Compose。 所以可以看做是一套以容器为核心的创建、分发和运行的标准化体系。
如果把Container比作是传统领域的集装箱,那么承载集装箱的港口就可以看做是云的服务商,集装箱的拖船可以看做是云服务所提供的IaaS服务。Docker公司弄出的Docker Machine之类的可以看做是一种集装箱的吊装设备。当然,作为一套推动全球经济快速运转的航运体系,不仅仅只有这些,还有无数的基础设施,包括高速公路,集装箱的拖车,将货物装入集装箱的叉车,搬运工人。另外,还有一套软的设施,包括各类的标准,集装箱的交付流程。所有的这些,我们都可以从IT世界里面的看到他们的身影。
所以说,Docker是一套以容器技术为核心的思想和一套标准化体系。它不是一个技术,也不是一个公司。Docker不等同于现在的Docker公司,和它的发展和兴衰没有必然的关系。
Docker会是改变IT世界的那只”箱子“吗?下这个结论还有点早,但是我们可以从传统的以集装箱为核心的航运体系的发展史来预测一下它的未来。首先,来看看现代航运体系中,最核心的那个东西,也就是集装箱,它是什么时候发明的?其实在上世纪20年代就已经在使用了。但是为什么一直到上世纪70年代才开始流行开来。因为那个时候,集装箱仅仅是一个工具,仅仅是防止损坏和被盗。它没有融入到全社会的协作体系中。1956年,集装箱之父麦克莱恩,第一次将它用到大规模的货物运输,这个时候,它才由一个单纯的工具,开始发展成一种新的观念和体系,才开始逐渐融入到全产业链条的运转中去。到上世纪70年代中期,各种专用的集装箱港口、拖船、吊装设备开始普及和完善,这才代表一个新的时代的开始。以集装箱为核心的现代航运体系,开始取代了旧式的货运体系。
我们再来看看Docker的发展历史。容器技术其实早在10多年前就出现了,但是为什么很少人知道它?因为那个时候,它仅仅只是一个虚拟化的技术,只是从一个角度解决了Run的问题,没有看出相比KVM、XEM有太多的优势。2013年,Docker的出现是一个标志性的节点。它首次提出了Build、Ship、Run的概念,将容器技术向IT产业链条的上游和下游进行了延伸。从软件的使用领域,延伸到了软件的生产领域,以及软件的发布领域。同时借助于容器技术,打通了DevOps,极大提高了软件领域的生产率。但是,相比传统集装箱的坎坷道路,它还有很多路要走。全产业界已经接受了以容器镜像为主要形态的软件发布模式了吗?应用的执行都基于容器了吗?分布式以及微服务架构已经非常普及了吗?显然没有。
Docker刚开始出现时,很多人觉得它和Java很像,所谓的一次构建,随处执行。但是Docker和Java其实有本质性的区别的,Java只是解决了执行环境的兼容性的问题,或者说它只觉得了Run的问题,并没有把这个技术延伸到IT产业链条的各个环节中,所以注定它只是一个重要的技术,而不能成为改变世界的创新。
集装箱也好,容器也罢,当我们思考,什么样的技术,才是一种颠覆性的技术时,一般从下面几个维度去思考:
它是否带来整个产业生产力的大幅度提升?
它是否融入到了整个产业的价值链条中去了?
整个产业是否围绕它进行分工和协作?
Docker是否是一种改变未来IT产业的颠覆式创新?这里我大胆地给出肯定的答案,至少,从集装箱的发展史,看到了它未来的样子。
集装箱航运的发展史,就是一部产业兴衰史。在这个链条的无数的人和物的命运都被改变。有的国家、有的港口因此快速崛起。而有的则被时代所抛弃。它消灭了很多传统的工作岗位,同时也带来了很多新兴的职业。中国这样的发展中国家,因此能够快速融入到全球的协作体系中去,实现了自己的快速崛起。Docker未来会对IT产业带来哪些改变呢?这个问题,的确值得所有人深思。
传统的IT产业,大部分是以项目的方式来运行。客户招标,软件系统的开发商和集成商负责开发。当完成客户的需求以后,搭建系统进行测试,最后部署到客户的执行环境。这期间还需要负责系统的调试,费时费力,如果有新的模块时,还需要重新的部署、调试。系统的开发者、运营者、客户之间,无法划分一条清晰的界限。这很像传统的航运业里面,客户需要自己把一件一件货物搬到轮船上,费时费力。这种模式注定了无法进行大规模的分工协作,所有的模块需要全部集中在一家大的公司进行开发。应为协作的方式,导致的沟通成本太高。
如果未来,所有的系统,全部是以容器镜像的方式去发布,任何云的服务商都可以去执行这些计算负载。很多不同的模块完全可以外包到世界各地的团队去完成,只要模块之间以微服务的方式,定义清晰的接口。完成开发后,push到统一的镜像仓库。软件系统的运营者,从仓库pull到镜像,放到任何的云的系统去执行。所有的团队之间,都有统一的交付界面。大大降低了协作成本。所带来的直接好处是,扫除了软件众包的方式的最大障碍。软件众包会成功一个非常流行的IT生产方式。
集装箱航运史上,码头工人是个非常悲剧的角色、一开始,抵制集装箱,认为会大大减少他们的工作机会,到后面,当浪潮来临,其实是无法抵挡的。整个的职业基本上就消亡了。大家现在在码头上,肯定看不到那种扛货物的码头工人的。但是并不是人消亡了,而是职业消亡了,取而代之的是各类的吊装设备的操作工人、集装箱的调度管理人员。
Docker的英文意思就是“码头工人”,其寓意就是Docker这种东西,取代了码头工人的传统工作,是机器的延伸。传统运维,如果仅仅是安装软件、配置系统、备份拷贝文件、部署和发布,如果所有的系统都是容器镜像的方式去发布,所有的计算负载都是在云上面去执行,就像传统的码头工人一样,消亡是必然的。当DevOps真正实现后,开发和运维,其实界限越来越模糊了。人更多的是从事更有创造力的工作。
Apple Store,带来了2C领域软件开发新的商业模式。那么企业应用市场会有怎样的创新呢?如果所有的软件系统,全部是以容器镜像的方式发布。那么企业应用市场将是一个非常重要的入口。相比于2C领域,企业应用市场还是有一些不同点。未来,会呈现两种模式。一种是公有的企业应用市场。另一种是私有的企业应用市场。中小型公司,或者比较传统企业,会倾向于从公有的企业应用市场获取软件服务。而比较大型的公司,会倾向于建设自己的企业应用市场。不管是哪种模式,必然会带来,IT生产领域的分工的细化和全球化。就像目前iPhone手机上的APP所走得道路一样。
建立在传统IT模式下的云服务商,主要依赖的绑定用户建立竞争壁垒。Docker技术会弥合各个云之间的鸿沟,计算负载可以在各个云的服务商之间自由流动。此时传统的竞争壁垒不复存在了。从集装箱航运的历史看,云计算的服务商,好比是传统集装箱运输体系中的港口。伦敦港的迅速衰落,而荷兰的鹿特丹的快速崛起。为我们提供很好的历史经验。最快速地拥抱这种变革的港口,会快速地崛起,而传统利益之间艰难抉择的港口,会很快被时代抛弃。当计算可以自由流动时,更好的开放的姿态接纳这种流动,更快速地规模扩张,降低单位计算的成本,是在未来云计算竞争中胜出的关键因素。
云计算的厂商当前要做的不是设置障碍,阻止计算的流动,也不是推出自己特有的容器的服务,去充当航运公司。因为这不会获取任何的竞争优势。反而是要积极参与Docker“航运”基础设施的建设。标准的制定,有更好的“集装箱堆场”(镜像仓库),兼容各种集装箱拖船的吊装设备,让自己的航船更经济,有效的运输各个航运公司的集装箱。
Docker发展的现阶段,很像集装箱刚开始用于航运的最初的那几年。整个产业链条尚不完善。价格并不比传统货运更有优势。客户大部分处于观望状态。所以出现了不同的道路的分歧。总结起来,有下面三种道路。
基于Docker在安全和隔离性上面存在的一些问题,以及用户对传统机器根生地固的使用习惯(容器当虚拟机在使用),有一种声音是容器应该网IaaS层发展,去取代传统的虚拟机,然后再通过Docker这样一套体系去管理起来。我觉得未来可能不是这个方向,因为传统的IaaS层已经非常成熟了,传统的虚拟化技术,也没用遇到很大问题,Docker再去解决计算、网络、存储的问题,是重复性的工作,是为了技术而技术,并不会对产业生态带来任何的好处。这非常像传统航运体系中,曾经在一个特殊时期,发展起来的一种特殊的模式,就是用拖船运送带集装箱的卡车。集装箱,不需要长出轮子。已经从历史经验去证明了。
传统的PaaS的确遇到了很大的问题,容器技术往上走,去替代传统PaaS也是必然的趋势之一。但是,我觉得这只是副产品,Docker主要的变革,并不是去改变PaaS。未来IaaS、PaaS、SaaS之间的界限越来越模糊。有可能是一个新的名词,譬如CaaS(Container As A Service)。计算单元都是以容器为单位。上世纪60年代,越战期间,以集装箱为单位运送战略物资时,美军提出了一个著名的3C原则,也就是一个集装箱,只运送一种货物,一个目的地。这个原则,同样适用于容器,也就是Docker公司提出的一个主要原则:一个进程,只跑在一个容器里面。所以,集装箱就是最基础的计算单元。
现阶段,公有云上搭建Docker系统,的确鲜有比较成熟的商用案例。因为要实现稳定的商用环境,一方面需要Docker技术,特别是网络技术的不断成熟。另外一方面,也需要公有云的IaaS层专门针对容器服务的深度融合。现阶段公有云上跑容器服务,就和上世纪50年代,用老式货船运输集装箱业务。反而是私有云领域,得到了较为广泛的应用,国内大的互联网公司,纷纷在自己的私有云中实践Docker。但是大部分依然是比较传统的使用方法,也就是将容器当虚拟机用,利用Docker的Build和Ship的体系,实现自己的DevOps。私有云的容器服务,只是特定时期的特定现象。长远看,公有云逐步取代私有云是必然趋势。随着Docker技术的越来越成熟,分布式以及微服务架构的应用越来越广泛,私有云容器服务会成为历史。
Docker的未来在哪里呢?其实很难预测未来的方式。但是在IT产业界,两个原则是永远不变的。
简单的东西,永远是最有生命力的。
客户永远只会关注他的业务,不会关心除此之外的任何东西。
Docker只要不停地让客户使用或者维护IT系统越来越简单,永远只需要关心自己的业务,而不必费心其他的东西。我相信这就是它未来的方向。
麦克莱恩发明了集装箱,并且在此基础上,建立了一个庞大的商业帝国。但是,很可惜,在上世纪80年代却破产了,其实他并没有犯什么大的错误,就是跑慢了。当一股浪潮来临时,只有在浪尖上的一群人,才能迸射出绚丽的浪花。落后于浪潮的人,则很快被新的浪花所掩盖。2001年,当这个老人逝世时,全世界所有的集装箱货船同一时刻拉响了汽笛。给予这位老人已最崇高的敬意。
若干年后,或许Docker公司已不存在,但是它所带来的思想,会流传更久的时间。我们同样期待看到业界对它以及那群天才所创造的一切,致以相同的敬意。