Docker化Laravel API间无法发送HTTP请求的问题求助
Docker化Laravel API间调用域名解析失败问题解决
问题描述
我有两个Docker化的Laravel应用,均作为API使用,分别为主API(Main API)和支付API(Payment API)。
主API的Docker Compose配置:
version: '3.8' services: api: image: 'myapp/api:1.0' container_name: 'myapp-api' restart: 'on-failure' user: '1000:1000' build: context: . dockerfile: '.docker/Dockerfile' args: UID: '1000' GID: '1000' ports: - '${APP_PORT:-80}:80' volumes: - '.:/var/www/html' networks: - myapp networks: myapp: driver: bridge
支付API的Docker Compose配置:
version: '3.8' services: payment-api: image: 'myapp/payment-api:1.0' container_name: 'myapp-payment-api' restart: 'on-failure' user: '1000:1000' build: context: . dockerfile: '.docker/Dockerfile' args: UID: '1000' GID: '1000' ports: - '${APP_PORT:-801}:80' volumes: - '.:/var/www/html' networks: - myapp networks: myapp: driver: bridge
尝试从主API调用支付API的健康检查接口:
use Illuminate\Support\Facades\Http; Http::get('http://payment-api/api/health_check');
出现错误:
cURL error 6: Could not resolve host: payment-api for http://payment-api/api/health_check
备注:health_check接口未挂载任何中间件,浏览器访问http://localhost:801/api/health_check正常,但Laravel内部调用失败,尝试过容器名称和http://localhost均无效。
解决方法
问题根源
两个容器虽然配置了同名的myapp网络,但如果是通过各自独立的docker-compose文件启动,Docker会自动为每个docker-compose项目生成带项目前缀的独立网络,导致两个容器不在同一网络内,无法通过服务名/容器名解析。
方案1:合并docker-compose配置
将两个服务放到同一个docker-compose.yml文件中,确保它们处于同一网络。合并后的示例:
version: '3.8' services: api: image: 'myapp/api:1.0' container_name: 'myapp-api' restart: 'on-failure' user: '1000:1000' build: context: ./main-api # 替换为主API的代码目录路径 dockerfile: '.docker/Dockerfile' args: UID: '1000' GID: '1000' ports: - '${APP_PORT:-80}:80' volumes: - './main-api:/var/www/html' networks: - myapp payment-api: image: 'myapp/payment-api:1.0' container_name: 'myapp-payment-api' restart: 'on-failure' user: '1000:1000' build: context: ./payment-api # 替换为支付API的代码目录路径 dockerfile: '.docker/Dockerfile' args: UID: '1000' GID: '1000' ports: - '${APP_PORT:-801}:80' volumes: - './payment-api:/var/www/html' networks: - myapp networks: myapp: driver: bridge
此时主API可以直接用http://payment-api/api/health_check调用支付API。
方案2:手动创建共享网络
- 先创建一个全局Docker网络:
docker network create myapp-shared
- 修改主API的docker-compose.yml中的网络配置:
networks: myapp: external: true name: myapp-shared
- 同样修改支付API的docker-compose.yml的网络配置,与上述一致。
- 重启两个容器后,主API可通过
http://payment-api/api/health_check(服务名)或http://myapp-payment-api/api/health_check(容器名称)调用。
方案3:使用宿主机IP调用
如果不想调整网络配置,可直接使用宿主机IP访问支付API:
// Linux环境可使用宿主机内网IP或默认Docker网关172.17.0.1 // Mac/Windows Docker Desktop可使用host.docker.internal Http::get('http://host.docker.internal:801/api/health_check');
内容的提问来源于stack exchange,提问作者nwantiti
相关产品推荐
相关产品推荐

