容器技术的背景
容器的本意是帮助我们更快地
将应用
进行标准化
地部署
。
应用程序生命周期管理形态的演化
一个标准的商用软件生命周期应该包含
源码开发
、编译
、测试
、打包
、安装
、升级
、备份
、回滚
、运行
、监控
、卸载
。
1. 物理机时代
我们的应用程序,本来想让所有的机器上都能跑,这就造成了这个时代的特点是:
成本高
物理服务器配置都不低,而且伴之程序设计、测试、实施、运维
的成本呈倍数增长。
-
部署慢
需要对系统进行安装、环境检测、安装各种各样的组件、运行配置。比如运行期tomcat
就必须安装jvm
,要运行.net
程序就必须运行.net runtime
等。 -
资源浪费
应用程序对资源的需求是不平衡的,比如一些是计算密集型
、存储密集型
、网络IO密集型
等等,在这种情况下,闲置资源
并没有得到充分利用。 -
难于扩展与迁移
物理机在横向扩展是比较麻烦的事,如果是内存不够
就需要停机增加内存
。如果遇到主机迁移,想将windows向linux迁移
的时候就比较麻烦。
2. 虚拟化时代
物理机时代所带来的问题,就产生了虚拟化技术。通过硬件底层虚拟化支持
,来运行多个虚拟机。虚拟化技术出现后可以让我们的硬件资源得到更充分的利用。
这个时代的特点有:
-
多部署
每个虚拟机
都像是一台独立的主机
,每台虚拟机都是相互隔离的,都有自己硬件资源
和软件资源
,比如CPU、内存、硬盘、网卡
,同时也要有对应的操作系统
和应用程序
。任何一台虚拟机的故障都不会对其他虚拟机的造成影响。 -
资源池
我们把硬件资源
看成一个池子,这个池子里的资源可以被共享
。主机上会安装主操作系统,并安装hypervisor
,hypervisor提供主机资源分配
和虚拟机管理
的工作。
常见的hypervisor
有Hyper-V(Windows)
、KVM(Linux 内核)
、VMware
、Virtual Box
。 -
资源隔离
hypervisor为虚拟机分配的资源是独享的。 -
易于扩展
如果内存不够,则通过hypervisor命令去调整即可,这个过程是动态完成的,不需要像物理机一样停机增加内存等。 -
统一目标平台
我们的应用程序可以选定一个目标操作系统平台,这样应用程序生命周期
就只需要一份配套成本即可。 -
操作系统资源浪费
虚拟技术的缺点也明显,每台虚拟机都需要安装操作系统。比如我们是一个很小的几百K
的应用,却需要运行庞大的操作系统来支持。目前再小的操作系统也要几百M
,同时占用的硬件资源要比微小的应用程序要多的多。 -
硬件信息抽象不统一或虚假
某些商业软件需要限制运行
在具体的硬件
上时,需要对真实的硬件特征
进行获取,这时可能获取失败或者是伪造的。
3. 容器化时代
针对虚拟化技术带来的问题,如果我们借助虚拟化技术的设计,把虚拟机的操作系统剥离出来,只按照应用程序,那么虚拟化技术的缺点是不是得到解决了?于是,容器化时代到来了!
-
灵活小巧
容器没有内置操作系统,是轻量级的,所以尺寸都非常的小。大部分是兆字节(1兆字节 = 1MB)大小的。 -
部署快
尺寸小可以加快程序分发、迁移的速度,目标平台统一的同时可以统一部署标准。 -
占用资源小
没有内置操作系统,也就不需要额外的操作系统资源,我们的应用程序只需要在容器内安装即可。 -
启停快
容器属于应用层面虚拟化,可以立即启停
,虚拟机需要启动Guest OS再运行应用程序。 -
应用层面隔离
应用程序出现的问题不会对其他应用造成影响。 -
物理资源共享
容器化只是应用层面的隔离,物理资源是共享的,物理资源出现问题会相互影响。
因此,容器化和虚拟化解决的问题不一样,两者会长期存在~!
容器解决什么问题?
由于容器化技术的出现,让我们的应用程序研发的协同产生了巨大的变化。
真实场景:项目开发完了,准备上线。作为开发工程师要把
应用打包
、数据库导出数据
、以及各种参数配置文件
整理在一起。然后交给运维同事,运维同事再根据各种各样的安装配置文档,把每一个节点、每一个数据导入进去。但是中间有一个数据可能产生问题
,就会导致我们整体的部署失败或者无法按照预期运行
。
容器化的技术可以让开发人员把所做好的所有东西,把所有的资源打包成一个文件
,这个文件可以方便的发布
到运维同事,由运维同事展开后立即进行还原
。就可以完成一个标准化的应用部署
。这个文件
就是容器镜像
!
运维同时带来极大便利。如果公司采购了一百台服务器,通过容器编排工具很方便的发布标准应用。容器编排工具往往提供集群管理能力
。如果其中一个容器故障
了,还可以自动重新发布
容器。
容器化技术的应用场景
标准化的迁移方式
,我们把应用需要的资源一起打包成一个文件,比如静态网站文件、数据库以及其他相关资源等,部署时自动将文件展开便可以得到一个与之前完全相同运行环境。统一的参数配置
,与应用程序相关的各种配置参数在打包的时候也进行了设置,非常方便我们对参数的统一管理。自动化部署
,进行镜像还原的过程是自动的,无需人为参与。应用集群监控
,可以帮助我们实时了解到集群情况。开发与运维之间的沟通桥梁
,正式因为提供了标准化的迁移方式,让开发和运维不会因为各种环境安装问题而苦恼。
阿里/腾讯云的容器化应用
阿里云和腾讯云是采用了虚拟化技术和容器化技术结合的方案。
我们在阿里云买的EC2服务器就是一台虚拟机,虚拟机上再安装容器。除此之外我们也可以用自行搭建私有云。