核心是控制写入权限、明确生命周期、隔离敏感数据;只读挂载(:ro)和命名卷管理是最直接有效的两项措施,前者保障配置文件等不可篡改,后者便于追踪、清理与权限管控。

核心是控制写入权限、明确生命周期、隔离敏感数据。只读挂载和命名卷管理是最直接有效的两项措施。
用 :ro 限制关键卷的写入能力
对配置文件、证书、静态资源等不需运行时修改的内容,必须使用只读挂载。它不是可选项,而是安全底线。
- 命令行中加
:ro:例如-v config-data:/etc/nginx:ro,容器内任何写操作(如 touch /etc/nginx/test.conf)会立即报错Read-only file system - Docker Compose 中可在
volumes条目后加:ro,如- config-data:/etc/ssl:ro;注意这不是read_only: true(后者作用于整个容器根文件系统) - 避免混用:同一卷不能部分只读、部分读写;若需混合权限,应拆分为多个独立卷
命名卷代替匿名卷,便于追踪与清理
匿名卷(Docker 自动生成的随机名)无法识别用途,容易堆积成“孤儿卷”,带来权限失控和磁盘泄漏风险。
- 创建时显式命名:用
docker volume create app-logs而非依赖自动创建 - 在
docker-compose.yml中声明并复用:volumes:下定义app-logs:,服务中通过- app-logs:/var/log/app引用 - 定期检查:用
docker volume ls --filter "label=env=prod"(配合标签)或按命名规则筛选,比如docker volume ls | grep "^prod-"
敏感数据不进 Volume,改用 Secret 或 tmpfs
Volume 是持久化机制,不适合存放密钥、token、临时会话等敏感或短期数据。
- 数据库密码、API Key 等应通过
docker secret(Swarm)或环境变量 + 外部 Vault 注入,而非写入卷再挂载 - 需要临时写入但又不能落盘的路径(如
/tmp、/run),用tmpfs挂载:Compose 中写tmpfs: - /tmp,数据仅存内存,重启即清空 - 若必须挂载证书等静态敏感文件,仍坚持
:ro,且宿主机上该目录权限设为600或更严(如root:root所有者)
清理策略要主动,不依赖默认行为
Docker 不会自动回收未被引用的卷。长期运行的系统中,残留卷可能包含旧版配置或调试数据,形成隐蔽风险点。
- 删除容器时不删卷是默认行为,确认无用后再执行
docker volume rm <name></name>;批量清理用docker volume prune,但务必先docker volume ls核对 - 生产部署脚本中加入卷存在性检查:启动前确认
docker volume inspect db-data成功,失败则报错退出,避免误用旧卷或空卷 - 备份关键卷时,用
tar打包前先停服务或确保应用无写入,防止备份出不一致状态











