我知道 docker 容器在 docker 主机之间是可移植的,但我对与 Base Image 和主机的关系感到困惑。
从Images 上的文档看来,如果您运行了各种基本映像,那么主机上的占用空间似乎会更大(类似于多个 VM)。这个假设正确吗?
- 好:许多容器共享一个基础镜像。
- BAD:许多容器运行单独/唯一的基本映像。
我敢肯定,很多这种困惑来自我对 LXC 的缺乏了解。
我知道 docker 容器在 docker 主机之间是可移植的,但我对与 Base Image 和主机的关系感到困惑。
从Images 上的文档看来,如果您运行了各种基本映像,那么主机上的占用空间似乎会更大(类似于多个 VM)。这个假设正确吗?
我敢肯定,很多这种困惑来自我对 LXC 的缺乏了解。
我对与基本映像和主机的关系感到困惑。
容器和主机之间的唯一关系是它们使用相同的内核。在 Docker 中运行的程序根本看不到主机文件系统,只能看到自己的文件系统。
如果您正在运行各种基本映像,那么主机上的占用空间似乎会更大(类似于多个 VM)。这个假设正确吗?
不,Ubuntu 基础镜像大约是 150MB。但是你很难真正使用所有这些程序和库。对于任何特定目的,您只需要一小部分。事实上,如果你的容器正在运行 memcache,你可以只复制它需要的 3 或 4 个库,大约 1MB。不需要外壳等。未使用的文件将耐心地放在磁盘上,完全被忽略。它们不会加载到内存中,也不会在磁盘上复制。
好:许多容器共享一个基础镜像。不好:许多容器运行单独/唯一的基本映像。
不会。使用多个图像只会使用一点点 RAM。(显然,多个容器会占用更多磁盘空间,但磁盘很便宜,所以我们将忽略它)。所以我认为这是“OK”而不是“BAD”。
示例:我用 Memcached 启动一个 Ubuntu 容器,用 Tomcat 启动另一个 Centos 容器。如果他们都运行 Ubuntu,他们可以共享 RAM 用于libc
. 但是因为他们不共享文件,所以每个基础镜像都必须加载它自己的libc
. 但正如我们所见,我们只讨论了 150MB 的文件,而您可能只使用了其中的百分之几。所以每个图像只浪费几 MB 的 RAM。
(提示:查看你的进程ps
。这就是它使用的 RAM 量,包括它的图像中的任何文件。)
目前,Docker 正在使用 AUFS,这是一个使用写入时复制的联合文件系统。
当您有多个基本映像时,这些映像会占用磁盘空间,但是当您从这些映像运行 N 个容器时,并没有实际使用磁盘。由于它是写时复制,因此只有修改过的文件才会占用主机空间。
所以真的,如果你有 1 个或 N 个基础镜像,它不会改变任何东西,无论你有多少容器。
映像只不过是一个可以 chroot 的文件系统,映像和主机之间绝对没有关系,除了它需要是相同架构的 linux 二进制文件。
我认为多个基本图像对使用的内存影响很小。
解释:
我认为您与 VM 的比较有点误导。当然,在运行 fe 3 个基本映像的情况下,您的内存需求将比仅 1 个基本映像的情况更高,但 VM 的内存需求会更高:
粗略计算 - Docker,对于 M 个图像,N 个容器:
计算 - 虚拟机:
为了让 docker 获得优势,你必须有 M << N。对于小 M 和大 N,docker 和多个 VM 之间的差异是显着的。