host 网络模式是什么
host 网络模式下容器不创建独立的网络命名空间,直接复用宿主机的网络栈:容器内的 127.0.0.1 就是宿主机回环,容器监听的端口也就是宿主机端口。因为没有 veth 转发与 NAT 环节,吞吐与延迟表现更接近原生裸跑,适合高吞吐网关和需要看到真实客户端 IP 的代理。代价是失去网络隔离,端口与宿主进程直接竞争,而且完整语义只在 Linux 上成立。
基本信息
| 语法 | docker run --network host |
|---|---|
| 效果 | 容器内 127.0.0.1 即宿主;监听端口即宿主端口 |
| -p 行为 | host 模式下无效(会有告警),端口无需也无法映射 |
| 隔离性 | 没有独立网络命名空间,容器与宿主进程共享端口空间 |
| 平台差异 | Linux 语义完整,Docker Desktop 在 macOS / Windows 上行为不同 |
典型使用场景
- 高吞吐网关与反向代理:省掉 NAT 与 veth 转发开销,压榨网络性能
- 监控 agent 采集宿主网络指标,需要与宿主同一网络视图
- 需要真实客户端来源 IP 的代理服务,避免经过 NAT 后丢失原始地址
- 性能压测工具直接跑在宿主网络上,避免测量结果被转发开销污染
- 与宿主上已有服务配合,需要端口与宿主保持一致的场景
使用示例
使用示例
docker run -d --network host --name node-exporter prom/node-exporter
docker run --rm --network host nicolaka/netshoot ss -lntp | head # 查看宿主端口占用
docker inspect node-exporter -f '{{.HostConfig.NetworkMode}}' # 确认网络模式为 host
# 端口冲突时直接查宿主监听即可,容器与宿主共用同一网络命名空间网络模式对比
| 模式 | 隔离性 | 性能 | 适用场景 |
|---|---|---|---|
| bridge(默认) | 独立命名空间加 NAT | 有转发开销 | 常规业务容器 |
| host | 无独立命名空间 | 接近宿主原生 | 高吞吐服务、需真实客户端 IP |
| none | 只有回环接口 | 无外网能力 | 纯离线计算任务 |
| 自定义 bridge | 独立命名空间加服务名 DNS | 有转发开销 | 多容器按服务名互访 |
host 模式常被用来『绕开端口不通』这类临时问题:但容器监听的端口就是宿主端口,是否暴露取决于宿主防火墙,安全面会同步放大,长期使用必须补防火墙与访问控制。
host 模式下同一个端口只能被一个进程占用,多个容器想用同一端口会直接启动失败;需要多实例并存时回到 bridge 模式并用端口映射区分。