核心是控制攻击面、强化隔离、全程可审计。构建阶段用最小镜像(如distroless/alpine)、禁用root运行、多阶段构建、启用镜像签名;运行时禁用privileged、--read-only、--cap-drop=all、自定义网络、日志集中收集、trivy扫描、docker daemon tls加固。

核心是控制攻击面、强化隔离、全程可审计。不靠单一手段,而是从镜像构建到运行时层层设防。
构建阶段:源头控风险
安全容器始于安全镜像。重点不是“能不能跑”,而是“有没有多余的东西”。
- 用最小基础镜像:优先选 distroless 或 Alpine,避免 Ubuntu/Debian 等全量发行版镜像;scratch 镜像适合静态编译语言(如 Go)
- 禁用 root 运行:Dockerfile 中明确创建非特权用户,并用 USER 指令切换,例如
adduser -D appuser && USER appuser - 多阶段构建:分离构建环境与运行环境,最终镜像里不带
gcc、npm、源码或调试工具 - 启用镜像签名:通过 Docker Content Trust(
DOCKER_CONTENT_TRUST=1)或 cosign 签署镜像,拉取时自动校验完整性
运行时:权限做减法
容器默认权限过高是常见漏洞根源。原则是——不给权,比管住权更可靠。
- 禁用 --privileged:绝不使用该参数;改用 --cap-drop=ALL 后按需添加,例如只加
NET_BIND_SERVICE绑定端口 - 挂载只读根文件系统:--read-only 阻止恶意写入;若需临时写,用 --tmpfs /tmp 或挂载最小必要 volume
- 限制资源:用
--memory=512m --cpus=1.0 --pids-limit=100防止 DoS 类攻击 - 启用安全模块:加载 seccomp 白名单策略(如默认
docker-default.json),配合 AppArmor 或 SELinux 规则进一步约束系统调用
隔离与网络:默认不互通
默认 bridge 网络相当于把所有容器放在同一台交换机上,极易横向渗透。
- 弃用默认网络:用 docker network create 创建自定义 bridge 网络,天然隔离不同服务组
- 禁止容器共享宿主机网络:--network=host 仅限极少数性能敏感场景,且必须评估风险
- 敏感目录只读挂载:如挂载
/proc、/sys或配置目录时,强制加 :ro 后缀 - 关闭新权限提升:--security-opt=no-new-privileges 防止进程在运行中获取额外能力
可观测与合规:让行为可追溯
短暂生命周期的容器一旦出事,没日志就等于没证据。
- 集中收集日志:用 Fluentd 或 Filebeat 推送到 ELK/Splunk,禁用默认 json-file 的本地堆积
- 启用镜像扫描:CI/CD 流程中集成 Trivy 或 Harbor 内置扫描器,CVSS ≥7.0 的高危漏洞自动阻断发布
- 保护 Docker daemon:禁用
/var/run/docker.sock暴露;生产环境必须启用 TLS 双向认证,拒绝未加密远程访问 - 定期审查 UID 映射:对关键服务启用 User Namespace(
--userns=host或自定义映射),使容器内 root 不对应宿主机任何真实用户











