翻译:虚拟机还是容器?该如何选择

虚拟机和容器这两种虚拟化技术都是为了更有效地发挥软硬件性能而诞生的,其中容器技术在最近几年开始流行并迅速改变了互联网的生态,而虚拟机技术则是在更早之前就已经是行业内的主流方案并广泛存在于各大数据中心。

而当我们要规划一个项目的架构时,往往都需要深入研究他们各自的工作原理和区别,从而制定出一个最适合的方案。

vm-vs-container

基础知识的定义

什么是虚拟化(Virtualization)

虚拟化是使用计算机技术模拟出一个计算机环境的技术。使用了虚拟化技术后,我们可以利用专用的软件在一台宿主机中创建多个虚拟的计算实例,这些实例可以是传统意义上的计算机,也可以是存储、应用程序或者是网络设备等。

什么是管理程序(Hypervisor)

管理程序是一种可以实现虚拟化功能的软件。作为一个位于物理硬件和虚拟环境之间的轻量化的软件层,管理程序允许多个操作系统在同一硬件上协同运行,也即是一个负责分配物理主机的硬件资源到各个计算实例的中间人。

虚拟机 vs 容器

什么是虚拟机(Virtual Machine)

通过虚拟化技术我们可以在计算机内部生成计算机,因为是运行在虚拟化的硬件环境内,所以称之为虚拟机。使用虚拟机技术可以让多台独立的计算机都同时运行在单台计算机的硬件中。

每个虚拟机都会有一个完全独立的操作系统,每台虚拟机中的操作系统和应用软件所使用的硬件资源都来源于所在的同一台物理主机,而硬件资源的分配、管理则通过物理机中的管理程序实现。

和虚拟化技术同时开始流行的,就是云计算服务。不管是公有云还是私有云,主要都是通过虚拟机技术实现降本增效。

vm

但是,每个虚拟机内部都需要运行一个完整的操作系统,并且为了支持虚拟机的运行还需要使用额外的开销去管理虚拟化的硬件,这个过程使得虚拟机占用了大量的系统资源。在这个时候,虚拟机可能就会变成一个体积巨大并且消耗大量的CPU和内存的程序。尽管我们可以在一台物理主机上分割成多个虚拟机去共享硬件资源从而节省硬件费用,但在某些使用场景中,例如是一些小型的服务程序,当维持操作系统运行的性能开销比服务程序还要高的时候,虚拟机就显得很不经济了。也正是因为虚拟机存在这样的短板,才有了后来的容器技术。

虚拟机的优势

  • 几乎支持所有操作系统

  • 完善的功能

    • 稳定可靠的管理工具

    • 成熟的安全和管理工具

  • 可以在单台物理主机上运行多个不同的操作系统

  • 比起单独的物理主机相比,可以节省成本

主流的虚拟化平台

  • VMware Workstation Player

  • VirtualBox

  • Xen Project

  • Microsoft Hyper-V

什么是容器(Container)

容器技术不像虚拟机那样创建虚拟的计算机,容器技术使用的是虚拟化的操作系统。

容器位于计算机的硬件和操作系统(一般是Windows或者Linux)的上层,每个容器会以只读的方式共用操作系统的内核以及部分应用程序(bin)和函数库(lib)。

容器共用操作系统资源(如函数库)可以大大减少重复安装操作系统所产生的开销,使服务器可以通过安装单个操作系统来运行多个工作负载(workload)。因此,容器非常轻巧,只有MB级别的体积并且可以快速启动。与使用虚拟机相比,我们可以在安装容器服务的单个服务器上放置两到三倍数量的应用程序。与容器相比,虚拟机需要几分钟才能完成启动,并且体积比同等容器大一个数量级(往往是GB级别)。

尽管容器技术问世已久,但直到2013年推出的Docker在解决了环境一致性的问题后, 才使容器成为应用开发的行业标准。开发人员通常在本地编写代码(开发环境),然后将代码部署到服务器上(线上环境)。在这个过程中,环境之间会存在软件版本、权限、数据库连接等差异,都会导致程序错误。而使用容器技术后,开发人员可以创建一个可移植的包裹(容器镜像),里面包含该服务程序在任何环境中运行所需要的所有依赖项。这样,不论是在本地环境还是测试环境、生产环境,程序都可以顺利运行。

用于应用程序开发的微服务架构就是在这种容器的热潮中发展起来的。使用容器技术后,应用程序可以分解为多个服务于单一场景的服务程序,各个服务可以相互独立地开发和部署。例如,假设你有一个电商APP,里面有搜索栏、购物车和购买按钮等不同的模块,所有这些功能都可以拆分成不同的容器。这样,哪怕是搜索功能因为高负载而崩溃,都不会影响其他用户进行购物。

container

容器工具

  • Linux Containers(LXC):最初的Linux容器技术,用于在单个主机上运行多个隔离的Linux系统。

  • Docker:最初是一个使用LXC构建单一应用程序的项目,对LXC进行了多项更改使容器更加灵活,后来演变成自己的容器运行环境。从系统上层来看,Docker是一个Linux应用程序,可以高效地创建、传送和运行容器。

  • Kubernetes(K8s):本身不是容器软件,是容器编排工具。在目前云原生、微服务的热潮中,一些App在背后可能需要成千上万的容器提供服务,都依赖K8s去对所有容器完成自动化管理。尽管K8s在运行的时候需要依托像Docker这样的容器环境,但我们讨论容器技术的时候往往都不得不提到K8s的大名。

容器的好处

  • 降低IT管理成本

  • 快速启动

  • 体积轻巧

  • 简化安全更新的工作

  • 降低应用部署和迁移的工作量

虚拟机和容器的区别

在当下,传统IT架构与目前DevOps实践之间争论的核心,就是虚拟机与容器的争论。

虚拟机会一如既往地有着很广泛的使用场景,但遗憾的是,虚拟机也逐渐成为了笨重的代名词。与此同时,容器技术披着“微服务”的光鲜外衣,正在不停地挤占虚拟机的生存空间。

相较之下,虚拟机之于容器就像是豪华露营包和超轻型背包的区别。两者都在虚拟化领域为应用程序提供了便携的的生存所需,但如果你想走得更快更远,就应该使用容器技术。因为虚拟机里面还带着厨房,而容器却连牙刷都不要了。

虚拟机和容器的总结对比如下:

虚拟机 容器
笨重 轻巧
性能损耗高 性能损耗更低
每个虚拟机运行自己的操作系统 所有容器都共用宿主机的操作系统
硬件层面的虚拟化 操作系统虚拟化
启动时间以分钟计算 毫秒级的启动时间
占用内存多 占用内存少
完全隔离,因此更安全 进程级别的隔离,可能不太安全

虚拟机和容器的选择

虚拟机和容器都各有优劣,最终还是基于特定需求进行选择。

当你需要在服务器上运行多个需要充分使用操作系统的各种功能的应用程序并且需要管理多种不同的操作系统时,虚拟机是更好的选择。尤其是如果你不打算或者不需把目前的系统架构重构为微服务架构时,继续用虚拟机也并无不可。

但当你的首要任务是在少量的服务器上运行大量的应用程序并且对可移植性有需求时,就更适合使用容器技术。如果你正在开发一个新的应用程序,并且想要使用微服务架构来实现可扩展性和可移植性,那么容器就是不二之选。容器技术会在在基于微服务架构的云原生应用程序开发过程中大放异彩。

你也可以在虚拟机里面运行容器,在这个时候,你会更深入地理解这两种技术对系统负载的影响,而不是纠结于选择哪一种技术。

简而言之:

  • 虚拟机技术可以从有限数量的硬件和软件资源中扩展出更多的机器数量,帮助团队更充分利用其硬件资源

  • 容器通过微服务和DevOps实践,帮助团队更充分地利用开发资源

原文:https://www.backblaze.com/blog/vm-vs-containers/

翻译:RondoChen