直接用--network host启动容器即可,无需IP分配、端口映射或额外网络配置;docker-compose中需为各服务单独设network_mode: host,容器共享宿主机网络栈,端口直接绑定,但禁用端口映射且容器间无法通过服务名通信。

直接用 --network host(或简写 --net host)启动容器即可,不需要额外 IP 分配、端口映射或网络配置。
命令行创建 host 模式容器
最简方式就是运行时显式指定网络模式:
-
docker run -d --name my-app --network host nginx—— Nginx 直接监听宿主机的 80 端口,curl http://localhost即可访问 -
docker run -it --network host alpine ip addr—— 输出与宿主机ip addr完全一致,看不到虚拟网卡(如 eth0@ifXX) - 注意:
-p、--publish参数会被 Docker 忽略,并提示 “Published ports are discarded when using host network mode”
docker-compose 中启用 host 模式
在 docker-compose.yml 中为具体服务设置 network_mode: host:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 每个服务需单独声明,不支持全局 network 配置
- 示例:
version: '3.8'
services:
prometheus:
image: prom/prometheus
network_mode: host
exporter:
image: quay.io/prometheus/node-exporter
network_mode: host
这两个服务都共享宿主机的 127.0.0.1 和全部端口,彼此不能用服务名通信(如 prometheus 无法通过 exporter:9100 访问),必须改用 localhost:9100 或宿主机真实 IP。
验证容器是否真正运行在 host 模式
进入容器后执行以下检查可确认生效:
-
ip addr—— 应显示宿主机所有网卡及 IP,无独立容器网络接口 -
cat /proc/1/ns/net与宿主机上执行该命令的结果应指向同一 inode(表示共享 network namespace) -
ss -tlnp | grep :80—— 若看到进程名属于你的容器(如nginx),说明端口由容器直接监听
关键限制和使用前提
host 模式不是“更高级”的默认选项,它绕过了 Docker 网络层,带来性能提升的同时也引入约束:
- 多个 host 模式容器不能监听同一端口(会冲突)
- 容器间无法通过 Docker 内网互通(无内置 DNS、无 docker0 网桥)
- 无法使用
--ip、自定义子网或网络别名 - 容器内修改网络参数(如
sysctl、路由表)直接影响宿主机 - Windows/macOS 上的 Docker Desktop 通过 Linux 虚拟机运行,host 模式实际共享的是 VM 的网络栈,而非 Windows/macOS 主机本身

















