这事儿还得从上世纪60年代以前说起。。.。。.
那时,集装箱运输还未被认可,几乎所有的货物都是以散件方式运输。
以“勇士号”为例,在一次从布鲁克林到不来梅的运输中,货物装卸都是由普通的码头工人来完成的,它装载了5015英吨的货物,主要是食品、日用品、邮件、机器和车辆的零部件以及53辆车。这批货物的数量达到了惊人的194582件,而且大小和种类各不相同。
所有的货物都是码头工人一件一件放到货盘上,再把货盘降到船舱中一件一件搬下来堆好。他们装完这艘船总共用了6天时间;横跨大西洋的航行用了10天半的时间;在不来梅港,码头工人是昼夜不停地干活儿,他们卸船用了4天时间。
总而言之,这次航行有一半时间都花在码头上了。
为什么非要装载、卸载、转移和再装载那么多的散件货物?为什么不把货物装进大箱子里,然后就只装卸和搬运这些箱子?
集装箱便由此诞生了。
运输业大量采用集装箱后,由咖啡制造商发出的一只35吨的集装箱,可以在马来西亚离开工厂,装上一艘货轮,经过16天的航行到达9000营里之外的洛杉矶。一天之后,这个集装箱被一列火车运到芝加哥,并被随机转移到了一辆开往辛辛那提的卡车上。从离开马来西亚的工厂到抵达俄亥俄州的仓库,这次11000营里的行程可能只需要花费22天的时间,其速度是每天500英里,而费用比一张单程的头等舱机票还低。另外,在这一路上,很可能没有人碰过集装箱里的东西,甚至根本没有人打开过它。同传统的货轮相比,集装箱船的装卸只需要大约1/6的时间和1/3的劳动力。
今天我们要讲的“容器技术”的思想正是来源于此。
集装箱解决了什么问题?在一艘大船上,各种类型的货物,小到奶粉、化妆品,大到机器设备、跑车,都可以被装箱到一个标准的集装箱内。托运货物的人只需要保证货物在集装箱内的密封和固定,而无需关心集装箱如何被摆放和运输。
负责运输的人则无需关心一个个集装箱内装的不同货物,只需把集装箱当做一个封闭、无差别的独立个体,进行装载、卸货、堆放、运输,整个过程中集装箱保持封闭状态直到被运送到目的地。从轮船到火车,再到卡车运输,都可以利用起重机(吊车)对集装箱进行操作,实现流程的自动化,从而以非常廉价的方式,有效解决了不同类型货物在长距离运输中的问题。
类似于集装箱,容器技术的诞生给开发人员带来了诸多方便,节约了不少成本,不管是在运维还是开发上。
容器技术的诞生史
在很久很久以前,想要在线上服务器部署一个应用,首先需要购买一个物理服务器,在服务器安装一个操作系统,然后安装好应用所需要的各种依赖环境,最后才可以进行应用的部署,而且一台服务器只能部署一个应用。
这就造成了以下几个明显问题:
●部署应用非常慢
●需要花费的成本非常高
●而且容易造成资源的浪费,因为往往一个应用使用不了一个服务器的资源
●难于迁移和扩展
●迁移问题:要把应用进行迁移,又得重复部署应用的过程:买服务器 -》 安装os -》 配置环境 -》 部署应用
●扩展问题:只能购买新的硬件来升级物理服务器,或者购买更高性能的服务器,这就又涉及到迁移问题了
●可能会被限定硬件厂商,因为那时候有不同硬件平台
虚拟化技术出现以后,对于这种问题有所改变,虚拟化技术会在本地操作系统之上加多一层 Hypervisor层。Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可以虚拟化硬件资源,例如cpu、硬盘、内存资源等。然后我们可以基于通过虚拟化出来的资源之上安装操作系统,这也就是所谓的虚拟机。
通过Hypervisor层,我们可以创建不同的虚拟机,并且可以限定每个虚拟机的物理资源,并且每个虚拟机都是分离、独立的。例如A虚拟机给它使用2个cpu、8g内存、100g磁盘,B虚拟机给它使用4个cpu、16g内存、300g磁盘等等。。.。。.这样就可以实现物理资源利用率的最大化。
如此一来:
●一台物理机就可以部署多个应用
●每个应用都可以独立运行在一个虚拟机里
虚拟化技术的优点:
●资源池——一个物理机的资源分配到了不同的虚拟机里
●很容易扩展——增加物理机或者虚拟机即可,因为虚拟机是可以复制的
●很容易云化——亚马孙AWS,阿里云,谷歌云等
然而,随着时间推移,用户发现hypervisor这种方式麻烦越来越多。
为什么?因为对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布我都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。
基于上述情况,人们就在想,有没有其他什么方式能让人更加的关注应用程序本身,底层多余的操作系统和环境我可以共享和复用?换句话来说,那就是我部署一个服务运行好后,我再想移植到另外一个地方,可以不用再安装一套操作系统和依赖环境。
Linux Container容器技术的诞生(2008年)就解决了IT世界里“集装箱运输”的问题。Linux Container(简称LXC)它是一种内核轻量级的操作系统层虚拟化技术。
Linux Container主要由Namespace和Cgroup两大机制来保证实现。
刚才我们上文中提到了集装箱,集装箱的作用当然是可以对货物进行打包隔离了,不让A公司的货跟B公司的货混在一起,不然卸货就分不清楚了。那么Namespace也是一样的作用,做隔离。
光有隔离还没用,我们还需要对货物进行资源的管理。同样的,航运码头也有这样的管理机制:货物用什么样规格大小的集装箱,货物用多少个集装箱,货物哪些优先运走,遇到极端天气怎么暂停运输服务怎么改航道等等。。.。。通用的,与此对应的Cgroup就负责资源管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等。
下图展示了容器技术的演变,当前,docker几乎是容器的代名词。
为什么容器技术对物联网和云计算如此重要?
说了这么多,我们不妨来总结一下容器技术的特点:
1.资源独立、隔离
Docker通过Linux Namespace、Cgroup限制了硬件资源与软件运行环境,与宿主机上的其他应用实现了隔离,做到了互不影响。不同应用或服务以“集装箱”(container)为单位装“船”或卸“船”,“集装箱船”(运行container的宿主机或集群 )上,数千数万个“集装箱”排列整齐,不同公司、不同种类的“货物”(运行应用所需的程序、组件、运行环境、依赖)保持独立。
这恰好也是云计算平台的最基本需求。
2.环境的一致性
开发工程师完成应用开发后build一个docker image,基于这个image创建的container像是一个集装箱,里面打包了各种“散件货物”(运行应用所需的程序、组件、运行环境、依赖)。无论这个集装箱在哪里:开发环境、测试环境、生产环境,都可以确保集装箱里面的“货物”种类与个数完全相同,软件包不会在测试环境缺失,环境变量不会在生产环境忘记配置,开发环境与生产环境不会因为安装了不同版本的依赖导致应用运行异常。这样的一致性得益于“发货”(build docker image)时已经密封到”集装箱“中,而每一个环节都是在运输这个完整的、不需要拆分合并的”集装箱“。
3.轻量化
传统的虚拟机通过硬件虚拟化创造一个虚拟的系统,每个虚拟机都有自己的内存、硬盘和操作系统,预分配的资源会被虚拟机完全占用。使用虚拟机来隔离应用会造成比较大的资源浪费,一个应用加上依赖只有几十到几百M的大小,而操作系统往往还需要消耗10G左右容量。
图:容器技术和虚拟机的对比
上图展示了容器技术和虚拟机的区别。容器包含了应用和所需的依赖,但不需要独占资源,没有一个虚拟系统,而是和宿主机共享硬件资源和操作系统,和其他容器共享内核,从而实现资源的动态分配。多个容器在同一个宿主机操作系统中的用户空间以独立的进程运行。因此,容器相比虚拟机要轻量许多,在一个主机上可以同时启动近百个容器,一个应用要在数量上横向扩展非常便捷,而虚拟机则几乎不可能启动同样多的数量。对于重启操作,容器近似于重启一个进程,而虚拟机则相当于重启操作系统。
4.Build Once, Run Everywhere
“货物”(应用)在“汽车”,“火车”,“轮船”(私有云、公有云等服务)之间迁移交换时,只需要迁移符合标准规格和装卸方式的“集装箱”(docker container),削减了耗时费力的人工“装卸”(上线、下线应用),带来的是巨大的时间人力成本节约,这使未来仅有少数几个运维人员运维超大规模装载线上应用的容器集群成本可能。
看到这里,有没有觉得非常眼熟?
近几年大热的物联网平台,宣传的不也就是这些点吗?
物联网平台商往往会这么告诉你:在我们的平台上提供了多种多样的开发工具,你可以使用拖拽式的手法开发程序,完全不用操心底层的操作系统和所依赖的环境,只需专注于客户的需求和应用程序本身。。.。。.
就像OpenStack、Cloudstack这样的技术是解决IaaS层的问题,容器技术的诞生其实主要解决了PaaS层的技术实现。
现在最常用的开源云平台架构Kubernetes、Cloud Foundary还是Serverless,其背后驱动都是容器技术。而市面上多达上百家的物联网平台,几乎都是PaaS平台。
图:2015-2017年物联网平台企业数量
图:各XaaS中用户管理和平台功能的划分
说到这里,大家可能就会充分理解容器技术的重要性了。
容器技术为软件开发和系统运维带来了颠覆性的突破,而随着容器技术的普及,系统开发和管理的效率必将上升到一个新的台阶,从而为企业带来不可估量的效益。
评论
查看更多