Docker 是否给 RAM 额外里程?

Does Docker give RAM extra mileage?

According | to | countless | sources、Docker 通过跨容器共享系统资源来提供超轻量级虚拟化,而不是为每个容器分配这些资源的副本。

我什至读过一些文章,其中吹嘘您可以“运行 数十个,甚至数百个容器在同一个 VM 上。

但是如果我的应用程序需要 2GB RAM 才能 运行,而底层物理机只有 8GB RAM,我通常只能 运行 我的应用程序的 3 个实例在上面(为系统内存、实用程序等留下 ~2GB)。

Docker 是否对 RAM 做了某种魔法,让我 实际上 运行 几十容器,每个都分配了 2GB RAM,但不知何故在引擎盖下共享未使用的内存?

或者这些声明比其他任何东西都更像是媒体炒作?

当人们谈论 运行ning "dozens or hundreds of containers" 时,他们通常会想到微服务;执行特定任务的小型应用程序。其中每一个的内存使用量都可能以 KB 而不是 MB 为单位,并且可能不是 GB,因此没有理由像样的机器不能 运行 数十或数百个。

实际上有一个 competition(我认为它正在进行中)以在 Raspberry Pi 上获得尽可能多的容器 运行。目前的结果超过一千,但诚然,这些容器不会 运行 成为现实生活中的应用程序。

关于内存,答案是"it's complicated"。如果您使用的是 AUFS 或 Overlay 驱动程序,具有相同基础映像的容器应该能够共享 "memory pages";这意味着共享库不需要为两个容器加载两次。但这并不是什么特别的东西;主机上的正常进程 运行ning 将以相同的方式工作。

归根结底,容器只不过是孤立的进程。我们可以很容易地运行一台主机上几十个上百个进程,那么运行几十个上百个容器也不是不可行。

一个Docker容器只在需要时消耗它需要的资源。所以是的,你可以在一个盒子上 运行 数百台机器,只要它们不都在积极消耗你的资源。这就是 Docker 独一无二的原因;事实上,容器将使用它可以使用的资源,然后释放它们,使它们可用于同一主机上的另一个容器。最佳做法是让容器和 Docker 处理资源分配,而不是对它们进行硬分配。

备选方案是虚拟机。您 运行 的每个虚拟机都必须 运行 一个完整的 linux 内核,并且主机 OS 将为虚拟化环境保留一块内存。这意味着您实际上只能 运行 在除最重型硬件以外的所有硬件上使用几个虚拟机。

容器不是 运行 内核 - 它只是 运行 一个进程(加上子进程)。这意味着您可以在容器中 运行 尽可能多的进程,如果您在没有容器的情况下 运行ning 那些相同的进程 - 每个人都认为它是 运行 在单独的机器上,但他们所有都只是在主机内核上显示为进程。

没有什么魔法能让您多次使用 RAM。但是你可以将较小的进程打包在一起,比使用虚拟机进行分离要紧密得多。