Bootstrap

如何在docker中访问宿主机其他服务的接口

1. 使用 host.docker.internal(推荐)

  • 适用场景:Docker Desktop(Windows 和 macOS)或 Docker Engine 18.03+(Linux)。

  • 原理:Docker 提供了一个特殊的主机名 host.docker.internal,指向宿主机。

  • 使用方法

    1. 在容器中访问宿主机服务时,使用 host.docker.internal 代替 localhost127.0.0.1
    2. 例如,如果宿主机上运行了一个 HTTP 服务,端口为 8080,可以在容器中通过以下地址访问:
      http://host.docker.internal:8080
      
  • 注意

    • 在 Linux 上,默认不支持 host.docker.internal,需要手动配置(见下文)。
    • 如果使用 Docker Compose,可以在 docker-compose.yml 中直接使用 host.docker.internal

2. 使用 --network="host"

  • 适用场景:Linux 环境。

  • 原理:将容器与宿主机共享网络命名空间,容器直接使用宿主机的网络接口。

  • 使用方法

    1. 启动容器时添加 --network="host" 参数:
      docker run --network="host" <image_name>
      
    2. 在容器中访问宿主机服务时,直接使用 localhost127.0.0.1
      http://localhost:8080
      
  • 注意

    • 此方法仅适用于 Linux,Windows 和 macOS 不支持。
    • 容器与宿主机共享网络,可能会导致端口冲突。

3. 使用宿主机的 IP 地址

  • 适用场景:所有操作系统。

  • 原理:通过宿主机的实际 IP 地址访问服务。

  • 使用方法

    1. 获取宿主机的 IP 地址:
      • Linux/macOS
        ifconfig  # 查找网络接口的 IP 地址
        
      • Windows
        ipconfig  # 查找网络接口的 IP 地址
        
    2. 在容器中访问宿主机服务时,使用宿主机的 IP 地址:
      http://<宿主机IP>:8080
      
  • 注意

    • 如果宿主机 IP 是动态分配的(如 DHCP),可能需要固定 IP。
    • 确保宿主机的防火墙允许容器访问。

4. 使用 Docker 自定义网络

  • 适用场景:需要容器与宿主机服务隔离的场景。
  • 原理:创建一个 Docker 自定义网络,将容器和宿主机服务加入同一网络。
  • 使用方法
    1. 创建自定义网络:
      docker network create my_network
      
    2. 启动容器并加入自定义网络:
      docker run --network my_network <image_name>
      
    3. 在容器中访问宿主机服务时,使用宿主机的 IP 地址或主机名。

5. 使用 --add-host 手动映射宿主机 IP

  • 适用场景:需要手动指定宿主机 IP 的场景。
  • 原理:通过 --add-host 参数将宿主机 IP 映射到自定义主机名。
  • 使用方法
    1. 获取宿主机的 IP 地址(如 192.168.1.100)。
    2. 启动容器时添加 --add-host 参数:
      docker run --add-host host:192.168.1.100 <image_name>
      
    3. 在容器中访问宿主机服务时,使用自定义主机名:
      http://host:8080
      

6. 使用 Docker Compose

  • 适用场景:使用 Docker Compose 管理多容器服务。
  • 使用方法
    1. docker-compose.yml 中配置 extra_hosts
      version: '3'
      services:
        my_service:
          image: <image_name>
          extra_hosts:
            - "host:192.168.1.100"  # 手动映射宿主机 IP
      
    2. 在容器中访问宿主机服务时,使用自定义主机名:
      http://host:8080
      

总结

  • 推荐方法
    • Windows/macOS:使用 host.docker.internal
    • Linux:使用 --network="host"host.docker.internal(需手动配置)。
  • 通用方法
    • 使用宿主机的 IP 地址。
    • 使用 Docker 自定义网络或 --add-host
;