【发布时间】:2015-09-24 08:41:09
【问题描述】:
在 Docker 中,guest OS 与 Host OS 共享相同的内核。
谁能详细说明一下。
让我有一些内核版本的centos os,当我们拉取ubuntu镜像时它有不同的内核,那么我们怎么能说它们有相同的内核呢?
【问题讨论】:
标签: docker virtualization
在 Docker 中,guest OS 与 Host OS 共享相同的内核。
谁能详细说明一下。
让我有一些内核版本的centos os,当我们拉取ubuntu镜像时它有不同的内核,那么我们怎么能说它们有相同的内核呢?
【问题讨论】:
标签: docker virtualization
当我们拉取 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、磁盘等)与主机和任何其他容器进行分组和隔离。
隔离保证容器内的任何进程都看不到容器外的任何进程或资源。
操作系统容器是共享宿主操作系统内核但提供用户空间隔离的虚拟环境
如“Do all Linux distros use the same kernel?”中所述,内核可以跨发行版共享,即使每个发行版都有自己的内核配置。
如果您需要更多隔离,请考虑 gVisor (https://github.com/google/gvisor),这是一个专注于安全性、效率和易用性的容器沙箱运行时。 (2018 年)。
参见架构:
gVisor 拦截应用程序系统调用并充当客户内核,无需通过虚拟化硬件进行转换。
gVisor 可以被认为是合并的客户内核和 VMM,或者是类固醇上的 seccomp。
这种架构允许它提供灵活的资源占用(即基于线程和内存映射,而不是固定的客户物理资源),同时还降低了虚拟化的固定成本。
然而,这是以降低应用程序兼容性和更高的每个系统调用开销为代价的。
【讨论】:
Docker 之前使用的是 Linux Containers (LXC),但改用了 runC(以前称为 libcontainer),它在与其主机相同的操作系统中运行。这允许它共享大量的主机操作系统资源。它还使用像 AuFS 这样的分层文件系统。它还为您管理网络。
AuFS 是一个分层文件系统,因此您可以拥有一个只读部分和一个写入部分,并将它们合并在一起。因此,您可以将操作系统的公共部分设为只读,在所有容器之间共享,然后为每个容器提供自己的挂载以供写入。
假设您有一个大小为 1GB 的容器映像。如果您想使用完整的虚拟机,则需要 1GB 乘以您想要的虚拟机数量。使用 LXC 和 AuFS,你可以共享 1GB 的大部分空间,如果你有 1000 个容器,你可能仍然只有 1GB 多一点的空间用于容器操作系统,假设它们都运行相同的操作系统映像。
【讨论】: