Host模式让容器直接复用宿主机网络栈,不分配IP、不走NAT、不依赖端口映射;启用方式为docker run --net=host或Compose中设network_mode: host,但禁用端口映射且容器间无法内网通信。

直接让容器复用宿主机的网络栈,不额外分配 IP、不走 NAT、不依赖端口映射——这就是 host 模式的核心目的。配置本身很简单,但关键在于理解适用场景和规避限制。
docker run 启动时启用 host 模式
只需在命令中加入 --net=host(或简写为 --network host)即可:
docker run -d --name nginx-host --net=host nginx- 容器启动后,
curl http://localhost就能访问到容器内运行的 Nginx,因为它的 80 端口直接绑定在宿主机的 80 上 - 注意:-p / --publish 参数将被忽略,Docker 会输出警告:「Published ports are discarded when using host network mode」
docker-compose 中配置 host 网络
在 docker-compose.yml 文件中,对每个服务单独设置 network_mode: host:
-
version: '3.8' services: api: image: my-api:latest network_mode: host db-proxy: image: postgres:15 network_mode: host - 所有使用该配置的服务都共享宿主机的
127.0.0.1和全部端口,彼此之间无法通过 Docker 内网通信(如api不能用db-proxy:5432连接) - 若需跨服务调用,必须改用
localhost:5432或宿主机真实 IP
host 模式的典型用途与注意事项
它不是万能替代方案,适合特定轻量、高性能或调试场景:
-
适用:本地开发调试、需要直通宿主机代理(如
127.0.0.1:1080)、监控工具(Prometheus node_exporter)、绑定特权端口(:80、:443)且不想配sysctl - 不适用:多容器共存且需隔离端口(如两个服务都想监听 8080)、生产环境部署(缺乏网络隔离、DNS 不可用、防火墙策略难管控)
-
限制明确:无内置 DNS 解析(
/etc/resolv.conf是宿主机的)、无docker0网桥、容器间默认不通、无法使用--ip或自定义子网
验证是否生效
进入容器后执行以下命令可确认:
-
ip addr—— 输出应与宿主机完全一致,看不到eth0@ifXX这类虚拟网卡 -
cat /proc/1/ns/net与宿主机上执行相同命令,结果应为同一 inode(表示共享 network namespace) -
ss -tlnp | grep :80—— 若看到进程属主是你的容器名(如nginx),说明端口已由容器直接监听


















