18

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

Images 上的文档看来,如果您运行了各种基本映像,那么主机上的占用空间似乎会更大(类似于多个 VM)。这个假设正确吗?

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

我敢肯定,很多这种困惑来自我对 LXC 的缺乏了解。

在此处输入图像描述

4

3 回答 3

30

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

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

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

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

好:许多容器共享一个基础镜像。不好:许多容器运行单独/唯一的基本映像。

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

示例:我用 Memcached 启动一个 Ubuntu 容器,用 Tomcat 启动另一个 Centos 容器。如果他们都运行 Ubuntu,他们可以共享 RAM 用于libc. 但是因为他们不共享文件,所以每个基础镜像都必须加载它自己的libc. 但正如我们所见,我们只讨论了 150MB 的文件,而您可能只使用了其中的百分之几。所以每个图像只浪费几 MB 的 RAM。

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

于 2013-09-20T18:19:24.527 回答
2

目前,Docker 正在使用 AUFS,这是一个使用写入时复制的联合文件系统。

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

所以真的,如果你有 1 个或 N 个基础镜像,它不会改变任何东西,无论你有多少容器。

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

于 2013-09-17T21:41:11.630 回答
0

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

解释:

我认为您与 VM 的比较有点误导。当然,在运行 fe 3 个基本映像的情况下,您的内存需求将比仅 1 个基本映像的情况更高,但 VM 的内存需求会更高:

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

  • 1 x 基础镜像 + N x 容器(文件系统 + 工作内存)
  • M x 基础镜像大小 + N x 容器(文件系统 + 工作内存)

计算 - 虚拟机:

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

为了让 docker 获得优势,你必须有 M << N。对于小 M 和大 N,docker 和多个 VM 之间的差异是显着的。

于 2013-09-17T16:18:58.560 回答