在Docker中,来宾操作系统与Host OS共享相同的内核。
有人可以详细说明。
让我拥有一些内核版本的centos os,当我们拉ubuntu图像然后它有不同的内核时,那怎么能说它们有相同的内核呢?
答案 0 :(得分:18)
当我们拉ubuntu图像时,它有不同的内核
不,它没有:它没有内核部分:它依赖于所有 system calls 的主机内核(运行docker引擎的内核)。
如“Docker vs Virtualization”中所述:
最初,Docker是作为Linux容器(LXC)之上的抽象层构建的。 LXC本身只是Linux收容功能的一个API 从Docker 0.9开始,LXC不再是默认设置,并且已经被用Go编写的自定义库(libcontainer)取代。整体libcontainer的优势是在各种Linux发行版中更加一致的内核接口。唯一的问题是它需要Linux 3.8及更高版本。
点击“Why Understanding User Space vs. Kernel Space Matters”了解更多信息 另外“Operating System Containers vs. Application Containers”:
容器是操作系统虚拟化的产物。它们提供了一个轻量级的虚拟环境,可以从主机和任何其他容器中分离和隔离一组进程和资源,如内存,CPU,磁盘等。
隔离保证容器内的任何进程都无法看到容器外的任何进程或资源。
OS容器是共享主机操作系统内核但提供用户空间隔离的虚拟环境
如“Do all Linux distros use the same kernel?”中所述,即使每个发行版都有自己的内核配置,也可以在发行版中共享内核。
如果您需要更多隔离,请考虑 gVisor (https://github.com/google/gvisor),这是一个容器沙箱运行时,专注于安全性,效率和易用性。 (2018)。
见架构:
gVisor拦截应用程序系统调用并充当来宾内核,而无需通过虚拟化硬件进行转换。
gVisor可以被认为是合并的客户内核和VMM,或者是类固醇的seccomp。 这种架构允许它提供灵活的资源占用空间(即基于线程和内存映射,而不是固定的客户物理资源),同时还降低了虚拟化的固定成本。 但是,这是以降低应用程序兼容性和更高的每系统调用开销为代价的。
答案 1 :(得分:1)
Docker之前使用的是LinuX容器(LXC),但切换到runC(以前称为libcontainer),它运行在与其主机相同的操作系统中。这允许它共享许多主机操作系统资源。它还使用像AuFS这样的分层文件系统。它还为您管理网络。
AuFS是一个分层文件系统,因此您可以拥有只读部分和写入部分,并将它们合并在一起。因此,您可以将操作系统的公共部分设置为只读,这些部分在所有容器之间共享,然后为每个容器提供自己的挂载以供写入。
因此,假设您有一个1GB大小的容器图像。如果要使用完整虚拟机,则需要1GB倍x所需的虚拟机数量。使用LXC和AuFS,您可以共享1GB的大部分内容,如果您有1000个容器,那么容器操作系统的空间可能只有1GB以上,假设它们都运行相同的操作系统映像。