容器技术是这两年热门的话题,因为容器技术给我们带来了很多方便的地方,节约了不少成本,不管是在运维还是开发上。我们都知道开发与运维的环境都比较复杂,而且开发还分前后端以及测试等,运维环境则是基于服务器、交换机或者在云上的,这就导致了开发环境和线上环境的差异。所以开发环境与运维环境之间无法达到很好的桥接,在部署上线应用时,依旧需要花时间去处理环境不兼容的问题。
而容器技术正是解决了这种环境不一致的问题:容器可以帮我们把开发环境及应用整个打包带走,打包好的容器可以在任何的环境下运行,这样就可以解决开发与运维环境不一致的问题了,所以:
容器解决了开发和运维之间的矛盾
在开发和运维之间搭建了一个桥梁,是实现devops的最佳解决方案
以上只是描述是容器解决了什么问题,但是还没有说明什么是容器,不过其实简单几句话就可以说明容器了:
对软件和其依赖环境的标准化打包
应用之间相互隔离
共享一个OS Kernel
可以运行在很多主流操作系统上
容器技术作为诞生于云计算时代的一种新技术理念,近年来颇受业内追捧,主要是因为容器技术可以让应用和基础设施的部署变得更加快速,从而使企业能够用较低的技术成本享受到云的弹性和灵活性。
容器技术的特点如下:
资源独立、隔离Docker通过Linux Namespace、Cgroup限制了硬件资源与软件运行环境,与宿主机上的其他应用实现了隔离,做到了互不影响。不同应用或服务以“集装箱”(container)为单位装“船”或卸“船”,“集装箱船”(运行container的宿主机或集群 )上,数千数万个“集装箱”排列整齐,不同公司、不同种类的“货物”(运行应用所需的程序、组件、运行环境、依赖)保持独立。这恰好也是云计算平台的最基本需求。
环境的一致性
开发工程师完成应用开发后build一个docker image,基于这个image创建的container像是一个集装箱,里面打包了各种“散件货物”(运行应用所需的程序、组件、运行环境、依赖)。无论这个集装箱在哪里:开发环境、测试环境、生产环境,都可以确保集装箱里面的“货物”种类与个数完全相同,软件包不会在测试环境缺失,环境变量不会在生产环境忘记配置,开发环境与生产环境不会因为安装了不同版本的依赖导致应用运行异常。这样的一致性得益于“发货”时已经密封到”集装箱“中,而每一个环节都是在运输这个完整的、不需要拆分合并的”集装箱“。
轻量化
传统的虚拟机通过硬件虚拟化创造一个虚拟的系统,每个虚拟机都有自己的内存、硬盘和操作系统,预分配的资源会被虚拟机完全占用。使用虚拟机来隔离应用会造成比较大的资源浪费,一个应用加上依赖只有几十到几百M的大小,而操作系统往往还需要消耗10G左右容量。
容器包含了应用和所需的依赖,但不需要独占资源,没有一个虚拟系统,而是和宿主机共享硬件资源和操作系统,和其他容器共享内核,从而实现资源的动态分配。多个容器在同一个宿主机操作系统中的用户空间以独立的进程运行。因此,容器相比虚拟机要轻量许多,在一个主机上可以同时启动近百个容器,一个应用要在数量上横向扩展非常便捷,而虚拟机则几乎不可能启动同样多的数量。对于重启操作,容器近似于重启一个进程,而虚拟机则相当于重启操作系统。
Build Once, Run Everywhere
“货物”(应用)在“汽车”,“火车”,“轮船”(私有云、公有云等服务)之间迁移交换时,只需要迁移符合标准规格和装卸方式的“集装箱”(docker container),削减了耗时费力的人工“装卸”(上线、下线应用),带来的是巨大的时间人力成本节约,这使未来仅有少数几个运维人员运维超大规模装载线上应用的容器集群成本可能。
看到这里,有没有觉得非常眼熟?近几年大热的物联网平台,宣传的不也就是这些点吗?物联网平台商往往会这么告诉你:在我们的平台上提供了多种多样的开发工具,你可以使用拖拽式的手法开发程序,完全不用操心底层的操作系统和所依赖的环境,只需专注于客户的需求和应用程序本身。就像OpenStack、Cloudstack这样的技术是解决IaaS层的问题,容器技术的诞生其实主要解决了PaaS层的技术实现。
现在最常用的开源云平台架构Kubernetes、Cloud Foundary还是Serverless,其背后驱动都是容器技术。而市面上多达上百家的物联网平台,几乎都是PaaS平台。说到这里,大家可能就会充分理解容器技术的重要性了。
容器技术为软件开发和系统运维带来了颠覆性的突破,而随着容器技术的普及,系统开发和管理的效率必将上升到一个新的台阶,从而为企业带来不可估量的效益。