容器中的共享库

对于两个进程A和B,两者都使用库libc.so,libc.so只被加载到内存一次。 当A和B都运行在相同的主机和相同的rootfs上时,这是正常情况。

当涉及到容器时,如果A和B在不同的容器中运行,A和B是否共享相同的内存区域?

例如

imageA

–libc.so

–programA

imageB

–libc.so

–programB

我们使用chroot在不同的rootfs中运行A和B. 这两个libc.so是一样的。 将libc.so加载到内存两次?

实际上,使用共享库libc.so的进程A和B 可以共享相同的内存。 有点不直观,这取决于你正在使用哪个docker存储驱动程序。 如果您使用的存储驱动程序可以将共享库文件作为源于同一设备/ inode的共享库文件驻留在同一个泊坞窗图层中,则它们将共享相同的虚拟内存caching页面。 当使用aufs,overlay或overlay2存储驱动程序时,共享库将共享内存,但在使用任何其他存储驱动程序时,则不会。

我不知道为什么这个细节没有在Docker文档中更加明显。 或者,也许是,但我错过了它。 这似乎是一个关键的区别,如果你想运行密集的容器。

他们不会共享相同的RAM区域; 这就是虚拟化(带有容器)的目的 – 用于(内存)资源隔离等等。 更多的,看看内存cgroups。 这里有很好的animation链接。