在 Docker 中使用多个基础镜像有啥影响?
Posted
技术标签:
【中文标题】在 Docker 中使用多个基础镜像有啥影响?【英文标题】:What is the impact of using multiple Base Images in Docker?在 Docker 中使用多个基础镜像有什么影响? 【发布时间】:2013-09-07 05:46:12 【问题描述】:我知道 docker 容器在 docker 主机之间是可移植的,但我对 Base Image 和主机的关系感到困惑。
从documentation on Images 看来,如果您正在运行各种基本映像,那么主机上的占用空间似乎会更大(类似于多个 VM)。这个假设正确吗?
良好:许多容器共享一个基础映像。 糟糕:许多容器运行单独/唯一的基础映像。我敢肯定,这种困惑很大程度上源于我对 LXC 的了解不足。
【问题讨论】:
我刚刚意识到上图有一个错字指的是“lcx”而不是“lxc” 【参考方案1】:我对基本映像和主机的关系感到困惑。
容器和主机之间的唯一关系是它们使用相同的内核。在 Docker 中运行的程序根本看不到宿主文件系统,只能看到自己的文件系统。
如果您运行各种基本映像,您的主机上的占用空间似乎会更大(类似于多个虚拟机)。这个假设正确吗?
没有。 Ubuntu 基础镜像大约 150MB。但是您很难真正使用所有这些程序和库。对于任何特定目的,您只需要一小部分。事实上,如果你的容器正在运行 memcache,你可以只复制它需要的 3 或 4 个库,大约 1MB。不需要外壳等。未使用的文件将耐心地放在磁盘上,完全被忽略。它们不会加载到内存中,也不会复制到磁盘上。
GOOD:许多容器共享一个基础镜像。 不好:许多容器运行单独/唯一的基本映像。
没有。使用多个图像只会使用一点点 RAM。 (显然,多个容器会占用更多磁盘空间,但磁盘很便宜,所以我们将忽略它)。所以我认为这是“OK”而不是“BAD”。
示例:我用 Memcached 启动一个 Ubuntu 容器,用 Tomcat 启动另一个 Centos 容器。如果他们都运行 Ubuntu,他们可以共享 RAM 用于 libc
之类的东西。但是因为他们不共享文件,所以每个基础镜像都必须加载它自己的libc
副本。但正如我们所见,我们只讨论了 150MB 的文件,而您可能只使用了其中的百分之几。所以每张图片只浪费几MB的内存。
(提示:查看ps
中的进程。这是它使用的 RAM 量,包括它的映像中的任何文件。)
【讨论】:
【参考方案2】:目前,Docker 正在使用 AUFS,这是一个使用写入时复制的联合文件系统。
当您有多个基础映像时,这些映像会占用磁盘空间,但是当您从这些映像运行 N 个容器时,并没有实际使用磁盘。由于它是写时复制,因此只有修改过的文件才会占用主机空间。
所以说真的,如果你有 1 个或 N 个基础镜像,无论你有多少个容器,它都不会改变。
镜像只不过是一个可以chroot的文件系统,除了它需要是Linux二进制形式的相同架构之外,镜像和主机之间绝对没有关系。
【讨论】:
我的回答是同样的意思,但你的解释可能更好。无论如何,我认为磁盘空间与工作内存无关紧要。如果有 N 个基础镜像 - 每个基础镜像 1 个容器,工作内存需求会显着增加,因为 chroot 环境不会被共享。 问题,假设我使用卷挂载来写入我的所有数据并假设卷挂载实际上是一个 nfs 共享,如果我从 1 个基本映像运行 N 个容器,这样说是否正确假设写入的任何数据都写入 nfs 卷挂载,那么使用的空间将为零或非常可忽略不计?【参考方案3】:我认为多个基本图像对使用的内存影响很小。
解释:
我认为您与 VM 的比较有点误导。当然,如果是 f.e.运行 3 个基本映像时,您的内存需求将高于仅 1 个基本映像的情况,但虚拟机的内存需求会更高:
粗略计算 - Docker,用于 M 个图像,N 个容器:
1 x 基础镜像 + N x 容器(文件系统 + 工作内存) M x 基础镜像大小 + N x 容器(文件系统 + 工作内存)计算 - 虚拟机:
N x VM 映像 = 至少 N x 特定 VM 的基本映像大小 + N x 容器大小(文件系统大小 + 工作内存)要让 docker 获得优势,你必须有 M
【讨论】:
以上是关于在 Docker 中使用多个基础镜像有啥影响?的主要内容,如果未能解决你的问题,请参考以下文章