容器(Container)技术的本质是在一个服务器上只运行一个操作系统,每次部署一个新的软件不用重新启动操作系统,只剩下软件本身的启动时间。容器技术和虚拟机的区别如图3。
图3 虚拟机与容器的对比
虚拟机和容器的区别如下:
1.从架构角度看,每一个虚拟机中启动的是完整的操作系统,各个虚拟机可以使用不同的Linux内核,即图10- 3中左侧的“Guest OS”的含义。而每一个容器只是一个文件系统(即应用程序 + 依赖的库文件),所有容器都使用相同的Linux内核,也就是图10- 3中右侧的“Host OS”。
Linux操作系统由几千个软件包组成,其中有一个最重要的软件,承担了操作系统最核心的功能,即课本上所讲的进程管理、内存管理、文件管理、外设管理功能,这个软件包就叫做内核。除了内核之外的其它软件总称为“文件系统”,像日常使用的所有命令行工具(ls、cd、mkdir等)都属于文件系统中的软件,另外还有图形桌面环境、Web服务器、办公软件也都属于文件系统。
按照严格的操作系统定义,只有内核实现了操作系统本身的核心功能,其它所有的软件都是属于“应用软件”。所以,图中的Host OS、Guest OS实际上都是指Linux内核。
2.从运行角度看,每一次虚拟机的启动过程都包括内核(Guest OS)加上应用程序的启动时间,因此往往要有几分钟;而每一个容器的启动过程不包含内核的启动时间,只有应用程序的启动时间,所以最短只需要几秒钟就可以启动一个容器。
3.从资源角度看,容器不需要重新分配内核资源,从而比虚拟机节省了CPU和内存。一台主流的服务器运行的虚拟机数量一般不超过几十个,而运行容器则很容易突破上千个。在这个意义上,容器又被称为“轻量级虚拟机”(Light-weighted Virtual Machine)。
使用容器部署应用程序的架构如图4所示。
图4 容器的部署方式
在一台服务器上,只需要安装一个本地操作系统(例如CentOS 7),启动多个容器,在一个容器内安装任意版本的基础软件和应用软件。容器为应用程序提供隔离机制,每个容器中的应用程序只能访问本容器内部的文件系统,即使一个容器的应用程序把文件写出错误,其它容器不受任何影响。
容器的轻量级优点适应了云平台的发展需求,主流云平台在近几年都开始对容器技术进行支持。
由于上述优点,容器技术从产生到现在一直很火爆,大有全面取代虚拟机的势头。在Linux领域中,虚拟机技术的代表软件是KVM,容器技术的代表软件是Docker。
图5 Docker形象标识
既然容器有诸多优点,是否以KVM为代表的虚拟机技术会在将来消亡?有以下两个原因会使KVM继续保持一定的生命力:
1.如果要部署使用不同内核的应用程序,只能使用虚拟机。由于容器在结构上不包含内核,所有容器只能共享使用相同的本地内核,这已经能满足大多数场合,但是如果应用程序依赖于不同的内核版本,那么只能使用虚拟机技术。还有一种典型场景是用于开发内核,假设一个程序员对标准Linux内核进行了修改,例如添加了新功能或者修正了一个Bug,想快速的运行调试新内核,那么无疑是不能使用容器技术的,只能使用虚拟机技术。
2.已经使用虚拟机的云平台,还需要继续维护。如果云平台已经运行了大量的应用系统,改造成容器技术需要较大工作量,从企业利益出发有可能会考虑以虚拟机方式长久的运行下去,而对于新部署的应用系统则放到容器平台上。
鉴于上述原因,KVM虚拟机和Docker容器都是实现云平台的基础技术,Docker更具有天生优势,从商业份额上看,Docker的占用率呈现出逐年增长的趋势。
从技术原理上,Docker天生具有“轻量”的优势,因此更容易发挥服务器物理主的性能。图6是对Docker和KVM进行的比较,可以看到Docker在各方面的性能上全面超越KVM。
图6 Docker全面优于KVM
现在的很多的云平台,例如阿里云、华为云,都是同时提供虚拟机、容器两种选择,用户根据自己的需要租用适合的平台。
龙芯从几年前开始就完善支持Docker方案,KVM也已经在2019年4月正式发布。用户可以针对应用场景选择Docker或者KVM中的一种,两者都可以完善的支撑公有云或者私有云平台。在绝大多数云平台中,Docker已经足够取代KVM。
[1] 《龙芯应用开发标准教程》第10章“奔向云端:Docker虚拟机”,2018年12月,人民邮电出版社
[2] Docker官网,https://www.
[3] 阿里云容器服务平台,https://www.aliyun.com/product/containerservice
[4] Docker与KVM之间的区别,https://blog.csdn.net/wzyzzu/article/details/67644316