只读根文件系统是什么
把容器根文件系统设为只读后,进程无法在镜像层上写文件,只能写到显式提供的可写位置:临时目录挂内存文件系统、业务数据挂卷。它同时防住两类问题——被入侵的进程难以落地持久化文件,应用也改不坏镜像层。代价是应用如果有隐式的写入点(配置目录、日志目录、缓存目录),启动会直接失败,因此正确做法是先跑起来观察写入位置,再逐个补齐可写挂载。
基本信息
| 启用方式 | --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、日志目录或自身安装目录:先以可写方式跑起来观察写入点,再逐个补内存挂载或数据卷。
只读根文件系统限制的是镜像层写入,不代表容器绝对不可写:卷与内存挂载点仍可写,敏感数据仍要靠权限与只读挂载约束。