不保证下面的答案是简洁的。欢迎任何人指出我的错误。
这可能有点模糊,因为现在很多人混合了这样的概念。
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 更安全的原因是它实现了“纵深防御”——更多的间接层使人们相信它更安全。这通常是正确的,但同样不能保证。