核心思路是限制容器能力、禁用高危选项、强制非root运行并辅以内核级策略加固:禁用--privileged、禁止挂载敏感主机路径、使用非root用户+--read-only、--cap-drop=all、--security-opt no-new-privileges:true等措施收缩权限边界。

核心思路是限制容器能力、禁用高危选项、强制非 root 运行,并辅以内核级策略加固。不依赖默认宽松配置,而是主动收缩权限边界。
禁用特权模式与危险挂载
特权容器(--privileged)会绕过所有安全限制,等同于赋予容器宿主机 root 权限。必须禁止使用。
- 绝对不要运行:
docker run --privileged ... - 禁止挂载敏感主机路径:如
/proc、/sys、/dev、/etc、/boot。尤其避免-v /:/host这类全盘挂载 - 确需挂载时,严格限定为只读(
:ro),例如-v /etc/ssl/certs:/etc/ssl/certs:ro
降权运行:非 root 用户 + 只读根文件系统
即使容器被突破,攻击者也只能以低权限操作,且无法修改系统文件。
- 在 Dockerfile 中创建普通用户并切换:
RUN adduser -u 1001 -D appuser && USER appuser - 启动容器时加 --read-only,强制根文件系统只读
- 需要写入的目录(如日志、缓存)单独用
-v挂载可写卷,并设好属主:-v /data/logs:/app/logs:rw
限制内核能力与网络暴露
Docker 默认启用大量 Linux capabilities,很多对应用无用却极大提升逃逸风险。
- 显式丢弃不需要的能力:
--cap-drop=ALL,再按需添加必要项,如--cap-add=NET_BIND_SERVICE(仅需绑定低端口时) - 禁用共享主机网络栈:不用
--network host,改用自定义 bridge 网络,配合--publish按需暴露端口 - 启用 AppArmor 或 SELinux 策略(如加载
docker-defaultprofile),进一步约束进程行为
资源与上下文隔离强化
防止横向影响或资源耗尽型攻击。
- 限制 CPU 和内存:
--cpus 0.5 -m 256m,避免单个容器拖垮宿主机 - 禁用 IPC 共享:
--ipc private(默认已如此,但显式声明更稳妥) - 关闭容器间自动发现:
--link已废弃,统一用自定义网络 + DNS 服务名通信 - 设置
--security-opt no-new-privileges:true,阻止进程通过 setuid/setgid 提权











