了解虚拟化和容器如何在较低级别上工作可能会有所帮助。这会让很多事情变得明朗。
注意:我在下面的描述中做了一些简化。更多信息请参见参考资料。
虚拟化如何在较低级别上工作?
在这种情况下,VM管理器接管CPU环0(或较新CPU中的“根模式”),并拦截来宾操作系统发出的所有特权调用,从而产生来宾操作系统拥有自己硬件的假象。有趣的事实:在1998年之前,人们认为在x86体系结构上实现这一点是不可能的,因为没有办法进行这种拦截。VMware的员工们
were the first
他想出了一个主意,重写内存中的可执行字节,以实现来宾操作系统的特权调用。
其最终效果是,虚拟化允许您在同一硬件上运行两个完全不同的操作系统。每个来宾操作系统都会经历引导、加载内核等所有过程。您可以拥有非常严格的安全性。例如,来宾操作系统无法完全访问主机操作系统或其他来宾操作系统,从而导致事情变得一团糟。
容器如何在低水平下工作?
2006
,包括谷歌的一些员工在内的人实现了一个新的内核级功能,名为
名称空间
(然而这个想法
long
之前
existed in FreeBSD
)操作系统的一个功能是允许进程之间共享网络和磁盘等全局资源。如果这些全局资源被包装在名称空间中,以便它们仅对在同一名称空间中运行的那些进程可见,该怎么办?比方说,你可以得到一块磁盘,把它放在名称空间X中,然后在名称空间Y中运行的进程看不到或访问它。类似地,名称空间X中的进程无法访问分配给名称空间Y的内存中的任何内容。当然,X中的进程无法看到或与名称空间Y中的进程对话。这为全局资源提供了一种虚拟化和隔离。Docker就是这样工作的:每个容器都在自己的名称空间中运行,但使用的正是
相同的
内核和所有其他容器一样。之所以发生隔离,是因为内核知道分配给进程的名称空间,并且在API调用期间,它确保进程只能访问自己名称空间中的资源。
容器和虚拟机的局限性现在应该很明显:不能像虚拟机那样在容器中运行完全不同的操作系统。不管你
可以
运行不同的Linux发行版,因为它们共享同一个内核。隔离级别没有VM中的隔离级别强。事实上,在早期的实现中,有一种方法可以让“来宾”容器接管主机。你还可以看到,当你加载一个新的容器时,操作系统的一个全新副本并不像在虚拟机中那样启动。所有容器
share the same kernel