1. 使用 host.docker.internal
(推荐)
-
适用场景:Docker Desktop(Windows 和 macOS)或 Docker Engine 18.03+(Linux)。
-
原理:Docker 提供了一个特殊的主机名
host.docker.internal
,指向宿主机。 -
使用方法:
- 在容器中访问宿主机服务时,使用
host.docker.internal
代替localhost
或127.0.0.1
。 - 例如,如果宿主机上运行了一个 HTTP 服务,端口为
8080
,可以在容器中通过以下地址访问:http://host.docker.internal:8080
- 在容器中访问宿主机服务时,使用
-
注意:
- 在 Linux 上,默认不支持
host.docker.internal
,需要手动配置(见下文)。 - 如果使用 Docker Compose,可以在
docker-compose.yml
中直接使用host.docker.internal
。
- 在 Linux 上,默认不支持
2. 使用 --network="host"
-
适用场景:Linux 环境。
-
原理:将容器与宿主机共享网络命名空间,容器直接使用宿主机的网络接口。
-
使用方法:
- 启动容器时添加
--network="host"
参数:docker run --network="host" <image_name>
- 在容器中访问宿主机服务时,直接使用
localhost
或127.0.0.1
。http://localhost:8080
- 启动容器时添加
-
注意:
- 此方法仅适用于 Linux,Windows 和 macOS 不支持。
- 容器与宿主机共享网络,可能会导致端口冲突。
3. 使用宿主机的 IP 地址
-
适用场景:所有操作系统。
-
原理:通过宿主机的实际 IP 地址访问服务。
-
使用方法:
- 获取宿主机的 IP 地址:
- Linux/macOS:
ifconfig # 查找网络接口的 IP 地址
- Windows:
ipconfig # 查找网络接口的 IP 地址
- Linux/macOS:
- 在容器中访问宿主机服务时,使用宿主机的 IP 地址:
http://<宿主机IP>:8080
- 获取宿主机的 IP 地址:
-
注意:
- 如果宿主机 IP 是动态分配的(如 DHCP),可能需要固定 IP。
- 确保宿主机的防火墙允许容器访问。
4. 使用 Docker 自定义网络
- 适用场景:需要容器与宿主机服务隔离的场景。
- 原理:创建一个 Docker 自定义网络,将容器和宿主机服务加入同一网络。
- 使用方法:
- 创建自定义网络:
docker network create my_network
- 启动容器并加入自定义网络:
docker run --network my_network <image_name>
- 在容器中访问宿主机服务时,使用宿主机的 IP 地址或主机名。
- 创建自定义网络:
5. 使用 --add-host
手动映射宿主机 IP
- 适用场景:需要手动指定宿主机 IP 的场景。
- 原理:通过
--add-host
参数将宿主机 IP 映射到自定义主机名。 - 使用方法:
- 获取宿主机的 IP 地址(如
192.168.1.100
)。 - 启动容器时添加
--add-host
参数:docker run --add-host host:192.168.1.100 <image_name>
- 在容器中访问宿主机服务时,使用自定义主机名:
http://host:8080
- 获取宿主机的 IP 地址(如
6. 使用 Docker Compose
- 适用场景:使用 Docker Compose 管理多容器服务。
- 使用方法:
- 在
docker-compose.yml
中配置extra_hosts
:version: '3' services: my_service: image: <image_name> extra_hosts: - "host:192.168.1.100" # 手动映射宿主机 IP
- 在容器中访问宿主机服务时,使用自定义主机名:
http://host:8080
- 在
总结
- 推荐方法:
- Windows/macOS:使用
host.docker.internal
。 - Linux:使用
--network="host"
或host.docker.internal
(需手动配置)。
- Windows/macOS:使用
- 通用方法:
- 使用宿主机的 IP 地址。
- 使用 Docker 自定义网络或
--add-host
。