上下文
我编写rails应用程序,在生产中执行页面片段缓存(存储特定片段的html结果以避免重新计算它).
通常的方法是将片段存储在memcache或redis中. rails中的默认缓存存储选项是使用FS缓存(将片段存储为文件),因为它具有不依赖的优点(您不必配置memcache或redis).但是,这是一个不太受欢迎的选项,因为它比内存缓存慢,您必须手动清理缓存,而您可以依赖旧密钥使用内存缓存或充分配置的redis自动清除.
题
在使用docker一段时间后,我意识到清除以前的缓存文件不再是问题:在部署时,运行一个新容器,自动删除所有以前的缓存文件.这肯定比使用内存存储要慢,但这样做的好处是不需要任何配置,这在引导快速侧项目时非常酷.
但后来我想知道:写入容器fs是真的写在fs中,还是写在RAM中,而不是?这是一个问题,因为这意味着依赖于这可能会非常快速地使RAM饱和,特别是在同一服务器上的许多项目这样做.
当您的进程写入磁盘时,Docker正在写入其特殊的UnionFS(可以使用一些不同的存储后端,例如aufs或btrfs,有几种选择). Docker使用这种“特殊”文件系统有两个原因:避免重复同一基本映像中的文件,并将特定于进程的文件系统更改与基本映像的共享层隔离开来.该机制的具体术语是copy-on-write.重点是,当Docker说它正在写入文件系统时,这就是Docker正在做的事情.它不会将内容写入内存,并且正在将这些内容写入文件系统:它实际上是将内容写入磁盘.存储驱动程序的主题是一个深刻而复杂的主题,但是这个东西的documentation编写得很好且准确,就像所有Docker文档的情况一样.尽管如此,请确保您的流程没有任何魔力.您可以放心地假设Docker正在按照它所说的做.