安全启动需结构化配置:一、用非root用户运行(如user: "1001:1001"或dockerfile创建专用用户);二、drop all能力后按需add(如net_bind_service);三、设read_only: true,tmpfs挂载临时目录,security_opt隐藏敏感路径,并配资源限制与健康检查。

直接在 docker-compose.yml 里定义安全启动项,不是加几个开关那么简单,而是围绕“最小权限”原则做结构化配置。核心是三件事:不给 root、不给多余能力、不让乱写文件。
用非 root 用户运行容器
默认所有容器都以 root 身份启动,一旦应用被攻破,攻击者就拿到容器内最高权限。必须显式指定普通用户。
- 推荐方式是在服务中用
user: "1001:1001"(UID:GID 格式),避免依赖容器内用户名映射 - 更稳妥的做法是在构建镜像时就创建专用用户,比如 Dockerfile 里写:
RUN addgroup -g 1001 -f appgroup && adduser -S appuser -u 1001USER appuser - 搭配
read_only: true使用,否则非 root 用户可能因权限不足无法启动
丢弃全部 Linux capabilities 并按需添加
Docker 默认赋予容器数十种系统调用权限(如 CAP_NET_RAW、CAP_SYS_ADMIN),绝大多数 Web 应用根本用不到。
- 统一先清空:
cap_drop: ["ALL"] - 再只加真正需要的,例如 Nginx 需要
CAP_NET_BIND_SERVICE绑定 80 端口,可写:cap_add: ["NET_BIND_SERVICE"] - 数据库类服务通常不需要额外能力,保持
cap_drop: ["ALL"]即可
限制文件系统与临时空间
防止恶意写入或日志撑爆磁盘,从运行时层面切断常见攻击路径。
- 根文件系统设为只读:
read_only: true - 为必须写入的目录挂载
tmpfs,例如:tmpfs: - /tmp:size=32M,noexec,nosuid- /var/run:size=16M,noexec,nosuid - 敏感路径如
/etc/passwd、/proc等,用security_opt隐藏:security_opt: ["no-new-privileges:true"]
配合资源限制与健康检查
安全不只是权限控制,失控的资源消耗本身也是风险。
- 内存和 CPU 限流:
mem_limit: 512mcpus: 0.5 - 重启策略设为自动恢复但防震荡:
restart: on-failurehealthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]interval: 30stimeout: 5sretries: 3











