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

时间:2016-02-10 11:20:34

标签: docker

上下文

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

通常的方法是将片段存储在memcache或redis中。 rails中的默认缓存存储选项是使用FS缓存(将片段存储为文件),因为它具有不依赖的优点(您不必配置memcache或redis)。但是,这是一个不太受欢迎的选项,因为它比内存缓存慢,你必须手动清理缓存,而你可以依靠旧密钥使用内存缓存或充分配置的redis自动清除。

问题

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

但后来我想知道:是在fs中写入容器fs,还是在RAM中写入,而不是?这是一个问题,因为这意味着依赖于这可能会很快使RAM饱和,特别是在同一台服务器上的许多项目都这样做。

1 个答案:

答案 0 :(得分:3)

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

当你的进程写入磁盘时,Docker正在写入其特殊的UnionFS(可以使用一些不同的存储后端,例如aufs或btrfs,有几种选择)。 Docker使用这个"特殊"文件系统有两个原因:避免重复同一基本映像中的文件,并将特定于进程的文件系统更改与基本映像的共享层隔离开来。该机制的具体术语是ARC is implemented。关键是当Docker说它写入文件系统时,这就是Docker正在做的事情。它不会将内容写入内存,并且正在将这些内容写入文件系统:它实际上是将内容写入磁盘。存储驱动程序的主题是一个深层而复杂的主题,但这些内容的copy-on-write编写得很好且准确,就像所有Docker文档的情况一样。尽管如此,请确保运行流程没有任何魔力。您可以放心地假设Docker正在按照它所说的去做。