在Docker中使用多个基本映像有什么影响?

时间:2013-09-03 21:15:51

标签: docker lxc

据我所知,docker容器可以在docker主机之间移植,但我对与Base Image和主机的关系感到困惑。

documentation on Images开始,如果您运行了各种基本映像,那么主机上的占用空间(类似于多个虚拟机)似乎要大得多。这个假设是否正确?

  • GOOD :许多容器共享一个基本图片。
  • BAD :许多容器运行单独/唯一的基本映像。

我确信很多这种混乱来自于我对LXC缺乏了解。

enter image description here

3 个答案:

答案 0 :(得分:29)

  

我对与基本图像和主机的关系感到困惑。

容器和主机之间的唯一关系是它们使用相同的内核。在Docker中运行的程序根本看不到主机文件系统,只能看到它们自己的文件系统。

  如果您运行了各种基本映像,那么您在主机上的占用空间会更大(类似于多个虚拟机)。这个假设是否正确?

没有。 Ubuntu基本映像大约150MB。但是你很难真正使用所有这些程序和库。您只需要一小部分用于任何特定目的。实际上,如果你的容器正在运行memcache,你可以只复制它需要的3或4个库,它大约是1MB。不需要shell等。未使用的文件只会耐心地放在磁盘上,完全被忽略。它们不会加载到内存中,也不会在磁盘上复制。

  

GOOD:许多容器共享一个基本图像。   坏:许多容器运行单独/唯一的基本图像。

没有。使用多个图像只会使用一点点RAM。 (显然,多个容器会占用更多磁盘空间,但磁盘很便宜,所以我们会忽略它)。所以我认为这是“好”而不是“坏”。

示例:我使用Memcached启动一个Ubuntu容器,使用Tomcat启动另一个Centos容器。如果他们同时运行Ubuntu,他们可以共享libc之类的内存。但由于它们不共享文件,因此每个基本映像必须加载它自己的libc副本。但正如我们所见,我们只谈论150MB的文件,而你可能只使用了其中的几个百分点。所以每个图像只浪费几MB的RAM。

(提示:在ps中查看您的流程。这就是它使用了多少RAM,包括其图像中的任何文件。)

答案 1 :(得分:2)

目前,Docker正在使用AUFS,这是一个使用写入副本的Union文件系统。

当您有多个基本映像时,这些映像占用磁盘空间,但是当您从这些映像运行N个容器时,不会使用实际磁盘。由于它是写时复制,因此只有修改过的文件才会占用主机空间。

所以,如果你有1或N个基本图像,无论你有多少个容器,它都不会改变。

图像只不过是一个你可以chroot的文件系统,图像和主机之间绝对没有关系,除了它需要是linux二进制形式的同一架构。

答案 2 :(得分:0)

我认为多个基本图像对使用的内存影响很小。

说明:

我认为你与VM的比较有点误导。当然,如果是f.e.运行3个基本映像,与只有1个基本映像的情况相比,您将拥有更高的内存要求,但虚拟机将具有更高的内存要求:

粗略计算 - Docker,M图像,N个容器:

  • 1 x基本图像+ N x容器(文件系统+工作记忆)
  • M x大小的基本图像+ N x容器(文件系统+工作记忆)

计算 - 虚拟机:

  • N x VM image =特定VM的基本映像的至少N x大小+容器的N x大小(文件系统的大小+工作内存)

为了获得优势,你必须拥有M<< N. 对于小型M和大型N,docker和多个VM之间的区别很大。