在 docker-compose.yml
中配置 network_mode: host
可以让容器直接使用宿主机的网络栈,类似于 docker run --network host
的效果。
1. 基本使用方法
直接在服务的定义中指定 network_mode: host
:
<YAML>
version: "3.8"services: nginx: image: nginx:latest network_mode: host # 使用宿主机的网络栈 volumes: - ./nginx.conf:/etc/nginx/nginx.conf restart: unless-stopped
关键点:
不兼容
ports
(因为容器直接绑定宿主机的网络接口,ports
无效)。不能与其他网络相关配置共存(如
networks
)。
2. 实现 host.docker.internal
(适用于纯Linux)
如果你想要像 Docker Desktop 的 host.docker.internal
那样访问宿主机,有 3 种方法:
方法1:手动绑定宿主机IP(适合静态IP)
<YAML>
services: nginx: image: nginx:latest extra_hosts: # 通过 `--add-host` 方式映射 - "host.docker.internal:172.17.0.1" # Docker 默认网桥网关 ports: - "80:80"
172.17.0.1
是 Docker 默认网桥的宿主机网关地址,可用ip route | grep docker0
确认。
方法2:通过环境变量动态获取宿主机IP
<YAML>
services: nginx: image: nginx:latest extra_hosts: - "host.docker.internal:${DOCKER_HOST_IP}" # 手动传环境变量 ports: - "80:80"
运行时传入宿主机IP:
<BASH>
DOCKER_HOST_IP=$(ip route | grep docker0 | awk '{print $9}') docker-compose up
方法3:映射宿主机网络(简单但不是最佳)
如果你希望容器直接访问宿主机的 127.0.0.1
,可以用 network_mode: host
:
<YAML>
services: nginx: image: nginx:latest network_mode: host # 只能用127.0.0.1 volumes: - ./nginx.conf:/etc/nginx/nginx.conf
⚠️ 缺点:容器和宿主机共享网络栈,不再进行端口隔离。