使用--network host可使容器复用宿主机网络命名空间,共享网卡、ip、路由表、iptables等,但pid、mount等命名空间仍隔离;需在docker run时指定,不可动态修改,且不可与-p混用。
直接在启动容器时加上 --network host 参数即可。
关键操作步骤
只需一条命令:
- 运行容器时显式指定
--network host,例如:docker run -d --network host --name nginx-host nginx - 不加
-p(端口映射)参数——因为 host 模式下容器直接监听宿主机端口,端口冲突会直接报错 - 容器内不再有独立的
eth0或私有 IP(如 172.17.x.x),ip addr输出和宿主机完全一致
它实际改变了什么
host 模式唯一做的,是跳过为容器创建新的网络命名空间(netns)。容器进程直接复用宿主机的 netns,因此共享:
- 所有网卡接口及 IP 地址
- 完整的路由表、ARP 缓存、iptables 规则
- sysctl 网络参数(如
net.ipv4.ip_forward) - 端口空间:容器里监听 80,就是宿主机 80 被占用
注意:不是所有命名空间都共享
仅网络命名空间被共享。其他隔离依然存在:
- PID 命名空间独立:容器里
ps aux看不到宿主机进程 - Mount、UTS(主机名)、User 命名空间仍隔离
-
/etc/hosts、/proc/sys/net等路径仍是容器视角(除非挂载覆盖)
常见误用提醒
以下做法不会生效或引发问题:
- 在已有容器上动态改 network 模式:不支持,必须重建容器
- 混用
--network host和-p 8080:80:Docker 会忽略-p,且可能报错 - 多个 host 模式容器同时监听同一端口:第二个会因端口被占而启动失败











