据我所知,我们使用虚拟机来隔离环境,以便一个环境的配置不会破坏另一个环境。不过,这一切都很好:
- 性能方面价格昂贵
- 占用大量存储空间
- 它引入了复杂性
那么,如果我们的主要问题是环境隔离,那么这是否是由于操作系统的工作方式而产生的一个问题?虚拟机不就是为了解决操作系统很容易出现故障、应用程序无法使用这一问题而采取的一种变通方法吗?考虑到如此大的性能成本,设计一个内置环境隔离功能的更好的操作系统不是更好吗?
我认为 Docker 看到了这一点,这就是他们提出容器的原因 - 但据我所知,这只是另一种解决方法(但性能成本较低)。
我是不是漏掉了什么?为什么操作系统不采用不需要虚拟化的方式呢?
*我知道虚拟机也可以用于实验,检查其他操作系统,但我更愿意谈论的是每个虚拟机都是独立服务器的服务器场景。
答案1
据我了解,我们使用虚拟机来隔离环境
没错。
...以便一个环境的配置不会破坏另一个环境。
这太狭隘了。隔离涉及广义上的安全性:机密性、完整性和可用性。
- 机密性:隔离提供细粒度的权限管理。虚拟机和 Docker 容器只能访问您明确允许其访问的数据和其他服务。
- 完整性:服务本身可以与逻辑和物理存储机制分离。
- 可用性:各个服务可以独立地重新配置、更新和重新启动。一个服务的崩溃不会影响其他服务。资源管理也更加灵活:您可以将一台物理机器的资源分配给多个服务,并动态管理分配的资源。在实际硬件上执行此操作并不容易,您无法将 CPU 热交换为更强大的 CPU(如果您想将更多资源分配给其他服务,则可以交换为更不强大的 CPU)。
在性能成本如此之大的情况下,实际上设计出一个具有内置环境隔离功能的更好的操作系统不是更好吗?
现代 CPU 支持虚拟化,例如 Intel CPU 中提供的 VT-x。它允许 CPU 运行虚拟机而不会对性能产生任何影响。
事实上...
Docker 看到了这一点,所以他们提出了容器
Docker 并不实现容器,它只使用主机操作系统提供的容器化功能。这只是一种配置它们协同工作并共享预构建服务镜像的便捷方式。仅举几个操作系统提供的功能,在 Linux 上,Docker 使用 overlayfs、cgroups 和 iptables。您无需安装 docker 即可使用所有这些功能。因此,Linux 具有内置的环境隔离功能,Docker 只是使其易于使用。
这里可能值得一提的是 Android,虽然它基于 Linux 内核,但使用 ART VM 运行时,并且比默认的“常规” GNU/Linux 提供更严格的应用程序隔离。
为什么操作系统不以不需要虚拟化的方式实现呢?
最初,它们在构建时并没有考虑到那么多的隔离,我们都习惯了这种模式。虽然不太安全,但也更舒适、更省事。让所有应用程序做所有事情,而不是手动管理细粒度的权限,这样更容易。缺乏严格的隔离是病毒能够造成巨大破坏以及 MS Word 能够将文档保存到硬盘上任何文件夹的原因。