首页/云/云与容器速查/只读根文件系统与 tmpfs 兜底
容器与 Docker106 条

只读根文件系统与 tmpfs 兜底

用 --read-only 把容器根文件系统设为只读:阻止进程写坏镜像层、限制持久化位置;再对必要可写目录挂 tmpfs 或数据卷,兼顾安全与可用。

云与容器速查云更新于 2026-10-13

只读根文件系统是什么

把容器根文件系统设为只读后,进程无法在镜像层上写文件,只能写到显式提供的可写位置:临时目录挂内存文件系统、业务数据挂卷。它同时防住两类问题——被入侵的进程难以落地持久化文件,应用也改不坏镜像层。代价是应用如果有隐式的写入点(配置目录、日志目录、缓存目录),启动会直接失败,因此正确做法是先跑起来观察写入位置,再逐个补齐可写挂载。

基本信息

启用方式--read-only 让容器根文件系统只读
不受影响的位置卷、内存文件系统挂载点以及运行时特殊挂载的系统目录仍可写
常见必要可写/tmp 与 /run 通常需要内存文件系统兜底
数据目录需要用数据卷显式提供可写位置
验证方法进入容器尝试在根目录创建文件,应提示文件系统只读
排查工具用文件差异查看命令观察容器相对镜像到底写了哪些路径

典型使用场景

  • 对外提供静态内容的服务,运行期本来就不需要写根目录
  • 安全加固要求:限制被入侵进程在容器里落地文件
  • 合规检查要求容器运行环境不可变,可写入范围需明确列出
  • 排查“重启后配置又变了”:确认应用是否在偷偷写文件
  • 配合不可变基础设施思路,让容器实例行为完全一致

使用示例

使用示例
docker run -d --name app --read-only \
  --tmpfs /tmp:size=64m \
  --tmpfs /run:size=16m \
  -v appdata:/var/lib/app \
  myapp:1.2.3   # 根只读,只给必要的可写位置
docker exec app touch /test   # 预期报错:文件系统只读
docker exec app sh -c 'df -h /tmp'   # 确认内存挂载生效
docker diff app | head -20   # 看容器相对镜像写了哪些路径,据此补齐挂载

写入位置处理

写入位置处理方式原因
/tmp挂内存文件系统并限容量临时文件必须有可写位置
/run挂内存文件系统进程号与套接字文件需要写入
业务数据目录挂数据卷需要跨重启保留
配置或日志目录改到卷或改用启动参数应用常默认写入自身目录
有些应用启动即写 /etc、日志目录或自身安装目录:先以可写方式跑起来观察写入点,再逐个补内存挂载或数据卷。
只读根文件系统限制的是镜像层写入,不代表容器绝对不可写:卷与内存挂载点仍可写,敏感数据仍要靠权限与只读挂载约束。

易错点

  • 直接开启只读:应用启动即失败,缺少写入路径分析导致反复试错
  • 把必要可写目录全挂内存文件系统:容器重启后数据即丢
  • 只设只读不提供 /tmp:部分运行时启动时立刻报错退出
  • 以为只读就等于安全:可写卷里的脚本仍能落地执行,镜像来源与运行权限同样要管
  • 把日志目录挂到内存文件系统:日志量一大就吃掉内存,出问题时反而没有日志可查

数据来源与参考

  • Docker Docs:docker run --read-only
  • Docker Docs:tmpfs mounts

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌