据我所知,docker容器可以在docker主机之间移植,但我对与Base Image和主机的关系感到困惑。
从documentation on Images开始,如果您运行了各种基本映像,那么主机上的占用空间(类似于多个虚拟机)似乎要大得多。这个假设是否正确?
我确信很多这种混乱来自于我对LXC缺乏了解。
答案 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个容器:
计算 - 虚拟机:
为了获得优势,你必须拥有M<< N. 对于小型M和大型N,docker和多个VM之间的区别很大。