Docker会给RAM多余的里程吗?

根据 | 到 | 无数 | Docker通过跨容器共享系统资源来提供超轻量级的虚拟化,而不是为每个容器分配这些资源的副本。

我甚至读过那些吹嘘自己可以“ 在同一个虚拟机上运行几十个,甚至几百个容器”的文章。

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

Docker是否会用RAM做一些神奇的事情,让我真的可以运行几十个容器,每个容器都分配了2GB的内存,但不知何故在底层共享了未使用的内存?

还是那些声明比其他任何媒体炒作都要多?

当人们谈论运行“几十个或几百个容器”时,他们通常会想到微服务; 执行特定任务的小型应用程序。 其中每一个都可能有内存使用量以KB为单位,而不是MB,可能不是GB,因此没有理由体面的机器不能运行几十或几百个。

实际上有一个竞赛 (我认为它正在进行),尽可能多地在Raspberry Pi上运行集装箱。 目前的结果已经超过了一千个,但是这些容器并不是真正的应用程序。

关于记忆,答案是“它很复杂”。 如果您使用的是AUFS或Overlay驱动程序,则具有相同基本映像的容器应该能够共享“内存页面”; 这意味着共享库不需要为两个容器加载两次。 这不是特别的东西, 在主机上运行的正常进程将以同样的方式工作。

在一天结束的时候,容器只不过是孤立的过程。 我们可以轻松地在主机上运行数十个或数百个进程,因此运行数十个或数百个容器并非不可行。

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

另一种select是虚拟机。 您运行的每个虚拟机都必须运行完整的Linux内核,主机操作系统将为虚拟化环境保留一块内存。 这意味着,除了最重的硬件之外,你只能运行几台虚拟机。

一个容器不运行一个内核 – 它只运行一个进程(加上subprocess)。 这意味着如果你运行的是没有容器的相同进程,你可以在容器中运行尽可能多的进程 – 每个进程都认为它在单独的机器上运行,但是它们都只是在主机内核上显示为进程。

没有什么魔法可以让你使用RAM几十次。 但是,你可以将更小的进程打包在一起,而不是使用虚拟机进行分离。