2

我想了解什么是容器,它们的目的是什么?

我有点困惑。当我开始阅读它们时,我发现它们依赖于 Linux 命名空间(是真的吗?)——一种将容器内的进程与机器上的其他进程隔离开来的方法,并且给人的印象是它们的主要目的是安全.

例如,假设我拥有一台运行多个服务的服务器。我也不希望一个被黑的服务就能黑掉整个系统。因此,我将每个服务都放在一个容器中,使该服务无法干扰机器内的其他进程,例如杀死它们或玩弄它们的内存,从而消除风险。

但后来我看到了其他用途,比如能够轻松发布应用程序?或类似的东西。那么他们的主要目的是什么?我还读到,如果他们的主要目的是安全——他们就有问题。因为它们直接在主机内核上运行(再次,这是真的吗?) - 并且像“脏牛”这样的漏洞将会或能够离开容器并能够破坏机器。所以我结束了关于 gVisor 的阅读——据我所知,它试图保护容器,并且在某些情况下成功。那么 - gVisor 有什么不同呢?它能够保护容器吗?gVisor 本身是一个容器吗?还是只是容器的运行时环境?

最终,我总是看到容器和 VM 之间的比较,我问为什么?我应该什么时候使用它们?

我不知道我写的任何内容是否正确,如果您能指出我的错误并回答我的问题,我将很高兴。是的,我知道有很多,我很抱歉,但谢谢!

4

1 回答 1

1

不保证下面的答案是简洁的。欢迎任何人指出我的错误。

这可能有点模糊,因为现在很多人混合了这样的概念。

1.LXC

当我第一次了解这些概念时,容器仍然意味着LXC,这是 Linux 中长期存在的技术。恕我直言,容器是一个不模拟内核的完整进程。容器和普通进程的区别在于容器通过 cgroups 提供了一个孤立的视图,就好像它在一个新的操作系统中一样。但实际上,容器仍然共享主机内核(你是对的),所以人们确实担心安全性,尤其是当你想将它部署在公共云中时(我还没有看到人们直接在公共云上使用 LXC )。

尽管存在潜在的不安全性,但在大多数对安全不敏感的情况下,容器的便利性和轻量性(快速启动、小内存指纹)似乎超过了它的缺点。docker 和 kubernetes 等工具使大规模部署和管理更加高效。

2. 虚拟机和硬件辅助虚拟化

与容器相比,虚拟机的概念代表了另一类隔离的执行环境。考虑到大多数虚拟机都利用了一些硬件加速技术,如 VT-x,我假设您正在谈论硬件辅助虚拟化。虚拟机内部通常包含一个完整的内核

看这张来自道格·张伯伦的照片 在此处输入图像描述

Intel VT-x 技术提供2 种模式,root模式(特权)和非root 模式(非特权)。每个模式都有自己的 ring0-ring3(例如,非根 ring3、非根 ring0、根 ring3、根环 0)。整个虚拟机运行在非root模式,hypervisor(VMM,例如kvm)运行在root模式。

在经典的 qemu+kvm 设置中,qemu 在 root ring3 中运行,kvm 在 root ring0 中运行。

来宾内核的强隔离和存在使虚拟机更加安全和兼容。但是,当然,代价是性能和效率(启动速度较慢等)

基于容器的虚拟化

人们想要硬件辅助虚拟化的隔离,但又不想放弃容器的便利性。因此,混合解决方案似乎真的很直观。

目前有2个典型的解决方案,Kata Container和[gVisor][6]

Kata Container 试图精简整个虚拟机堆栈,使其更轻量级。不过里面还是有linux的,还是个虚拟机,但是更轻量级。

gVisor 声称是一个安全容器,但它仍然利用硬件虚拟化技术(如果您不想要虚拟化,则使用 ptrace)。有一个名为sentry的组件,它在非根 ring0 和根 ring3 中运行。sentry 将完成来宾内核的部分工作,但比 linux 小得多。如果 sentry 自己无法完成请求,它会将请求代理到主机 kenrel。

大多数人认为 gvisor 更安全的原因是它实现了“纵深防御”——更多的间接层使人们相信它更安全。这通常是正确的,但同样不能保证。

于 2019-07-19T07:25:13.263 回答