启用 host 网络模式需在 docker run 命令末尾添加 --net=host,使容器复用宿主机网络栈,无需端口映射但需注意端口冲突、无容器间内网通信及安全边界弱化等问题。
直接在 docker run 命令末尾加上 --net=host(或等价写法 --network host)即可启用 host 网络模式。它会让容器跳过独立网络命名空间的创建,直接复用宿主机的网络栈。
基础用法:单容器启动
命令结构简洁明确:
docker run -d --net=host --name my-app nginx:alpine- 容器内 Nginx 默认监听 80 端口,启动后可直接通过
http://localhost或http://宿主机IP访问 - 无需
-p映射,Docker 会忽略并提示 “Published ports are discarded…”
关键注意事项
host 模式不是“加个参数就完事”,需特别留意以下限制:
- 端口冲突会直接导致容器启动失败——例如宿主机 80 端口已被占用,Nginx 容器就无法绑定成功
- 容器之间无法通过内网 IP 通信(因为没有独立 IP,也不走 docker0 网桥)
- 容器内看到的
ip addr、netstat -tln结果与宿主机完全一致 - 安全边界弱化:容器进程能直接操作宿主机网络接口,应避免在不可信镜像中使用
docker-compose 中启用 host 模式
在服务级别单独设置 network_mode: host,不支持全局 network 配置:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
version: '3.8'
services:
api:
image: my-api:v1
network_mode: host
cache:
image: redis:7
network_mode: host
注意:ports、expose 字段在此类服务中无效,也不应出现。
验证是否生效
进入容器执行以下任一命令,结果应与宿主机输出一致:
-
hostname -I→ 显示宿主机 IP,而非 172.17.x.x 类地址 -
ip link show | grep "state UP"→ 网卡列表和状态同宿主机 -
ss -tln | grep :80→ 若运行了 Web 服务,应看到*:80而非127.0.0.1:80或:::80

















