According | to | countless | sources,Docker通过跨容器共享系统资源来提供超轻量级虚拟化,而不是为每个容器分配这些资源的副本。
我甚至读过一些文章,据说你可以“在同一个虚拟机上运行数十个甚至数百个容器。”
但是如果我的应用程序需要运行2GB内存,并且底层物理机只有8GB内存,我通常只能在其上运行3个应用程序实例(系统内存约为2GB,实用程序,等)。
Docker是否对RAM做了一些魔术,允许我实际运行数十个容器,每个容器分配2GB内存,但不知何故共享未使用的内存?
或者这些陈述是否比其他任何媒体炒作更多?
答案 0 :(得分:1)
当人们谈论运行"数十个或数百个容器" 时,他们通常会考虑微服务;执行特定任务的小型应用程序。其中每一个都可能以KB而不是MB来衡量内存使用量,而且可能不是GB,因此没有理由让一台体面的机器运行数十或数百台。
实际上有competition(我认为它正在进行中)以在Raspberry Pi上运行尽可能多的容器。结果目前超过一千,但不可否认,这些容器不会运行真实的应用程序。
关于记忆,答案是"它很复杂"。如果您正在使用AUFS或Overlay驱动程序,具有相同基本映像的容器应该能够共享内存页面&#34 ;;意味着共享库不需要为两个容器加载两次。这不是特别的事情;在主机上运行的正常进程将以相同的方式工作。
在一天结束时,容器只是孤立的过程。我们可以轻松地在主机上运行数十个或数百个进程,因此运行数十个或数百个容器并不是不可行。
答案 1 :(得分:0)
Docker容器仅在需要时消耗所需的资源。所以是的,你可以在一个盒子上运行数百台机器,只要它们不是都在积极地消耗你的资源。这就是Docker的独特之处;事实上,容器将使用它可以使用的资源,然后释放它们,使它们可用于同一主机上的另一个容器。最好让容器和Docker处理分配资源,而不是对它们进行硬分配。
答案 2 :(得分:0)
替代方案是虚拟机。您运行的每个虚拟机都必须运行完整的Linux内核,主机操作系统将为虚拟化环境保留一大块内存。这意味着除了最重的硬件外,你真的只能运行几个虚拟机。
容器不运行内核 - 它只运行一个进程(加上子进程)。这意味着如果您在没有容器的情况下运行相同的进程,您可以在容器中运行尽可能多的进程 - 每个进程都认为它在单独的机器上运行,但它们都只是作为主机内核上的进程显示。
没有什么魔法会让你能够使用RAM几十次。但是,您可以将较小的进程打包在一起,比使用虚拟机进行分离更紧凑。