Docker如何共享资源

Posted

技术标签:

【中文标题】Docker如何共享资源【英文标题】:How does Docker share resources 【发布时间】:2014-11-28 16:22:51 【问题描述】:

我一直在研究 Docker,我从 this post 了解到,运行多个 docker 容器意味着要快,因为它们通过“LXC 主机”共享内核级资源,但是,我还没有找到任何关于这种关系是如何工作的,具体到 docker 配置,以及在什么级别共享资源。

Docker镜像和Docker容器共享资源有什么关系,资源是如何共享的?

编辑:

当谈到共享资源的“内核”时,这是哪个内核?它是指主机操作系统(docker 二进制文件所在的级别)还是指容器所基于的映像的内核?基于不同Linux发行版的容器不会需要运行在不同类型的内核上吗?

编辑 2:

最后的编辑让我的问题更清楚一点,我很好奇 docker 是否真的没有运行映像的完整操作系统,正如他们在“Docker 与虚拟机”

下面的说法似乎与上图矛盾,taken from here:

容器由操作系统、用户添加的文件和 元数据。正如我们所见,每个容器都是从一个镜像构建的。

【问题讨论】:

Docker 容器都在同一个内核中运行,而虚拟机则为每个来宾运行一个内核。所以,就内核中的哪些资源是共享的而言......真的,那将是绝对所有,除了那些在命名空间中彼此远离的项目(非共享挂载、进程树条目、 cgroups 等)。 如果你想深入了解,几乎任何 LXC 介绍都可以。 我已经修改了我的答案以涵盖您的编辑,希望这使主机/内容分离更加清晰 【参考方案1】:

严格来说,Docker 不再需要使用用户工具 LXC。它仍然使用与其内部容器库 libcontainer 相同的底层技术。实际上 Docker 可以使用各种系统工具进行进程和内核之间的抽象: 对于不同的发行版,内核不必不同——但你不能运行非 Linux 操作系统。主机和容器的内核是相同的,但它支持一种上下文感知,将它们彼此分开。

每个容器在内核之外的各个方面都包含一个单独的操作系统。它有自己的用户空间应用程序/库,并且就所有意图和目的而言,它的行为就像拥有自己的内核一样。

【讨论】:

谢谢@peter-r,容器是运行镜像操作系统的所有进程还是只需要那些 docker 确定的进程?例如,docker 是启动 init 还是启动它需要运行的任何进程? @blankenshipz 好吧,一切的设置方式有所不同,但我不确定这些是什么 - 基本上是让事情正常工作所需的设置,这就是为什么你不能放弃任何linux 镜像到一个目录并运行它。容器的东西也必须在主机端配置,lxc-create 处理所有这些,或者在libcontainer下使用 docker 创建东西@ @blankenshipz 每个容器都以自己的 init 启动。在 LXC 的情况下,这是由主机上的 lxc-start 启动的。从主机可以看到所有容器的进程,但从容器中只能看到它们的进程。【参考方案2】:

与其说共享哪些资源,不如说共享哪些资源。 LXC 通过设置可见性受限的命名空间来工作——进入进程表、挂载表、网络资源等——但任何没有明确限制和命名空间的东西都是共享的。 p>

当然,这意味着所有这些组件的后端也是共享的——您不需要假装每个访客拥有一组不同的页表,因为您不需要假装运行多个核心;它都是相同的内核,所有相同的内存分配池,所有相同的硬件设备都在进行位旋转(相对于虚拟机的模拟硬件的所有开销,并且让每个来宾分别旋转其虚拟设备);相同的块缓存;等等等等等等。

坦率地说,这个问题几乎无法回答,因为关于共享什么的唯一真正答案是“几乎所有内容”,以及如何共享它是“首先不做重复的工作”(就像传统的虚拟机通过模拟硬件而不是只共享一个与真实硬件交互的内核所做的那样)。这也是为什么内核漏洞在基于 LXC 的系统中如此危险的原因——它都是一个内核,因此一个容器中的 ring 0 和另一个容器中的 ring 0 之间没有明显的区别。

【讨论】:

以上是关于Docker如何共享资源的主要内容,如果未能解决你的问题,请参考以下文章

如何快速清理docker资源

如何将 python 库从主机共享到多个 docker 容器?

如何共享数据?- 每天5分钟玩转 Docker 容器技术(41)

如何共享数据?- 每天5分钟玩转 Docker 容器技术(41)

Docker容器间中的数据如何共享?

text #Docker - 如何清理(未使用)资源