了解虚拟化和容器如何在低级别工作可能会有所帮助。这将清除很多事情。 注意:我在下面的描述中进行了一些简化。有关更多信息,请参阅参考资料。 虚拟化如何在低级别工作? 在这种情况下,VM 管理器接管 CPU 环 0(或较新 CPU 中的“根模式”)并拦截来宾操作系统进行的所有特权调用,以制造来宾操作系统拥有自己的硬件的假象。有趣的事实:在 1998 年之前,人们认为在 x86 架构上实现这一点是不可能的,因为没有办法进行这种拦截。 VMware 的人是第 一个想到重写内存中的可执行字节以实现来宾操作系统的特权调用的人。 最终效果是虚拟化允许您在同一硬件上运行两个完全不同的操作系统。每个客户操作系统都会经历引导、加载内核等所有过程。您可以拥有非常严格的安全性。例如,客户操作系统无法获得对主机操作系统或其他客户的完全访问权限,从而搞砸了。 容器如何在低级别工作? 大约在 2006 年,包括一些 Google 员工在内的人们实现了一个新的内核级功能,称为 _命名空间_(不过这个想法 早 在 FreeBSD 中就已经存在了)。操作系统的一项功能是允许进程之间共享网络和磁盘等全局资源。如果这些全局资源被包装在命名空间中以便它们只对在同一命名空间中运行的那些进程可见怎么办?比如说,您可以获得一块磁盘并将其放在命名空间 X 中,然后在命名空间 Y 中运行的进程无法看到或访问它。同样,命名空间 X 中的进程无法访问分配给命名空间 Y 的内存中的任何内容。当然,X 中的进程无法看到或与命名空间 Y 中的进程通信。这为全局资源提供了一种虚拟化和隔离。这就是 Docker 的工作方式:每个容器在自己的命名空间中运行,但使用与所有其他容器 完全相同 的内核。发生隔离是因为内核知道分配给进程的命名空间,并且在 API 调用期间,它确保进程只能访问其自己的命名空间中的资源。 容器与虚拟机的局限性现在应该很明显了:您不能像在虚拟机中那样在容器中运行完全不同的操作系统。但是,您 可以 运行不同的 Linux 发行版,因为它们共享相同的内核。隔离级别不如虚拟机强。事实上,在早期的实现中,有一种方法可以让“guest”容器接管主机。您还可以看到,当您加载新容器时,操作系统的全新副本不会像在 VM 中那样启动。所有容器 共享同一个内核。这就是容器重量轻的原因。同样与 VM 不同的是,您不必为容器预先分配大量内存,因为我们没有运行操作系统的新副本。这允许在一个操作系统上运行数千个容器,同时对它们进行沙箱化,如果我们在它们自己的虚拟机中运行操作系统的单独副本,这可能是不可能的。