tmpfs挂载是将容器内路径直接映射到宿主机物理内存,不经过磁盘,实现低延迟高吞吐;需用--tmpfs指定路径并显式设置size等参数,数据在容器停止后自动消失。

直接把容器里的临时高频读写路径(比如缓存、会话、中间文件)挂载到宿主机物理内存,靠的就是 tmpfs 挂载——它不走磁盘,数据全程在内存中流转,延迟极低、吞吐极高。
tmpfs 不是“挂载到宿主机目录”,而是挂载到宿主机的内存空间。它没有对应宿主机上的真实文件路径,也不生成任何磁盘文件,只占用 RAM。所以严格来说,不是“挂载到某个目录”,而是“让容器内某个路径,背后由内存提供存储服务”。
✅ 正确启用 tmpfs 的核心操作
- 启动容器时用
--tmpfs参数指定容器内路径,并可选限制大小和权限 - 宿主机无需提前创建目录,Docker 会在容器启动时自动在内存中建立该挂载点
- 容器停止后,所有 tmpfs 中的数据立即消失,不可恢复
docker run -d \ --name app-with-cache \ --tmpfs /tmp:rw,size=256m,noexec,nosuid \ --tmpfs /var/run/nginx:rw,size=64m \ nginx:alpine
上面命令做了三件事:
- 把
/tmp映射为最大 256MB 的内存文件系统,禁止执行程序、禁止 setuid - 把 Nginx 的运行时目录
/var/run/nginx也映射为 64MB 内存空间 - 所有写入这些路径的文件,都直接落在宿主机物理内存里,不碰 SSD 或 HDD
⚙️ 关键参数说明(必须设 size!)
-
size=XXX:强烈建议显式指定上限,例如size=128m或size=2g- 不设 size,默认可能占满可用内存,极易触发 OOM Killer 杀掉容器或宿主机进程
-
rw:默认就是读写,可省略;如需只读,写ro -
noexec:禁止执行二进制文件,防恶意代码注入 -
nosuid:禁用 setuid/setgid 位,提升安全性 -
mode=0755:可选,设定挂载目录的初始权限(如需特定 umask)
示例:更安全的写法
--tmpfs /cache:rw,noexec,nosuid,mode=0700,size=512m
? 哪些路径适合 tmpfs?
-
/tmp:通用临时文件存放点,多数应用默认使用 -
/var/run/xxx:服务 PID、socket、锁文件等运行时状态 -
/var/cache/xxx:Nginx 缓存、PHP OPcache 文件、前端构建中间产物 -
/dev/shm:POSIX 共享内存(部分程序依赖,Docker 默认已挂载) - 自定义路径如
/app/session、/data/intermediate:只要生命周期短、不需持久化
⚠️ 不适合的场景:
- 需要重启后保留的数据(如数据库 WAL 日志、用户上传待处理文件)
- 单次写入量远超预设 size(会报
No space left on device) - 宿主机内存紧张,且多个容器同时大量分配 tmpfs
? 验证是否生效
进入容器检查挂载类型和大小:
docker exec -it app-with-cache df -h /tmp # 输出应类似: # Filesystem Size Used Avail Use% Mounted on # shm 256M 0 256M 0% /tmp
再看挂载选项:
docker exec -it app-with-cache mount | grep tmpfs # 输出示例: # shm on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime,size=262144k)
注意 type tmpfs 和 size= 参数是否匹配你设置的值。
? 补充提醒
- tmpfs 使用的是宿主机的 页缓存(page cache)+ slab 分配器,本质就是物理内存
- 它和
memcached或redis不同:不提供网络接口或数据结构,只是把某路径变成内存盘 - 如果应用本身支持内存缓存(如 Redis 的
memorybackend、Nginx 的shared memory zones),tmpfs 是它们的底层加速基础,而非替代方案 - 在 Kubernetes 中,可通过
emptyDir.medium: Memory实现类似效果,原理一致
不复杂但容易忽略:没设 size 就上线,等于把内存闸门全打开。











