Docker 容器安全需从镜像构建、运行时配置和宿主机协同三层面加固:构建时用 distroless 或精简 Alpine 镜像、固定摘要、多阶段构建、删临时文件与工具、CVE 扫描;运行时设非 root 用户、只读根文件系统、精确 capability 授权;生命周期需语义化版本、cosign 签名验证、定期清理;宿主机启用 SELinux/GRSEC、资源限制、自定义网络与防火墙协同防护。

Docker 容器本身不自带 安全防护 能力,安全必须从镜像构建、运行时配置和宿主机协同三个层面主动加固。
构建可信基础镜像
默认的 alpine 或debian:slim虽小,但未经安全审计。应优先选用官方 distroless 镜像(如 gcr.io/distroless/static),或基于Alpine Linux 并启用 apk –no-cache 安装软件。禁止使用 :latest 标签,固定镜像摘要(@sha256:…)防止依赖漂移。
- 用 Dockerfile 多阶段构建,编译环境与运行环境分离,最终镜像只含二进制和必要配置
- 删除 /tmp、/var/cache 等临时文件,移除 curl、bash 等非必需 工具,降低攻击面
- 使用 trivy 或grype对镜像做 CVE 扫描,CI 中设阈值阻断高危漏洞镜像推送
运行时最小权限控制
容器默认以 root 用户运行,一旦逃逸即获得宿主机 root 权限。必须显式指定非特权用户,并禁用危险能力。
- 在 Dockerfile 中添加USER 1001:1001,配合RUN addgroup -g 1001 -f appgroup && adduser -S appuser -u 1001
- 启动容器时加参数:–read-only挂载根文件系统为只读,–tmpfs /tmp:rw,size=10m提供必要可写空间
- 用 –cap-drop=ALL –cap-add=NET_BIND_SERVICE 精确授权,禁用 SYS_ADMIN、DAC_OVERRIDE 等高危 capability
镜像生命周期管理
镜像不是一次构建永久可用,需建立版本、签名、清理闭环机制。
- 按语义化版本(v1.2.3)打标签,避免 :dev、:test 等模糊标识
- 用 cosign 对镜像签名:cosign sign –key cosign.key myreg.example/app:v1.2.3,运行前用 cosign verify 校验
- 定期清理无标签镜像和悬空层:docker image prune -f;生产环境禁用docker build,统一由 CI 流水线构建并推送到私有仓库
宿主机与网络协同防护
容器安全不能脱离宿主机环境。内核参数、cgroup 限制和网络策略是最后一道防线。
- 宿主机启用 GRSEC 或SELinux(如 container_t 上下文),限制容器进程访问宿主机资源
- 用 –memory=512m –cpus=1.0 –pids-limit=100 硬性限制资源,防 DoS 类攻击
- 禁用 –network=host,用自定义 bridge 网络 +–iptables=false 配合宿主机 firewalld 或 nftables 精细控制进出流量






























