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

我明白docker容器在Docker主机之间是可移植的,但是我对与Base Image和主机的关系感到困惑。

从图像上的文档看来,如果你有多种基本的图像在运行的话,你将会在主机上看到更重的脚印(类似于多个虚拟机)。 这个假设是正确的吗?

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

我相信很多这种困惑来自于我对LXC的认识不足。

在这里输入图像说明

我很困惑与基础图像和主机的关系。

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

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

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

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

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

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

(提示:在ps查看你的进程,这就是它使用的RAM数量,包括图像中的所有文件。)

目前,Docker使用的AUFS是联盟文件系统使用写入副本。

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

所以,如果你有1或N个基本的图像,它不会改变,不pipe你有多less容器。

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

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

说明:

我认为你和VM的比较有点误导。 当然,如果运行的是3个基本映像,那么与仅有1个基本映像的情况相比,内存要求会更高,但虚拟机的内存要求会更高:

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

  • 1个基本映像+ N个容器(文件系统+工作内存)
  • M x基本映像的大小+ N x容器(文件系统+工作内存)

计算 – 虚拟机:

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

对于docker工人来说,要获得优势,你必须有M << N。对于docker工和多个VM之间的小M和大N差别是非常重要的。