必须启用Host网络模式才能让Docker容器直接复用宿主机网络栈;使用--net=host参数或docker-compose中network_mode: host配置,此时端口映射失效,容器与宿主机共享IP和端口,验证需检查ip addr、/proc/1/ns/net inode及ss监听进程。

要让Docker容器直接复用宿主机的网络栈,跳过NAT、不分配独立IP、不依赖端口映射,就必须启用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」。若你写了 -p 8080:80 却又用了 --net=host,那 8080 映射根本不会存在,别指望它起作用。
在 docker-compose.yml 中配置 Host 网络
对需要直通宿主机网络的服务,在服务定义下添加 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 和全部端口,彼此之间无法通过服务名(如 db-proxy:5432)通信——它们压根不在同一个 Docker 内网里。
若 api 需连接宿主机上的 PostgreSQL,必须改写为 localhost:5432 或宿主机真实 IP,否则连接会失败。
验证 Host 模式是否真正生效
第一步:进入容器执行 ip addr,输出应与宿主机完全一致,看不到 eth0@ifXX 这类虚拟网卡设备。
第二步:在宿主机和容器中分别运行 cat /proc/1/ns/net,两个结果必须指向同一 inode 编号,这是共享 network namespace 的铁证。
第三步:运行 ss -tlnp | grep :80,若看到监听进程属主是你的容器名(例如 nginx),说明 80 端口正由容器进程直接绑定。











