前面介绍了。因为虚拟机中Guest OS开销太大,会造成隔离的虚机越多资源被浪费的就越多的情况出现。所以有人就会想,可不可以不启动Guest OS,而是直接使用Host OS来模拟一个相对完整的操作系统呢。这样就不需要再在Host OS上跑Guest OS,按照这个思路,逐渐发展出来了操作系统级的虚拟化技术,就是利用操作系统本身的功能来实现虚拟化,这就是Container技术 。结构如下图(以Docker为例):

Container结构

Container技术及其历史

Container技术也可以在完整伺服器上隔离出多个完整的小的资源格子出来,且互相之间资源是隔离的。但它利用的是操作系统本身的功能,所以在每个小格里面不需要再去运行Guest Os 了,这部分资源的开销就被省下来了,尽可能把资源提供出来供实际的应用使用 。

虽然Container技术提供了这样的功能,但是Container技术在被发明的很长时间内都没有得到广泛的应用。原因在于:虽然它提供了这样的功能,但是应用所需环境千差万别,相对完整的操作系统环境要怎么定义呢,这个环境要配成什么样才能算是完整的环境

如上图中所示,如果虚拟化出三个小格子,且其中运行不同的应用,前两个应用使用Python2.7,第三个用的是python3.0,每个Container所需要的环境不一致,那怎么办,关键是要怎么管理。一种方式就是,你先登录Host OS的系统,在上面装一个python2.7然后虚拟两个小格出来,在上面运行前两个应用,这两个应用可以直接使用HOST OS上的python2.7;之后再虚拟出一个小格出来,然后在这个小格里只用Host OS操作系统的内核,小格子里单独装一个Python3.0,这样是可以达到这个目标的。如果只有三个Container还好,但如果多了呢?以前我们说一台物理伺服器可以虚拟出20个或者30个虚拟机出来,现在,因为不需要启动Guest OS 了,一个伺服器可以启几百上千个Container出来,你一个一个的去配置吗?就算你一个一个配置好了,你之后怎么管理呢。所以当初Container技术很难被广泛使用。

返过头来,我们可以看下为什么虚拟机没有这个问题,因为虚拟机就是一个完整的镜像文件,本质上就是一个文件,如果是对于云平台来说它存储在一个镜像库里的文件,即便是没有云平台,没有对应的管理工具,你用U盘拷贝都可以。只要将它拷贝到你宿主机的本地,然后用这个镜像去启动一个虚机,那么只要在生成这个镜像的时候把环境配好(例如在生产这个镜像文件的时候就把JDK,Hadoop,Python都预装好)做成镜像,之后你在启动虚拟机的时候,当初你装了什么环境,启动起来就是什么环境。 因为他是纯软体的,不是物理的硬体,所以我们可以拷贝。

但是对于当初的Container技术来说,没有这样的镜像,所以虚拟出来众多的Container的配置管理就是一个大问题,所以在之前的很多年里Container一直没有得到大规模的应用。只有Google在大量应用,因为Google里面对Container的环境要求一样,也就是说2000台伺服器一样的环境配置,我只需要用传统的配置管理手段把这2000台伺服器配置好,然后启动那些Container,因为Container是共用操作系统的,所以启动的Container里面的环境就都是一样的。因此只有在这种场景才能大范围应用。也就是Container中需要的配置和HOST OS 上运行的配置都是统一的,没有那么多差异的配置需要操心,因此可以大量应用。Google当年用的Container技术名字就叫Linux Containers(简称LXC)。

Docker的出现

那为什么这几年Container一下子火了呢?因为出现了 Docker,现在我们说Docker是一个Container,甚至很多时候提到Container就是指Docker,而不是其他的Container技术。然而Docker刚诞生的时候甚至没有自己的Container技术,他用的就是LXC,但是它多做了一件事情,它发明了一个叫做Docker File的东西,这就是一个文本文件,里面描述了这一个Container启动时如何去配置它的环境,一行一行的写的很清楚。所以当我们在用Docker的时候,会按照Docker File去启动一个Container并且按照Docker File的描述把相关的环境给配置好,最后把应用给启动起来。这个时候我们就发现,Docker File就具有与虚机镜像类似的作用,实际上Docker还有一个概念叫Docker镜像。根据Docker File生成一个Container的文件系统,对文件系统中存著的一些东西进行打包,就可以形成Docker镜像。Docker镜像的功能就跟虚机镜像的功能非常的接近了,Docker File和Docker镜像基本上是等价的,因为你有了Docker File就可以根据Docker File生成一个Docker镜像。所以大家用的比较多的还是Docker File。也正因为Docker File解决了Container技术最大的问题:实现环境的统一和管理。有了DockerFile以后就可以让用户在使用Container技术的时候,方便对环境的管理,且任何应用或者服务的运营环境跟你当初在开发时的环境保持一致。需要提及的一点是,随著Docker的迅猛发展,之后LXC不够Docker玩了,所以他自己搞了一套Container技术。

下一节介绍Docker的应用场景、缺点以及与虚机技术的对比。

(谨以此系列文章,祭奠逝去的学生时代.......)
微信公众号

推荐阅读:

相关文章