进程、容器与虚拟机
参考:关于进程、容器与虚拟机的区别,你想知道的都在这!
进程、容器与虚拟机的结构图
进程 介绍
进程是一个正在运行的程序,它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候,一个进程就被创建出来了。 所以说,一个进程包括一堆它占用的内存空间以及额外的数据结构,操作系统内核使用这些数据结构来存储关于该程序的一些类似状态的重要信息。
一个程序本质上是一堆指令和数据结构,而单个 CPU 同一时间只能执行一条指令,同时 CPU 的频率非常快,一秒可以执行数亿条指令, 因此为了充分榨取 CPU 资源,必须在多个运行的程序之间共享 CPU 执行时间,也就是每个程序每隔一定时间,都可以分配到一些 CPU 执行时间,用来执行该程序的指令,而由于 CPU 执行速度非常快,CPU 切换执行程序的间隔时间非常短,用户是察觉不出来的。 而在 CPU 切换执行程序的时候,当前程序的执行状态必须保存在某个地方,因为很快 CPU 会切换回来继续在刚才的那条指令处接着执行。 进程就是存储了正在运行的程序的运行状态的抽象。
操作系统对进程隔离了哪些资源?
默认情况下,操作系统对进程的限制非常少,基本上所有操作系统资源对进程都是可见的。少数的几个限制比如:当将多个进程绑定在同一个端口上的时候, 只有第一个会成功,后续的都会失败。对进程的隔离主要有两个方面:
- 一个进程只能访问自己的内存空间,它无法访问到其他进程的内存空间。
- 一个进程只拥有受限的权限,这些权限取决于创建该进程的用户。比如,
/etc/shadow
文件仅 root 用户可以看,当用 root 用户执行一个程序的时候,该程序就可以读写/etc/shadow
文件,而非 root 用户访问就会直接报错。
容器技术 介绍
当容器技术在 2013 年兴起的时候,很多人将容器视作一个轻量级虚拟机,这个观点受到很多人的追捧, 因为容器就是为了替换虚拟机而被发明出来的。但从技术的角度看,一个容器更像一个进程,而非虚拟机。
容器的定义在网上有很多版本:
Wikipedia
的定义:容器是操作系统级别虚拟化的一个通用术语,业界有很多对容器的实现:Docker, lxc 和 rkt 等等。Unix/Linux System Admin
一书中这样描述容器:容器是隔离出来的一组进程,这些进程被限制在一个私有的的根文件系统和进程命名空间内。Docker 官网
这样介绍容器:容器是一个标准单元,它打包了应用程序的源代码和这些代码的所有依赖项,以便能够让应用程序在多个计算环境中快速部署。
个人对容器的理解是:容器是一组进程,操作系统内核提供了一些强大的功能,能够让这些进程假装运行在一个单独的机器上面。而在操作系统看来,这些进程跟系统上的其他进程没有任何区别。以下就是让这一切成为可能的内核功能:
-
Namespaces: Namespaces 技术能够让容器看起来像运行在一台单独的机器上那样。
Linux
man
手册对 namespace 有一个很棒的描述:Namespace 对全局系统资源进行了抽象,让身处 namespace 中的进程认为它们独立拥有这些全局资源。Linux 提供了七种不同类型的 namespaces,每种用来隔离不同的资源类型。七种 namespaces 分别对七种不同的全局系统资源进行了抽象、隔离:
- cgroups - 隔离根目录
- IPC - 隔离进程间通信
- Network - 隔离网络栈
- Mount - 隔离挂载点
- PID - 隔离进程 id
- User - 隔离用户 id 和用户组 id
- UTS - 隔离主机名
-
Cgroups:Cgroups 能够限制一组进程能够使用的硬件资源。Google 2006年开发了该技术,一开始被称为进程容器。
-
Capabilities:一个权限点列表,用来控制进程的权限级别。
容器解决了什么问题?
容器能够让多个应用同时部署在一台服务器上的多个隔离的环境中,但是这种隔离是伪隔离,容器假装拥有自己独立的操作系统,它可以运行多个进程, 从容器的角度来看,它处于一台独立的机器上。相比虚拟机,容器消耗更少的系统资源,这意味着相同的服务上,能够部署更多的容器,更高的资源利用率。
容器总结
创建容器时,Namespaces 负责将容器中的进程隔离在一个单独的环境中,Cgroups 负责限制容器能够使用的硬件资源,例如:CPU, 内存等等。 这样,容器就能像一台单独的虚拟机那样运行,同时也不会滥用宿主机资源,影响其他进程或容器的运行。
虚拟机(VM)介绍
虚拟机的最原始定义为:一个高效的,隔离出来的真实计算机的副本。
虚拟机代表的是一种计算机虚拟化技术,通常来说,包括两个部分:
- hypervisor:一个运行虚拟机的软件,它在计算机硬件和虚拟机(VM)之间建立一层抽象,以便带来更高的灵活性和更高效的资源利用率。
- 虚拟机(VM):指的就是虚拟机本身
虚拟机解决了什么问题?
-
虚拟机最主要的用途,就是在同一台机器上安装多个不同的操作系统。
例如,国内政府部门的网站,银行发的各种设备基本只能在 Windows 中使用,这个对与 Mac 用户太不友好了。这时,最优的解决方案就是在 MacOS 上面安装一个虚拟机软件,然后安装一个 Windows 的操作系统。
-
虚拟机能够在同一台机器上同时运行多个应用,这些应用之间彻底隔离,互相不影响,非常的安全。同时能更充分地使用系统资源,避免浪费。
-
宏观来说,虚拟化技术最主要的作用在于将单体的硬件资源转变为可供多个个体共享的资源使用模式,最终目的还是提高系统资源使用效率。
在虚拟机出现以前,商业公司在每台服务器上一般只运行一个应用,而当该应用不工作的时候,服务器资源就被白白浪费掉了。虚拟化技术使得一台服务器上可以跑多个虚拟机,每个虚拟机可以被不同的用户使用,这种方式大大降低了硬件资源的空置率。
现在上云的时代,购买的云服务器基本上都是虚拟机。
虚拟机中的隔离
虚拟机是完全跟宿主机操作系统隔离开来的,它们共享硬件资源,也就是说,虚拟机的隔离发生在硬件层面。(现在也可以在宿主机操作系统中创建虚拟机) 这个层面的隔离相比进程和容器来看,更加的彻底和安全。因为进程和容器都依赖宿主机操作系统。
但是,这种彻底隔离的代价,就是会占用物理机器更多的资源,毕竟虚拟机内部有一个完整的操作系统需要运行。
进程、容器与虚拟机的异同
实际应用中,容器既类似虚拟机,也可以说完全不是一类东西,这取决于从哪些角度来看待它们。
从技术的实现原理,宿主机的隔离机制来看(微观):
- 进程在操作系统中只有很少的隔离,主要是独立的内存空间和用户权限。
- 容器本质上就是一组进程,相比宿主机中的其他进程,容器中的进程运行在自己独立的 namespace 中,也不能无限制的使用宿主机资源,但是相比虚拟机,在安全性方面有所欠缺。
- 虚拟机在操作系统层面拥有完全的隔离,完全是一个独立的环境,拥有一个构建于硬件之上的完整的操作系统。缺点是会占用较多的硬件资源。
从技术要解决的问题,技术的应用场景来看(宏观):
- 进程的出现,是因为 CPU 需要一个对象,用来存储程序运行期间的状态、执行上下文等信息。
- 容器的发明,是为了在操作系统上创建隔离的环境,来同时运行多个应用程序。
- 虚拟机的出现,让我们能够在同一台机器上面运行多个完全不同的操作系统,或者是创建多个绝对隔离的环境用来运行应用程序。
总结:
- **从技术的实现原理,宿主机的隔离机制来看:**容器更像进程,而非虚拟机。
- **从技术要解决的问题,技术的应用场景来看:**容器跟虚拟机非常相似,它们解决的是同样的问题,也就是在同一台 机器上,创建隔离的环境运行多个应用程序,提高机器的资源使用率。
- 通过上面的分析,可以了解到容器是一个非常强大的技术,它吸取了虚拟机的优点,但是轻量得等同于一组进程,同时也很好的控制了这层抽象带来的资源消耗。