
类型:虚拟化技术
简介:基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。
容器运行后,如果应用不需要修改系统目录,就可以考虑把容器文件系统设置为只读。这样即使应用出现异常,也能减少运行时写入范围。只读文件系统不是所有应用都能直接开启,需要提前规划日志、缓存、临时文件和上传目录。
一、什么场景适合只读文件系统
适合:
- 静态 Web 服务。
- API 服务。
- 无需本地持久写入的应用。
- 配置固定的内部工具。
- 安全要求较高的容器。
不适合直接开启:
- 需要写本地数据库的容器。
- 需要频繁生成本地文件的应用。
- 未明确日志和缓存路径的旧应用。
二、Compose 中开启 read_only
示例:
services:
app:
image: example-app
read_only: true
开启后,容器默认文件系统不可写。应用如果尝试写入 /tmp、日志目录或缓存目录,可能会报错。
三、用 tmpfs 提供临时写入空间
很多应用需要写 /tmp。可以使用 tmpfs:
services:
app:
image: example-app
read_only: true
tmpfs:
- /tmp
tmpfs 位于内存中,适合临时文件,不适合保存重要数据。容器重启后内容会丢失。
四、持久目录要单独挂载
如果应用需要保存上传文件或业务数据,应显式挂载:
services:
app:
image: example-app
read_only: true
volumes:
- ./uploads:/app/uploads
tmpfs:
- /tmp
这样系统目录只读,业务写入目录可控。
五、排查写入失败
常见报错包括:
Read-only file system
Permission denied
No such file or directory
排查步骤:
- 查看应用需要写入哪些路径。
- 判断是临时文件还是持久文件。
- 临时文件使用 tmpfs。
- 持久文件使用 volume。
- 检查目录权限和运行用户。
FAQ
问:Docker 只读文件系统会影响日志吗?
可能影响写文件日志。建议应用输出到标准输出,或单独挂载日志目录。
问:tmpfs 适合保存上传文件吗?
不适合。tmpfs 是临时内存文件系统,容器重启后会丢失。
问:所有容器都建议 read_only 吗?
不是。要先确认应用写入路径,避免影响正常运行。

