运行容器时应直接加安全参数:以非root用户启动(如--user)、根文件系统设为只读(--read-only)、能力全禁后按需添加(--cap-drop=all --cap-add=...)、启用no-new-privileges、限制资源与pid数,并通过docker-user链管控网络流量。

直接在运行容器时加安全参数,比事后补救更有效。Docker 提供了多层内置机制,不用装额外插件也能大幅降低风险。
用最小权限启动容器
默认 root 权限是最大隐患。必须显式切换用户,避免进程拥有不必要的系统控制权。
- 在 Dockerfile 中创建非 root 用户并指定 USER 指令,例如:
RUN adduser -D appuser && chown -R appuser:appuser /app,再加USER appuser - 启动容器时用
--user覆盖镜像设定,如docker run --user 1001:1001 ... - 配合
--read-only让根文件系统只读,写操作只能通过明确挂载的 tmpfs 或 volume 完成
精细控制 Linux 能力(Capabilities)
Docker 默认赋予容器部分 root 级能力,但多数应用根本用不到。应先全禁再按需开启。
- 用
--cap-drop=ALL清空所有能力,再用--cap-add补回必需项,比如绑定 80 端口只需--cap-add=NET_BIND_SERVICE - 禁止网络嗅探和原始套接字:确保没加
NET_RAW,可验证ping或tcpdump在容器内执行失败 - 敏感能力如
SYS_ADMIN、IPC_LOCK基本不应启用,除非有明确且可信的技术理由
启用运行时防护选项
这些参数不改变镜像,但能即时加固容器行为边界。
-
--security-opt=no-new-privileges阻止容器内进程通过 setuid/setgid 提权,即使被入侵也无法升级权限 -
--pids-limit=100防止 fork 炸弹耗尽宿主机进程数 -
--memory=512m --cpus=1.0限制资源,避免单个容器拖垮整台机器 - 结合
--network=none或自定义 bridge 网络,隔离不需要外网通信的容器
配合 iptables 管理进出流量
Docker 自动管理 nat 和 filter 表,但规则生效位置很关键——别在 INPUT 链硬封,得去 DOCKER-USER 链下手。
- 所有想对容器生效的访问控制,必须写进
DOCKER-USER链,它是 Docker 流量进入前的最后一道检查点 - 例如只允办公网访问某容器端口:
iptables -I DOCKER-USER -i eth0 -s 192.168.10.0/24 -d 172.17.0.2 --dport 8080 -j ACCEPT - 最后加一条拒绝规则:
iptables -I DOCKER-USER -j DROP,确保未匹配流量被拦截











