Host模式让容器直接复用宿主机网络栈,不分配独立IP、不走NAT、无需端口映射;启用时加--net=host,-p参数被忽略,容器内网络配置与宿主机完全一致。

Host 模式就是让容器直接用宿主机的网络栈,不额外分配 IP、不走 NAT、也不需要端口映射——它不是“配置网络”,而是“跳过网络隔离”。用对了很高效,用错了容易端口冲突或服务连不上。
docker run 启动时启用 host 模式
命令里加 --net=host(或 --network host)即可:
docker run -d --name nginx-host --net=host nginx- 容器内 Nginx 直接监听宿主机的 80 端口,访问
http://localhost就能打开页面 -
-p参数会被 Docker 忽略,并提示:Published ports are discarded when using host network mode - 容器内执行
ip addr或ifconfig,看到的是宿主机的真实网卡信息
docker-compose.yml 中配置 host 网络
在服务定义里写 network_mode: "host",不用声明 networks 字段,也不用写 ports:
- 示例:
version: '3.8'
services:
web:
image: nginx:alpine
network_mode: "host"
api:
image: my-api:latest
network_mode: "host"
127.0.0.1 和全部端口api → db:5432),得改用 localhost:5432 或宿主机真实 IP验证 host 模式是否生效
进容器后运行这几条命令,结果符合即说明成功:
-
ip addr:输出应和宿主机完全一致,看不到eth0@ifXX这类虚拟网卡 -
cat /proc/1/ns/net:与宿主机上执行该命令的结果 inode 编号相同(表示共用 network namespace) -
ss -tlnp | grep :80:能看到监听进程归属你的容器名(比如nginx),说明端口由容器直绑
哪些场景适合用,哪些要避开
host 模式不是通用解法,关键看需求是否匹配:
-
适合:本地调试需直连宿主机代理(如
127.0.0.1:1080)、监控工具(node_exporter)、绑定特权端口(:80/:443)且不想调sysctl -
不适合:多服务都想监听同一端口(比如两个服务都要
:8080)、生产环境部署(无网络隔离、DNS 不可用、防火墙难管控) -
注意限制:没有内置 DNS 解析(
/etc/resolv.conf是宿主机的)、不能用--ip、容器间默认不通、无法自定义子网


















