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

如何从Docker容器内访问Laravel Valet部署的本地API?

如何从Docker容器内部访问Laravel Valet部署的API(api.test)

刚折腾过类似的场景,给你几个实用的解决思路,亲测有效:

问题根源

Laravel Valet依赖宿主机上的dnsmasq来解析.test域名,而Docker默认的bridge网络有自己的DNS配置,容器内部没法直接识别宿主机的本地域名解析规则,所以访问api.test会失败。

解决方案1:添加宿主机域名映射(最稳妥)

直接在Docker容器的hosts文件里把api.test指向宿主机的本地IP,步骤如下:

  1. 先找到你的宿主机本地IP:
    • Mac/Linux:终端执行 hostname -I | awk '{print $1}' 或者 ifconfig 找类似192.168.x.x的地址
    • Windows:命令行执行 ipconfig 找IPv4地址
  2. 修改你的docker-compose.yml,给web服务添加extra_hosts配置:
    version: '2'
    services:
      web:
        build: .
        ports:
          - "8090:80"
        volumes:
          - .:/var/www/html
        network_mode: bridge
        extra_hosts:
          - "api.test:192.168.1.100" # 替换成你的宿主机IP
    
  3. 重启Docker容器:docker-compose down && docker-compose up -d
    这下容器里访问api.test就会直接指向你的宿主机Valet服务了。

解决方案2:让容器使用宿主机网络(需注意端口冲突)

如果不想配置hosts,可以让容器直接复用宿主机的网络栈,这样容器和宿主机处于同一网络环境,自然能访问api.test:

  1. 修改docker-compose.yml的network_mode为host:
    version: '2'
    services:
      web:
        build: .
        # 注意:用host模式后,ports配置会失效,容器的80端口会直接占用宿主机80端口
        # 如果Valet已经占用80端口,会冲突,需要先停掉Valet或者调整容器端口
        volumes:
          - .:/var/www/html
        network_mode: host
    
    这个方案的缺点是容易出现端口冲突,比如你的容器用80端口,而Valet的nginx也用80,就会启动失败,所以更适合临时测试用。

解决方案3:配置容器DNS指向宿主机

把容器的DNS服务器设置为宿主机IP,这样容器就能用Valet的dnsmasq来解析.test域名:

  1. 修改docker-compose.yml,添加dns配置:
    version: '2'
    services:
      web:
        build: .
        ports:
          - "8090:80"
        volumes:
          - .:/var/www/html
        network_mode: bridge
        dns:
          - 192.168.1.100 # 替换成你的宿主机IP
    
    这个方案和方案1类似,好处是如果有多个.test域名,不用一个个加hosts,直接就能解析。

总结

个人最推荐方案1,既稳定又不会有端口冲突问题,配置一次就能长期用。

内容的提问来源于stack exchange,提问作者oldo.nicho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:39