生产环境通常首选自定义 Bridge 模式兼顾隔离与灵活,高性能或特殊监控场景才考虑 Host 模式,完全隔离需求选 None 模式。
先说结论:生产环境推荐使用自定义 Bridge 网络,追求极致性能或需绑定宿主机端口时用 Host,无需联网的批处理任务用 None。
- 适合:自定义 Bridge 适合大多数微服务通信,Host 适合低延迟网络服务,None 适合安全隔离任务
- 重点看:安全需求 None 最高,性能需求 Host 最高,运维复杂度 Host 最高 (需管理端口冲突)
- 别忽略:默认 Bridge 不支持容器名 DNS 解析,Host 模式隔离性降低 (共享宿主机网络栈)
快速配置命令
# 默认 Bridge 模式 (不推荐生产多容器协作)
docker run -d `--name` web nginx
# 自定义 Bridge 模式 (推荐生产环境)
docker network create -d bridge my-net
docker run -d `--network` my-net `--name` web nginx
# 指定 Host 模式
docker run -d `--network` host nginx
# 指定 None 模式
docker run -d `--network` none alpine
# None 模式后续联网
docker network connect my-net <container_id>模式原理与差异
Bridge 模式是 Docker 默认网络,容器通过虚拟网桥 docker0 连接,默认网段通常为 172.17.0.0/16。容器启动时会创建 veth pair 虚拟网卡,一端在容器内,一端连接网桥,通过 NAT 规则与外界通信。
Host 模式容器共享宿主机网络栈,直接使用宿主机 IP 和端口,绕过网络隔离层,因此性能损耗最小但隔离性最差。None 模式仅创建 loopback 接口,彻底阻断内外通信,适合对网络隔离有严格要求的场景。
验证与排查
使用 docker inspect 查看 NetworkMode 字段确认模式。进入容器内部使用 ip addr 检查网卡和 IP 分配情况,Host 模式下应看到宿主机网卡,None 模式下仅见 lo 接口。
# 查看容器网络模式
docker inspect -f '{{.HostConfig.NetworkMode}}' <container_id>
# 容器内连通性测试 (优先使用 curl,nc 可能未安装)
docker exec -it <container_id> curl -v http://www.baidu.com
# 宿主机测试容器端口连通性 (使用 curl 或 telnet)
curl -v http://<container_ip>:<port>选型决策与常见坑
1. 网络选型决策:
- 需要容器间通过名称通信?选自定义 Bridge。
- 需要极致性能且信任容器内容?选 Host。
- 需要完全断网运行?选 None。
2. 常见问题排查:
- DNS 解析失败:默认 Bridge 不支持容器名 DNS 解析,生产环境多容器协作应使用自定义 Bridge 网络。
- 端口冲突:Host 模式存在端口冲突风险,因为容器直接占用宿主机端口,启动前需检查端口占用。
- None 模式联网:None 模式容器默认无法联网,若后续需要通信需手动连接网络 (docker network connect)。
- 命令兼容性:验证连通性时,Alpine 等最小化镜像可能未安装 netcat (nc),建议使用 curl 或 wget 替代。
3. 安全提示:
Host 模式隔离性降低,安全风险相对较高,不建议运行不可信代码。生产环境应优先使用自定义 Bridge 配合端口映射。