kiron
Published on 2025-04-02 / 2 Visits
0

nginx容器直接访问宿主机服务的方式

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
  • ⚠️ 缺点:容器和宿主机共享网络栈,不再进行端口隔离。