-
-
[翻译]进程、容器和虚拟机之间有什么区别?
-
发表于: 2019-3-6 20:20 10170
-
许多人问“虚拟机和容器之间有什么区别?”这个问题,但是,在我看来,更有趣的问题是...
“进程和容器间有什么区别?”
当容器在2013年开始变得流行,常常能听到“容器类似于小型虚拟机”。这种说法是有一定道理的,因为人们会用容器代替虚拟机,但是我认为,从技术的角度讲,更恰当的说法是,容器是一个进程。
这篇文章将会描述进程、容器和虚拟机是什么。随后比较三者。
实际上,可以把容器比作是虚拟机,也可以不把容器比作是虚拟机。这取决于你对它的评定标准。
这里我们有两个评定原则:
本文包含以下的章节:
进程代表了一个运行中的程序;它是执行中程序的一个实例。一个进程由内存和一系列数据结构组成。内核使用那些数据结构来存储关于程序状态的重要信息。
CPU一次只能执行一个程序,因此必须在许多程序间和任务间切换来共享CPU。CPU需要记住程序中的中断位置(和其它的东西)。进程是存储运行中程序的状态的抽象。
默认情况下,进程和操作系统资源有非常小的隔离。例如,如果你尝试在同一端口运行多个服务,会出现报错。默认情况下,进程隔离默认指以下两点::
进程有它自己的内存空间。
进程权限有限。进程拥有和创建该进程的用户同样的权限。
什么是容器有很多定义。
Nigel Populaton的定义是一个“具有应用资源使用限制的操作系统的独立区域”。
维基百科的定义是“容器是操作系统级虚拟化的通用术语...有许多的实现方式,包括Docker,lxc和rkt。”
在Unix/Linux 系统管理手册中,它们描述容器是一个限制于私有root文件系统和进程命名空间的独立进程组。
我个人对容器的定义是顶层具有一些很酷的内核特性的一组进程,允许进程假装它们正在运行在它们独立的机器上。然而主机知道容器实际上是一个进程,容器认为它是独立的机器。使这点成为可能的内核特性是:
命名空间(namespace)= 命名空间是使容器看起来和感觉它自身是一个完整的独立机器的特性。
cgroups = 一种在内核中将进程分组并限制该组的资源的方法。这是由Google在2006年开发,最开始被称为“进程容器(process containers)”。
我最喜欢的内核特性是命名空间。有7中不同的Linux命名空间,每个对应不同的资源。Linux帮助页对于命名空间有详细的描述。
命名空间以抽象的方式包装全局系统资源,使它对于在命名空间中的进程看来它们有自己的全局资源实例。
命名空间是我最喜欢的是因为它们允许容器看起来和自身感受它们自身是独立的机器。7种不同类型的命名空间涉及7种不同的资源,这些资源在容器中获取自己的独立实例。
如果你想深入探索这些内容,我强烈建议观看Wes Higbee的课程“容器和图片:总阅(Containers and Images:The Big Picture)”中的“什么是容器?(What is a Container?)”章节。
容器允许许多应用运行在同一台服务器上,但是伪隔离(pseudo-isolated)环境。容器假装是自己的操作系统。它可以运行一组进程,它认为自身是独立的环境。由于容器和主机运行在同一操作系统上,容器相比VM具有更少的资源开销。
回顾,要创建一个容器,cgroups将进程分成组。cgroups限制了给进程组的资源(例如CPU,内存)。命名空间创建7种不同资源(例如,网络栈,挂载等)的独立实例,为容器提供一个单独的操作系统。
“虚拟机”最开始被Popek 和Goldberg定义为“一个高效的、独立的真实计算机的复制品”。虚拟机是一种服务器虚拟化。当讨论VM时,有一些重要的部分:1)管理程序(hypervisor)和2)实际的虚拟机(又称Guest OS)。管理程序是运行VM的软件。它在硬件和虚拟机之间提供了抽象层,可移植性更好和主机硬件资源利用更高效。
VM使得在单台机器上运行多个不同类型的操作系统实例成为可能。除此之外,VM使在一台服务器上以安全可靠的方式运行多个应用程序,从而更有效的利用计算机的物理资源。虚拟化技术将物理硬件转化为可共享的形式。回到VM之前的日子,企业通常在每台服务器上运行一个应用程序。这意味着这些服务器上通常会有大量闲置CPU,有时超过90%空闲!虚拟机技术使运行许多虚拟机成为可能,因此可以运行许多应用程序并减少未使用的系统资源。
虚拟机完全独立于主机操作系统,仅仅共享了硬件。此级别的隔离比进程和容器隔离程度更高,因为后两者依赖于主机操作系统。记住,这种完全隔离伴随着代价,它需要更多的资源来实现。所以,它更独立,更安全,但是使用更多的主机资源来运行虚拟机自己的操作系统。
如果你想深入探索这些内容,我强烈建议观看 Nigel Poulton的课程“Docker容器——总览(Docker Containers——The Big Picture)”中的“什么是容器?(What are Containers?”章节。
如果我们正在评估技术实现,那么说容器更像是进程而不是虚拟机更合适。
然而,如果我们讨论用例和终端用户于产品的交互,容器更像是VM,它解决了在一台服务器上提供隔离环境来运行许多应用的相同问题。
通过了解技术的实现,与主机操作系统的隔离级别是评估的主要方面:
进程在操作系统层面默认隔离程度很低,主要只有隔离的内存地址空间和用户权限。
容器是一个进程(或一组进程),但是与操作系统间的隔离程度比普通的进程高,但比VM低,安全性也更差。
虚拟机在操作系统中完全隔离,这意味着他们在主机硬件顶层创建了完整的新的操作系统。完全的独立伴随的是更多的资源使用来运行虚拟机。
如果我们从技术正在解决问题的角度去评估,那么终端用户/终端系统如何与该技术交互则是不错的评估标准:
虚拟机: 提供一种方式在同一主机上运行不同的操作系统,相应的,在完全独立的环境中运行许多程序。
所以,这既能说明容器和进程相似,和虚拟机相似,也可以说明容器与进程和虚拟机都不相似,这取决于你的评估标准。
原文地址:What is the difference between a process, a container, and a VM?
翻译:看雪翻译小组 sudozhange
校对:看雪翻译小组 SpearMintf
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]初探HG110-B家庭网关 22160
- [翻译]编写Shellcode:寻找EIP/RIP 10750
- [翻译]使用Fuzzing在闭源Windows软件中寻找漏洞 19319
- [翻译]“进程重镜像”行为检测 8404
- [翻译]黑帽2019:5G安全漏洞允许中间人针对性的攻击 8831