docker安全需从镜像、运行时、网络、宿主机四层加固:镜像要精简、签名、扫描;容器须限制权限、资源、网络;运行时禁用特权、启用seccomp/apparmor;宿主机禁挂docker.sock、启tls、升内核。
docker 镜像是静态的、可复用的只读模板,包含运行应用所需的所有文件、依赖和配置;容器是镜像的运行实例,拥有独立进程空间、文件系统视图和网络栈。安全隔离不是靠镜像或容器“自带”,而是通过明确配置运行时参数,在容器启动阶段主动启用隔离机制。
镜像层安全:从源头控制风险
镜像越精简,攻击面越小。优先选用 alpine 或 slim 类基础镜像,避免 ubuntu:latest 这类臃肿镜像。使用多阶段构建,确保源码、构建工具、调试器等不进入最终镜像:
- 在 Dockerfile 中用 COPY --from=builder 只复制编译产物,不复制 .py/.js 源文件
- 配置 .dockerignore 排除 .git、.env、tests/、*.md 等敏感或非必要内容
- 启用内容信任:export DOCKER_CONTENT_TRUST=1,只拉取已签名镜像
- 定期扫描漏洞:trivy image your-app:prod 或 docker scan your-app:prod
容器运行时隔离:四大关键维度
容器默认隔离较弱,必须显式加固:
- 进程与权限:禁止 root 运行,Dockerfile 中加 USER 1001;启动时禁用特权模式:--privileged=false(默认已关)
- Capabilities:用 --cap-drop=ALL --cap-add=NET_BIND_SERVICE 实现最小权限,不需网络绑定就全禁
- 文件系统:对 /usr、/bin、/etc 等路径启用只读:--read-only;日志目录用 --tmpfs /var/log:rw,size=16m
- cgroups 限制:防资源耗尽,如 --memory=512m --cpus=0.5 --pids-limit=100
网络隔离:切断非必要通信路径
默认 bridge 网络允许容器互通,生产中必须打破这种“默认信任”:
- 为不同业务创建独立网络:docker network create app-api-net,启动时指定 --network app-api-net
- 关闭跨网络通信:--icc=false(Docker 20.10+ 默认生效),避免容器通过 IP 直连
- 暴露端口仅限本地回环:-p 127.0.0.1:8080:80,公网访问统一走 Nginx 或 Traefik 反向代理
- 如需更高控管,配合 iptables 或 Calico 设置网络策略
守护进程与宿主机加固
容器安全不能脱离底层环境:
- 禁用 Docker Socket 挂载:不要将 /var/run/docker.sock 映射进容器,否则等于赋予容器 root 权限
- Docker daemon 启用 TLS 认证,防止未授权 API 调用
- 升级到较新内核(支持 cgroups v2)和 Docker 版本(含 CVE 修复)
- 启用 Seccomp 和 AppArmor 配置,如加载自定义 seccomp.json 限制系统调用











