You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:手动创建共享网络

  1. 先创建一个全局Docker网络:
docker network create myapp-shared
  1. 修改主API的docker-compose.yml中的网络配置:
networks:
    myapp:
        external: true
        name: myapp-shared
  1. 同样修改支付API的docker-compose.yml的网络配置,与上述一致。
  2. 重启两个容器后,主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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:25:17