容器与虚拟机

时间:2022-05-16 09:29:23

容器与虚拟机

 ------是否容器化是个问题,或者说容器VS虚拟机是永恒的争论

在Mirantis,我们经常考虑如何将整个传统的开发域上云,我们首先考虑的不是如何去移动一个开发域,而是考虑该开发域该不该上云。在本文中,我们将讨论在特定情况下上云需要考虑的一些问题。

目前将应用迁移到云上,一般有两种方式,虚拟机和容器,尽管在许多情况下,最简单的解决方案似乎是将应用迁移到虚拟机,但这种解决方式并不一定是最好的。

下面让我们看看影响你上云决定的不同因素

容器跟虚拟机的不同点

架构比较

虚拟机架构

虚拟机就是整个物理机的抽象,上至操作系统,下至内存与存储。VM镜像可以代表操作系统,在制作VM镜像的时候可以按需安装软件,例如web服务器和数据库等,在制作镜像的时候安装的软件也会出现在以该镜像启动的虚拟机中。每个VM都与它所运行的主机,以及主机上其他任何VM相互隔离。

容器架构

容器被设计成战有现有机器的一部分,在同一个操作系统上的容器共享主机内核,容器在系统上只需要足够所需代码运行的库环境的空间即可,容器构建镜像的时候镜像可以包含所需的一切。

资源需求

由于架构不同,运行虚拟机和容器的资源需求也非常不同。虚拟机本质上是一个完整的计算机,自然而然的需要比容器更多的资源,而容器只是操作系统的一部分。一般对于容器集群来说,他的资源密集度较低,因此在单个服务器上运行多容器要比在单个服务器上运行多VM更适合。

需要注意的是,在多个服务共享单个虚拟机资源的时候,用多个容器来代替单个虚拟机更能够达到资源的合理利用,这时候容器是更好的选择。例如,你要将单个VM的功能分解成50个不同的服务,那么这50个不同的服务则是50份部分操作系统副本,而不是整个操作系统副本。因此一定要弄清楚需求。

安全

关于VM或容器是否更安全是一个极具争议的问题,下面谈谈一些主要的主题。

虚拟机彼此之间相互之间严格隔离,但容器共享主机内核,因此如果容器中的一个被破坏,可能会置主机于危险之中。重要的是,Doker使用libcontainer与linux进行交互,涉及到五个不同namespace,包括进程,网络,文件挂载,主机名,共享内存,这些高度隔离的namespace为容器的安全问题提供了部分解决方案。

此外,Openstack Magnum容器项目前的PTL(Project Team Leader)Adrian Otto指出:“虚拟机的供给面很小,而在Linux3.19内核中,容器的系统调用不少于397个”。

尽管虚拟机的攻击面比容器小,但仍要考虑到整个虚拟化平台。虚拟机爆发漏洞是不可能的,Mirantis安全专家Adam Heczko指出:”Qemu到目前收到217个漏洞的影响,迄今为止,有三次攻击VM逃逸攻击。我不确定虚拟机是否比容器更安全,威胁模型与架构完全不同。” 这段话翻译的可能不准确,有更好理解的麻烦斧正,谢谢!

安全性的另一个方面要考虑的是,虽然用户通常创建自己的虚拟机镜像来运行他们所需的软件,但是容器(特别是Docker)则是为彼此构建而设计的。

例如,您正在创建一个基于web的搜索引用程序,您可以创建一个容器镜像,如下:

  • 从最底层的操作系统开始,例如Alpine(Alpine linux是一个面向安全的轻型linux发行版,Docker镜像只有5M)
  • 部署web服务,例如Nginx
  • 运行在Nginx上的搜索应用程序

以上例子,前两层镜像都可以在docker官网或者各自官网找到相关资料进行部署使用,第三层则需要自己去钻研。

架构优缺点

VM的架构优缺点

虽然现在流行容器将取代VM的论调,但就像生活中的很多事一样,各有优缺点。

优点
  • 完全抽象的系统:因为你的所有应用程序都运行在一个服务器上,所以不需要额外的复杂网络。
  • 无需分解应用程序:因为您运行在类似裸机的环境中,所以不需要改变应用程序本身的体系架构。
  • 同时运行多个应用程序:在一个VM上运行多个应用程序是很常见的,简化了整个基础结构的管理。
  • 安全:虚拟机已经被使用很长时间,被认为是相当安全的,提供的隔离可以使攻击面变的很小。
  • 可用的多种操作系统:在虚拟机管理器里几乎支持任何操作系统,因此您可以在单个物理服务器上运行多个操作系统。
缺点
  • 体型可能很大: 因为虚拟机包含太多内容,无论是在今年各项还是运行的资源上面,都比较大。
  • 启动慢:启动虚拟机跟启动物理机是一样的。
  • 运行慢:虚拟机本质是在计算机上虚拟计算机,在vm运行的程序通常不会比相同配置的裸机上运行性能好。
  • 不可嵌套:修改某些参数后虚拟机是可以嵌套的,也就是在虚拟机上运行虚拟机,但性能损耗巨大,一般不会这么做。
  • 配置繁杂:托管虚拟机的平台需要繁多的配置来防止安全域桥接或者跨多个安全域的组件,而导致的安全问题。

容器的优缺点

优点
  • 体型相对较小:容器共享主机的内核,容器只包含必要的操作系统部分和库组件,容器一般只实现单一的功能,所以他们往往体型是非常小的。
  • 快速:因为容器很小,所以可以秒级启动,这使得他很适合反复重启的应用,如所谓的”无服务器”应用程序(serverless架构即无服务器架构,以服务离开代替服务器)。
  • CI/CD(持续集成/持续交付):由于容器可以快速方便启动、重启,所以在容器上做更改时非常容易的。
  • 可移植性:容器是独立的,只要内核兼容,容器就可以环境相似的机器之间比较容易的移动。
  • 生命周期和交付模型:容器化生命周期的结构更容易集成漏洞评估和竞相注册等高级功能。
缺点
  • 容器需要复杂的网络:实现单个功能需要多个容器互相通信,例如Kubernetes之内的一些编排系统有一些更高级别的单元,例如多容器pods,使得容器间通信比较容易,但操作起来相比虚拟机更加复杂。Magnum的前PTL也说过“实际上,Kubernetes中的L3网络模型比Openstack中的L2模型简单的多。”因此,在网络上的工作量取决于你如何处理功能之间或者是虚拟机之间的通信。
  • 容器安全性相对较低:容器太年轻,以致大多数人认为容器没有虚拟机安全。
  • 使用容器会增加工作量:如果你要使用容器,那么你要把你现在的应用程序分解成各种组件,如果使用虚拟机则不用这么麻烦。
  • 容器是不可靠的:如果一个应用程序的组件挂掉,那么整个服务可能会不能正常使用。

(原文地址https://www.mirantis.com/blog/containers-vs-vms-eternal-debate/?utm_campaign=Mirantis%20Digest&mkt_tok=eyJpIjoiTmpFMVpURTBZalJrTURFeiIsInQiOiJ4U2x6N2JuSjYxY2VVYTA3b1JTN21JR1Q5ZVFCSngxY3hhZ2FXcWRleVdFZlg0ZEg0bGQ3cnp5dUw0TGdaUkVIMW5ndWdTSzAydkZhZnFjbXFud25QbWxIME85UGVyZWtsblRcL3FXUHNwakpQY080a25tckhtbXhVcnJOMUpQU3IifQ%3D%3D