docker 运行的web 宿主机通过localhost:端口访问,调用宿主机的本地项目

TwoAdmin 2025-10-15 1 10/15

docker 运行的web 宿主机通过localhost:端口访问,调用宿主机的本地项目吗?可以,但容器内部不能直接使用 localhost

容器内的 localhost 指向容器自己,不是宿主机。要让容器 A 访问宿主机上的本地项目,需要根据你的操作系统使用不同的特殊域名或 IP。

解决方案

macOS / Windows(Docker Desktop)

容器内使用 host.docker.internal 访问宿主机:

bash
# 假设宿主机本地项目运行在 3000 端口
# 在容器 A 内部访问:
http://host.docker.internal:3000

Linux

容器内使用 172.17.0.1(docker0 网桥 IP):

bash
# 在容器 A 内部访问:
http://172.17.0.1:3000

完整示例

1. 宿主机运行一个本地项目

bash
# 假设是一个 Python 简单服务,监听 3000 端口
python -m http.server 3000

2. 启动容器 A(Web 服务)

bash
docker run -d --name web-app -p 4090:4090 your-web-image

3. 在容器 A 的代码中调用宿主机服务

python
# Python 示例
import requests

# macOS/Windows
response = requests.get('http://host.docker.internal:3000/api/data')

# Linux
response = requests.get('http://172.17.0.1:3000/api/data')

注意事项

问题 解决方案
宿主机服务只监听 localhost 改为监听 0.0.0.0 或所有接口
宿主机有防火墙 允许容器的 IP 访问(通常默认允许)
Docker Desktop 旧版本 升级或使用 docker.for.mac.localhost(已弃用)

验证连通性

进入容器内部测试:

bash
# 进入容器
docker exec -it web-app /bin/sh

# 测试连接(macOS/Windows)
wget -O- http://host.docker.internal:3000

# 测试连接(Linux)
wget -O- http://172.17.0.1:3000

反向场景(容器 A 调用本地项目 vs 本地项目调用容器 A)

你的场景是 容器 A → 本地项目,上面已解决。如果是反过来(本地项目 → 容器 A),直接用 localhost:4090 即可。

- THE END -
Tag:

TwoAdmin

4月24日16:17

最后修改:2026年4月24日
0

非特殊说明,本博所有文章均为博主原创。