Docker Compose 如何配置只读文件系统读取保护防止篡改

文章导读
在 Docker Compose 中配置只读文件系统,最推荐的方式是通过卷挂载的read_only选项或:ro后缀,适用于配置文件、静态资源等无需运行时写入的场景。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

在 Docker Compose 中配置只读文件系统,最推荐的方式是通过卷挂载的read_only选项或:ro后缀,适用于配置文件、静态资源等无需运行时写入的场景。

先说结论:只读挂载能有效防止容器内进程篡改关键数据,但需要提前确认应用是否有写入需求,否则会导致启动失败。

  • 先判断:确认哪些目录需要只读保护,哪些必须可写
  • 优先做:使用:ro后缀或read_only: true配置卷挂载
  • 再验证:进入容器尝试写入,确认权限被拒绝

命令速用版

如果你需要快速配置,以下是两种常用方式:

方式一:短语法(简洁)

volumes:
- ./config:/etc/nginx:ro

方式二:长语法(推荐,可读性更好)

volumes:
- type: bind
source: ./config
target: /etc/nginx
read_only: true

两种方式功能一致,:roread_only的简写形式。

为什么会这样

只读挂载的本质是文件系统层面的权限控制。当卷以只读模式挂载时,内核会在虚拟文件系统(VFS)层拦截写操作,任何尝试写入的行为都会返回Read-only file system错误。

这不同于文件权限(如chmod),即使容器内进程有写入权限,只读挂载也会阻止写操作。这种机制常用于保护配置文件、证书、静态资源等关键数据,防止被意外修改或恶意篡改。

需要注意的是,`--read-only`参数控制的是容器根文件系统,而卷挂载的read_only只针对特定挂载点,两者可以配合使用。

分步处理

步骤 1:确认需要保护的目录

先梳理应用中哪些目录只需要读取,常见场景包括:

  • 配置文件目录(如/etc/nginx
  • 静态资源目录(如/usr/share/nginx/html
  • 证书和密钥文件

步骤 2:编辑 docker-compose.yml

在卷挂载配置中添加只读选项:

version: '3.8'
services:
web:
image: nginx:alpine
volumes:
- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html:ro
- nginx-logs:/var/log/nginx # 日志目录保持可写

步骤 3:处理临时写入需求

如果应用需要写入临时文件,使用tmpfs挂载可写目录:

tmpfs:
- /tmp
- /run

或者在docker run中使用`--tmpfs`参数。

步骤 4:启动并测试

Docker Compose 如何配置只读文件系统读取保护防止篡改

执行docker-compose up -d启动服务,观察是否有启动报错。

怎么验证是否生效

方法一:进入容器尝试写入

docker-compose exec web sh
echo "test" > /etc/nginx/nginx.conf

如果配置正确,会返回Read-only file system错误。

方法二:查看挂载信息

docker exec web mount | grep nginx.conf

检查输出中是否包含ro标识。

方法三:检查应用日志

如果应用尝试写入只读目录,日志中会出现权限拒绝相关错误,这也能间接验证配置生效。

常见坑

坑 1:日志目录设为只读

很多应用默认将日志写入挂载目录,如果设为只读会导致启动失败。建议将日志目录单独挂载为可写卷。

坑 2:忽略临时文件需求

部分应用会在/tmp/run创建临时文件,根文件系统设为只读时需要额外挂载tmpfs

坑 3:特殊目录不受影响

/proc/sys/dev等由 Linux 内核直接管理的目录,不受`--read-only`参数影响,需要单独配置。

坑 4:调试复杂度上升

只读模式下无法直接进入容器修改配置文件,需要重建卷或重新部署,建议保留一份可写配置用于调试。

参考来源

  • Docker Compose 中 read_only 卷挂载的陷阱与最佳实践
  • 设置非集群节点容器应用为只读
  • Docker Compose 卷挂载 read_only 详解:5 分钟搞懂只读模式的安全优势与限制
  • 【Docker Compose 卷挂载终极指南】:深入解析 read_only 权限控制的 5 大实战场景
  • 揭秘 Docker Volume 只读挂载难题:如何正确配置 read_only 避免容器崩溃
  • docker compose 卷设置只读_mob649e81643021 的技术博客_51CTO 博客