容器与虚拟机的简单直观比较:虚拟机是房子,容器是帐篷! - increment

21-06-12 banq

可以这样想:如果 VM 就像房子,那么容器就像帐篷。你可以试着把所有的家具都装进去,但考虑到物质和时空的限制,你最好只试着把你需要的东西装进去。帐篷很轻——可以快速搭起和拉下——但你可能会感觉到风在摇晃帐篷杆。雨不会进来,但帐篷不会像砖墙和屋顶那样御寒。

如果你想在帐篷里塞满一栋带车库的两居室联排别墅里面家居,那么也许你真正需要的是带车库的两居室联排别墅。就像我们可以编译代码以将所有依赖项静态链接到单个二进制文件中一样,容器提供了一种方法来静态链接您的代码可能具有的所有运行时依赖项。就像您不希望编译器包含整个操作系统一样,容器镜像Image不应该是与应用程序代码打包在一起的操作系统副本。 

容器镜像Image中的二进制文件和文件越多,尤其是那些提供内核接口的二进制文件,就越有机会通过帐篷墙逃离容器。当在同一主机或 VM 上运行多个容器时,这一点尤其重要。毕竟,帐篷并不是存放贵重物品的特别安全的地方。但是,您别墅客厅里的贵重物品?相当安全。

从安全角度来看,容器很有用,因为它们提供了非常有限的攻击面(即可以利用的二进制文件数量要少得多),以及一种对程序运行所需的所有内容进行版本控制的方法,以及代码本身。如果您将容器Image膨胀很大,您将失去这一优势,并最终获得一个不太安全、较慢的操作系统近似值。如果您需要的是轻量级操作系统,那么容器不是您的最佳选择。 

最后,还有资源隔离的整个业务。虽然 cgroup 作为一种隔离机制非常简洁,但它们并不是针对嘈杂邻居的硬件级别保证隔离。因为 cgroup 是后来添加到内核中的,所以在做出系统范围的资源管理决策时并不总是能够确保将它们考虑在内。

没有人会争辩说帐篷与实体房屋的用途相同:

通过将您的进程与操作系统隔离开来,将其包装在命名空间和权限中,并将其与其运行时依赖项捆绑在一起,容器提供了强大的执行原语。只要我们不指望深入到基石的基础,容器就可以成为非常有价值的工具。与任何技术一样,诀窍是知道何时使用它们。

 

猜你喜欢