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

标签 docker

语境

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

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

问题

使用 docker 一段时间后,我意识到清除以前的缓存文件不再是问题:在部署时,运行一个新容器,自动删除所有以前的缓存文件。当然,这可能比使用内存存储慢,但这具有不需要任何配置的优点,这在引导快速辅助项目时非常酷。

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

最佳答案

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

当您的进程写入磁盘时,Docker 正在写入其特殊的 UnionFS(可以使用几种不同的存储后端之一,例如 aufs 或 btrfs,有多种选择)。 Docker 使用这个“特殊”文件系统有两个原因:避免来自同一基础镜像的文件重复,以及将特定于您的进程的文件系统更改与基础镜像的共享层隔离。该机制的具体术语是 copy-on-write .关键是当 Docker 说它正在写入文件系统时,这就是 Docker 正在做的事情。它不是将内容写入内存,也不是将内容写入文件系统:它实际上是将内容写入磁盘。存储驱动程序的主题是一个深刻而复杂的主题,但 documentation因为这些东西写得很好而且准确,就像所有 Docker 文档一样。请放心,运行您的流程没有任何魔法。您可以放心地假设 Docker 正在按照它所说的去做。

关于docker - 运行容器时 docker 工件是否存储在主机 fs 或内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35313763/

相关文章:

docker - Docker在另一个目录中撰写会影响其他容器

Docker 撰写命名卷 : find volume on host machine

linux - 我怎么知道是 "init"还是 "systemd"控制着 docker?

docker - 如何在 Docker 容器中配置 Debian SSHD 进行远程调试?

linux - docker: `top` 和 `ps` 的不同 PID

python - pip安装在docker容器中不起作用

docker - Docker群停止在250处旋转容器

amazon-web-services - AWS 上的 kubernetes 在 pod 中获取区域名称

azure - 在 Azure 中的 Docker 化应用服务上运行 'install' 命令

docker - 如何将IPU模型与Graphcore Docker容器一起使用?