Docker tmpfs:临时文件放内存,容器一停就没了
前几篇分别讲了用 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 写清楚目标路径的习惯。
- 点赞
- 收藏
- 关注作者
评论(0)