docker容器安全隔离需网络、权限、运行时三层面主动配置:用自定义bridge网络划分通信边界,禁用net_admin等高危能力,以非root用户运行并启用seccomp白名单。
docker 容器之间的安全隔离不是靠“开箱即用”就完全可靠的,默认 bridge 网络下所有容器能互相访问,存在横向渗透风险。真正有效的隔离需要从网络、权限、运行时行为三个层面主动配置。
用自定义桥接网络划分通信边界
默认的 `docker0` 网桥把所有未指定网络的容器放进同一个子网(如 `172.17.0.0/16`),它们可直接通过 IP 或容器名通信。 要阻断这种隐式连通性: - 创建独立网络:`docker network create --driver bridge app-db-net` - 启动容器时显式加入:`docker run -d --name db --network app-db-net postgres` - 另一个服务若不加入该网络,就无法 `ping db` 或访问 `5432` 端口这样,数据库容器只对同属 app-db-net 的应用容器开放,其他服务(如日志收集器、监控代理)天然被隔离开。
禁用不必要的网络能力
即使在同一个自定义网络中,也要限制容器的网络操作权限: - 不用 `--privileged`,避免获得 `NET_ADMIN` 等高危 capability - 显式丢弃不需要的能力:`docker run --cap-drop=NET_RAW --cap-drop=NET_ADMIN nginx`(禁用原始套接字和网络配置) - 对纯后端服务,考虑 `--network=none` + 仅挂载所需 Unix socket(如与宿主机 Redis 通信)配合运行时限制加固隔离效果
网络隔离只是第一道防线,还需叠加运行时控制防止绕过: - 以非 root 用户运行:Dockerfile 中加 `USER 1001`,避免容器内提权后滥用网络能力 - 挂载为只读根文件系统:`docker run --read-only -v /tmp:/tmp nginx`,阻止恶意程序写入网络配置工具(如 `ip`、`iptables`) - 启用 seccomp 白名单:禁止 `socket`, `bind`, `connect` 等系统调用,适用于完全不需要出向连接的批处理容器必要时用 iptables 补位控制
Docker 自动管理的 `iptables` 规则(如 `DOCKER-USER` 链)可用于精细化拦截: - 禁止某容器访问外网:`iptables -I DOCKER-USER -i docker0 -o eth0 -s 172.18.0.5 -j DROP` - 限制只允许访问特定域名的 DNS:结合 `--dns` 参数 + 主机层防火墙放行 `53/udp` - 注意:规则需在 Docker 启动后添加,且优先级高于 Docker 默认链不复杂但容易忽略。











