生产环境禁用bind mount挂载敏感主机目录,如/etc、/proc、/sys等,须只挂必要路径并设为只读;优先使用docker volume实现安全、隔离、可移植的数据持久化。

Bind Mount 本身不是不安全,问题出在挂载方式和路径选择上。生产环境中最常踩的坑,是把宿主机敏感目录直接以读写方式挂进去,等于给容器开了后门。
只挂必要路径,禁用敏感目录挂载
宿主机的 /etc、/proc、/sys、/boot、/dev 这些目录绝不能以读写方式挂进容器。一旦挂入,容器内进程就能修改系统配置、读取内核参数,甚至执行设备操作。
- 开发调试时如需挂代码目录,用
-v $(pwd)/src:/app/src,而不是-v /:/host这类全盘映射 - 配置文件挂载建议只读:
-v /host/config.yaml:/app/config.yaml:ro - 若必须挂日志目录,确保宿主机目标路径权限收紧(如仅属主可写)
优先用 Volume 替代 Bind Mount
Volume 由 Docker 管理,路径隔离、权限可控、跨平台兼容,更适合生产环境。
- 数据库数据、缓存目录等持久化场景,统一用
docker volume create创建并挂载 - Volume 默认不暴露宿主机真实路径,规避路径越界风险
- 备份迁移更方便,不依赖特定主机目录结构
挂载时显式控制读写权限与用户映射
即使挂了合法路径,也要防止容器内进程以 root 身份写入宿主机文件系统。
- 始终加
:ro后缀,除非业务明确需要写入 - 结合 User Namespace 使用 UID 映射,让容器内 UID 1001 对应宿主机非特权用户
- 启动容器时指定运行用户:
--user 1001:1001,避免 root 写入宿主机挂载点
避免挂载 docker.sock 或其他高危设备节点
挂 /var/run/docker.sock 到容器,等于赋予容器管理整个 Docker 守护进程的权限,极易导致宿主机沦陷。
- 检查现有容器是否挂了 docker.sock:
docker inspect <container> | grep docker.sock</container> - 替代方案:通过 Docker API 网关或专用 sidecar 提供有限能力,而非直连 socket
- 同理,
/dev/sda、/dev/loop*等块设备节点禁止挂入











