虚拟机(VM)的工作原理

[toc]

容器

容器的工作原理主要依赖于操作系统层面的资源隔离和限制技术。

与传统的虚拟机不同,容器不需要运行完整的操作系统,而是直接在宿主机的操作系统上运行。容器共享宿主机的内核,但在文件系统、进程、网络和其他资源方面实现了隔离。以下是容器工作原理的关键技术:

命名空间(Namespaces)

namespaces是Linux内核提供的一种资源隔离机制,它可以将系统资源(如进程、文件系统、网络等)划分为多个独立的命名空间。容器内进程拥有独立视图:

  • PID命名空间隔离进程ID,网络命名空间提供独立网络栈。‌
  • 其他类型包括Mount(文件系统挂载点)、IPC(进程通信)、UTS(主机名)和User(用户ID)命名空间。‌

每个容器运行在自己的名字空间中,互不干扰。

控制组(cgroups)

控制组是Linux内核提供的一种资源限制和管理机制,它可以为进程分配和限制CPU、内存、磁盘I/O等资源。

通过控制组,容器可以实现CPU、内存、磁盘I/O等资源的分配和隔离,避免争抢资源。

联合文件系统(Union File System)

联合文件系统是一种分层、轻量级的文件系统,它允许将多个文件系统层叠在一起,形成一个统一的视图。

容器镜像使用联合文件系统来存储和管理文件,实现了分层存储和版本控制。当容器启动时,它会创建一个新的可写层,用于存储运行时的数据。这样,容器之间可以共享相同的基础镜像,减少了存储空间的占用。


Linux 早就支持 2.6.x 的版本就已经支持 namespace 隔离了,使用 namespace 可以将两个进程完全隔离。

仅仅将资源隔离还不够,还需要限制对资源的使用,比如 CPU、内存、磁盘、带宽这些也得做限制;这点也可以使用 cgroups 进行配置。它可以限制某个进程的资源,比如宿主机是 4 核 CPU,8G 内存,为了保护其他容器,必须给这个容器配置使用上限:1核 CPU,2G内存。

image.png

这张图就很清晰的表示了 namespacecgroups 在容器技术中的作用,简单来说就是:

  • namespace 负责隔离
  • cgroups 负责限制

容器是一种轻量级的虚拟化技术,它在单个操作系统上运行多个隔离的实例。与虚拟机不同,容器不模拟硬件,而是共享宿主机的操作系统内核。容器通过Linux内核的namespaces和cgroups等特性实现隔离。namespaces提供了一种隔离资源(如进程ID、网络接口等)的方法,而cgroups则用于限制和监控资源使用。容器内运行的应用程序直接与宿主机的内核交互,而不是通过Hypervisor。



虚拟机(VM)

虚拟机是通过虚拟化技术在物理服务器上创建的完整计算机系统。它模拟了底层硬件,运行完整的操作系统(OS)和应用程序。虚拟机通过Hypervisor(也称为虚拟机监控程序)与物理硬件交互,Hypervisor负责管理硬件资源并将其分配给各个虚拟机。虚拟机可以被视为一个完整的计算机系统,拥有自己的操作系统、应用程序和用户空间。

虚拟机通常需要更多的资源,因为每个虚拟机都需要运行自己的操作系统,这包括内核、系统库和驱动程序。此外,虚拟机还需要为其操作系统和应用程序分配内存和存储空间。这导致虚拟机的启动和运行相对较慢,并且占用更多的磁盘空间。

虚拟机的性能受到虚拟化开销的影响,尤其是在I/O操作和网络通信方面。虚拟机需要通过Hypervisor与物理硬件交互,这会增加额外的延迟。此外,虚拟机的资源分配通常是静态的,不易动态调整。

虚拟机提供了较强的隔离性,因为每个虚拟机都运行在自己的操作系统上。这有助于防止不同虚拟机之间的资源冲突和安全威胁。虚拟机可以通过网络隔离、存储加密等技术增强安全性。
容器的安全性通常低于虚拟机,因为它们共享宿主机的操作系统内核。容器之间的隔离依赖于namespaces和cgroups等内核特性,但这些隔离机制可能被绕过。然而,容器可以通过用户名称空间、安全策略和运行时沙箱等技术提高安全性。