虚拟机、容器和Docker孰优孰劣?
最近,容器领域可谓风生水起:Docker日益普及,开放容器计划(Open Container Initiative)宣布成立,云原生计算基金会(Cloud Native Computing Foundation)正式启动。然而,由于像虚拟机这些替代方案主导云计算行业,何时应该使用哪种技术、与什么技术结合使用,这方面让人犯迷糊。
企业必须充分了解每一项技术,才能明智地决定哪种解决方案最适合其要求。这意味着,要回答诸如此类的问题:这项技术涉及什么?这项技术如何使用?以及谁在使用这项技术?
就在不久前,虚拟机(即VM)在云计算领域还是“一枝独秀”。虚拟机是完全虚拟化的环境。每个虚拟机自带一整套完备的操作系统、内存、存储和处理器等资源。系统在虚拟机里面工作时,虚拟机充当了数据中心中服务器硬件上一个完全独立的环境。
优点:使用虚拟机时,虚拟机管理程序层让这项技术可以在不同的虚拟机上,能够同时共享资源,并在同一个主机上同时运行各操作系统(比如Linux和Windows)。虚拟机还提供了实例之间更好的隔离机制,这促使许多专业人士认为,他们在云计算环境下仍拥有最高的安全级别。
缺点:虚拟机启动时,必须经历整个启动过程,这需要装入一整套完备的操作系统及属性。这可能要花几分钟,会带来过大的服务器开销,从而导致一些虚拟机反对者认为虚拟机效率低、速度慢。
容器作为Linux界的一分子已有相当长一段时间了。由于Linux内核方面的两大关键技术:命名空间和控制组(cgroups),容器在近些年来已取得了长足发展。这两项技术都有了改进,因而得以更有效地隔离特定的进程,然后进程可以在容器里面包装起来,变得易于移植、更容易管理。
简而言之,容器看起来就像虚拟机:它有自己的空间,用于容纳用户进程和服务,也有自己的网络接口。实际上,容器就是在主机上的隔离空间中运行的一组用户进程。所有容器实例共享主机节点的同一个主机内核。容器可以直接用在裸机上,也可以作为虚拟机之上的第二层容器引擎。
优点:裸机Linux容器让每个实例在单独的用户空间里面运行时,可以共享主机节点服务器的同一个操作系统、内核版本和文件系统。这使得它们在使用资源方面极其高效:它们就是虚拟机的轻量级版本。
这意味着每当一个新的裸机容器实例启动时,没必要启动单独的功能完备的操作系统,因而降低了服务器开销,并且大大提高了共享服务器资源的效率。一个容器大小可能不到100MB,这意味着一台服务器上就能运行多个容器,几乎可以瞬间启动其上面的应用程序。
缺点:容器的最大优点恰恰也是其主要缺点。由于诸容器都共享主机节点的内核,你无法在同一节点上的不同容器中运行不同的操作系统。如果你在主机节点上运行Linux,那么在节点上面配置的容器就要运行这个操作系统。不过你仍可以运行不同的Linux发行版。由于容器是相对新颖的技术,企业将它们用于多租户环境、运行完全基于容器的基础设施时,可能会出现意料之外的问题,导致一些专家不敢贸然建议在生产环境下运行容器。
最近,由于Docker日益普及、采用和媒体报道,Docker与容器几乎划上了等号。Docker是一种容器引擎,让开发人员可以将应用程序连同依赖项一起打包成标准单位,并管理容器、映像、版本及其他对象。这项技术可用于对现有的云基础设施进行容器化处理,作为第二层,无论是基于虚拟机、基于Linux还是基于Windows,并将应用程序彼此隔离开来。
优点:Docker容器是开源软件,可以在个人计算机、Linux发行版和微软操作系统上本地运行,也很容易整合到大多数开发运维(DevOps)应用程序中。简而言之,Docker可以让更多的应用程序在硬件上运行,因而让开发人员易于创建和部署容器化应用程序,并简化这些应用程序的管理。
Docker非常从容地解决了这个问题:软件在诸多云托管环境之间移动时,如何让软件更高效、更可靠地运行。在开发周期中使用Docker时,软件可在多个环境上更顺畅地运行,从开发人员的计算机顺利进入到生产环境。
缺点:容器普遍存在的一些问题对Docker容器来说同样存在。大多数Docker批评者声称,Docker仍不够安全,没法在生产环境下运行;他们指出,人们在开发过程的早期阶段使用Docker,主要用作一种应用程序包装和编排工具。一些容器支持者抨击Docker的实施缺乏重点,一口气想吃成胖子。
说到公司应选择哪种类型的技术,根本没有现成答案,也没有捷径可抄。更确切地说,每家企业要认真分析自身的具体要求,然后与每一种技术的价值进行比较。这些技术并不存在传统意义上的竞争,而是可以组合起来,获得企业寻求的具体效果。在外人看来似乎一片混乱的行业,决策者有必要清楚地了解这每一项技术的功能,然后才能选择最适合本公司的那项技术。