host 模式是什么
host 模式下容器不做网络命名空间隔离,直接共用宿主机的网络栈:容器监听的端口就是宿主端口,省掉 -p 映射与 NAT 转发这一层。代价是端口冲突面与宿主完全共享,两个容器抢同一端口必然有一个起不来。
基本信息
| 用途 | 容器直接使用宿主网络栈 |
|---|---|
| 语法 | docker run --network host,compose 里用 network_mode: host |
| 端口行为 | -p 映射在此模式下不生效,端口本来就在宿主上 |
| 平台差异 | 传统 Linux 宿主直接可用;Docker Desktop 受虚拟化层限制,支持情况随版本变化 |
| 排查 | 在宿主执行 ss -ltnp 看到的即为容器进程 |
典型使用场景
- 需要看到真实客户端源 IP 的服务:省掉 NAT 后对端地址不再被改写
- 高性能场景:跳过端口映射的转发开销,适合高吞吐或低延迟要求
- 网络监控与采集类容器:需要访问宿主全部接口或抓取流量
- 临时排障:直接起一个带 ss、tcpdump 的容器查看宿主网络状态
- 端口已规划清楚、与宿主既有服务共存时,少维护一层映射关系
示例
示例
docker run -d --network host nginx # 直接占用宿主 80 端口
docker run --rm --network host nicolaka/netshoot ss -ltnp # 在宿主命名空间里看监听
docker inspect -f '{{.HostConfig.NetworkMode}}' web # 确认模式为 host
# compose 文件里的等价写法
# services:
# web:
# network_mode: hosthost 与默认 bridge 对照
| 维度 | host 模式 | 默认 bridge 模式 |
|---|---|---|
| 网络隔离 | 无,与宿主共用命名空间 | 独立命名空间 |
| 端口映射 | 不需要也不能用 -p | 需要 -p 发布端口 |
| 客户端源 IP | 应用能看到真实来源 | 默认经 NAT 改写 |
| 同一端口并发 | 只能有一个进程占用 | 宿主端口不冲突即可 |
| 服务名互访 | 没有独立 DNS 域 | 自定义网络内可按服务名解析 |
host 模式下容器内看到的接口就是宿主的接口,ss、netstat 输出与宿主一致,不用再区分两个命名空间,排障链路短一截。
host 容器的端口等于直接暴露在宿主上,绕过映射与端口发布策略,主机防火墙和安全组必须按宿主端口重新评估一遍。