运行存储在主机fs或内存中的容器时,Docker工件是否是?

上下文

我编写rails应用程序,在生产中进行页面片段caching(存储特定片段的html结果以避免重新计算)。

通常的做法是将片段存储在memcache或redis中。 rails中的默认caching存储选项是使用FScaching(将片段存储为文件),因为它具有没有依赖关系的优点(您不必configurationmemcache或redis)。 不过,这是一个不太受欢迎的select,因为它比内存caching慢,而且您必须手动清理caching,而可以使用memcache或充分configuration的redis来自动清除较旧的密钥。

在使用docker一段时间后,我意识到清除以前的caching文件不再是一个问题:在部署上,运行一个新的容器,自动删除所有以前的caching文件。 这可能比使用内存存储慢,但是这样做的好处是不需要任何configuration,这在引导快速端项目时非常酷。

但后来我想知道:是写在一个容器真的写在FS,还是写在内存,而不是? 这是一个值得关注的问题,因为这意味着依靠这个可以很快地使RAM饱和,尤其是在同一台服务器上的很多项目中。

这里的情况是,Docker正在做任何过程正在做的事情。 Docker只是运行进程的一种奇特的方式,而不是传统的虚拟机。 你可能知道,但我只是重申,为我的答案奠定基础。 Docker服从你的进程想要做的事情。 如果指定希望进程在磁盘上使用文件系统caching,并且该进程写入caching,则Docker将不会将该结果存储在内存中。 它将写入磁盘上的caching。 你是正确的,短暂的容器有你在这里提到的优点,当你启动一个新的容器时,文件caching被清除。

当你的进程写入磁盘时,Docker正在写入其特殊的UnionFS(可以使用几个不同的存储后端之一,如aufs或btrfs,有几种select)。 Docker使用这个“特殊”文件系统有两个原因:为了避免来自同一个基本映像的文件重复,以及从基本映像的共享层中隔离特定于你的进程的文件系统更改。 该机制的具体条款是写时复制 。 关键是,当Docker说它正在写入文件系统时,Docker正在做这件事。 它并不是将内容写入内存,而是像正在写入文件系统那样工作:它实际上是将内容写入磁盘。 存储驱动程序的主题是非常复杂的,但是这个东西的文档是精心编写的,正如所有Docker文档一般。 请放心,虽然没有什么魔法可以运行你的stream程。 你可以放心地假设Docker正在做它所做的事情。