Docker tmpfs:临时文件放内存,容器一停就没了

举报
yd_238478957 发表于 2026/11/11 09:12:33 2026/11/11
【摘要】 前几篇分别讲了用 nginx 托管静态页时的端口映射与文件挂载、练习后的清理、-p 左侧绑定地址、镜像标签与 digest,以及 volume 与 bind mount。上一篇提到还有 tmpfs,本篇只复查这一件事:不需要持久化、也不想落到主机磁盘上的临时数据,该怎么挂。下列命令均为本机说明示例,请按自己的环境判断是否执行;示例输出为示意,字段以你本机 docker 实际打印为准。tmpf...

前几篇分别讲了用 nginx 托管静态页时的端口映射与文件挂载、练习后的清理、-p 左侧绑定地址、镜像标签与 digest,以及 volume 与 bind mount。上一篇提到还有 tmpfs,本篇只复查这一件事:不需要持久化、也不想落到主机磁盘上的临时数据,该怎么挂。下列命令均为本机说明示例,请按自己的环境判断是否执行;示例输出为示意,字段以你本机 docker 实际打印为准。

tmpfs 把容器里的一个目录挂成主机内存里的临时文件系统(内存不够时也可能用到交换分区),不会在主机磁盘上留下一份对应目录。容器停止后,这份数据就没了。官方文档把 tmpfs 定位为:既不想写进容器可写层,又不需要在容器生命周期之外保留的内容。注意:这是 Linux 上的能力;在 Docker Desktop 的 Windows 容器里不可用。

从容器里面看,它和 volume、bind 一样,只是某个路径。差别在于:数据不落盘、不能靠这份挂载做备份或跨容器重建恢复,容器一停就清空。

1. 怎么挂:没有 src,只有容器内路径

Volume 要有卷名,bind 要有主机路径;tmpfs 没有源路径,因为数据不来自、也不写回主机上的某个目录。推荐用 --mount,语义更清楚:

docker run -d --name demo-tmpfs \
  --mount type=tmpfs,dst=/tmp/cache \
  nginx:stable-alpine

等价的简写是 --tmpfs(选项写法与 --mount 不完全相同,脚本里更推荐后者):

# docker run -d --name demo-tmpfs --tmpfs /tmp/cache nginx:stable-alpine

需要限制大小或权限时,给 --mount 加 tmpfs-size、tmpfs-mode(大小单位是字节;模式是八进制权限,默认常见为 1777):

docker run -d --name demo-tmpfs-opts \
  --mount type=tmpfs,dst=/tmp/cache,tmpfs-size=67108864,tmpfs-mode=1770 \
  nginx:stable-alpine

上面 67108864 是 64MiB。不设 tmpfs-size 时,实际上限取决于主机内存和内核默认值,不要假设「想写多大都能写」。写满后,容器内再创建文件会失败。

用 docker inspect demo-tmpfs 看 Mounts:Type 应为 tmpfs,一般只有 Destination,没有可长期使用的主机 Source(示意):

"Mounts": [
  {
    "Type": "tmpfs",
    "Destination": "/tmp/cache"
  }
]

2. 什么时候用,什么时候不用

场景 更合适的选择
缓存、临时解压目录、构建中间文件,容器停了就可以扔 tmpfs
短期存在、不想落到主机磁盘(例如某些运行中的临时密钥文件) tmpfs
数据库文件、上传目录、跨容器重建仍要保留的数据 命名 volume(见上一篇)
本机源码热更新、要把主机配置/证书喂给容器 bind mount(见上一篇)

把临时文件放到 tmpfs,有两个实际好处:一是避免把大量短命文件写进容器可写层,减少层膨胀和磁盘抖动;二是容器一停内容消失,主机上不会留下一份临时目录要打扫。它不是加密盘,也不是跨主机同步方案——数据在主机内存里,主机本身仍可能被读到;只是相比直接写磁盘或 bind 到某个可见目录,少了一份落盘副本。

不要用 tmpfs 存放你还想在容器重启后找回的数据。--restart 让容器自动再起来时,原来的 tmpfs 内容不会还在,目录是空的。需要跨重启保留,请改用命名 volume。

3. 常见误区

  • 以为 tmpfs 会在主机某个目录留下文件:不会。去主机磁盘上找 /tmp/cache 的对应目录是找不到「这份挂载」的;要查看只能进容器看该路径。
  • 把数据库或上传目录放到 tmpfs「图快」:容器一停数据就没了,也不适合备份。
  • 不限制 tmpfs-size,把大文件往内存里堆:可能挤占主机内存或打到交换分区,影响同一台机器上的其他进程。
  • 指望多个容器共享同一份 tmpfs 数据:每个容器的 tmpfs 是自己的内存挂载,不是命名 volume 那种可复用的存储对象。
  • 在 Windows 容器里照搬命令:官方说明 tmpfs 仅适用于 Linux 容器。

练习看完后,记得停掉并删除自己的演示容器:

docker container stop demo-tmpfs demo-tmpfs-opts
docker container rm demo-tmpfs demo-tmpfs-opts

tmpfs 没有需要单独 volume rm 的对象;容器删了,这份内存挂载也就没了。

小结

Volume 负责应用自己要留下来的数据,bind 负责你在主机上编辑或拥有的文件,tmpfs 负责「用完就扔、最好别落盘」的临时内容。选挂载类型时先问:这份数据在容器停掉之后还要不要在。不要,且希望少写磁盘,再用 tmpfs,并养成限制 tmpfs-size、用 --mount 写清楚目标路径的习惯。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。