直接加--read-only可使容器根文件系统只读,但需配合--tmpfs为/tmp、/run等路径挂载可写tmpfs,或用-v显式挂载可写volume,未挂载路径仍只读,可通过mount和touch验证。

直接加 --read-only 就能让容器根文件系统变为只读,这是最核心、最有效的一步。但光设这一项通常不够——应用仍需在 /tmp、/run、/var/log 等路径写临时数据,必须配合可写挂载,否则容器大概率启动失败或运行异常。
用 --read-only 启动基础容器
命令示例:
docker run --read-only nginx:alpine
该参数会让整个 /(含 /etc、/usr、/var)以只读方式挂载。内核 VFS 层会拦截所有写操作,即使容器内是 root 也无法修改文件或创建新文件。
验证是否生效:
- 进容器执行
mount | grep "on / type",输出中含ro即成功 - 尝试
touch /test,报Read-only file system错误即生效
为必需路径挂载可写 tmpfs
tmpfs 是内存中的临时文件系统,不落盘、重启即清空,适合存放 PID、socket、锁、日志等运行时需要写的路径:
-
--tmpfs /tmp:rw,size=10M,mode=1777—— 通用临时目录 -
--tmpfs /run:rw,size=5M或--tmpfs /var/run:rw,size=5M—— Nginx、supervisord 等依赖的运行时路径 -
--tmpfs /var/log:rw—— 仅当应用坚持本地写日志;更推荐统一输出到 stdout/stderr
按需挂载可写 volume 或绑定目录
只对真正需要持久化或共享的数据才挂载,并严格控制权限:
- 上传目录:
-v upload-data:/app/uploads:rw(命名卷,推荐) - 证书或配置文件:
-v cert-volume:/etc/tls:ro—— 必须显式加:ro - 单个配置文件只读挂载:
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro - 避免 bind mount 宿主机敏感路径(如
/etc、/root),尤其禁用:z或:Z
Docker Compose 中启用只读根文件系统
在 docker-compose.yml 中统一配置,利于生产管理:
services:
app:
image: myapp:latest
read_only: true
tmpfs:
- /tmp:rw,size=10M,mode=1777
- /run:rw,size=5M
volumes:
- ./conf:/etc/myapp:ro
- upload-data:/app/uploads:rw
注意:read_only: true 作用于整个根文件系统,优先级高于卷级 :ro;若两者混用,卷级 :ro 实际无意义。











