如何从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,步骤如下:
- 先找到你的宿主机本地IP:
- Mac/Linux:终端执行
hostname -I | awk '{print $1}'或者ifconfig找类似192.168.x.x的地址 - Windows:命令行执行
ipconfig找IPv4地址
- Mac/Linux:终端执行
- 修改你的
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 - 重启Docker容器:
docker-compose down && docker-compose up -d
这下容器里访问api.test就会直接指向你的宿主机Valet服务了。
解决方案2:让容器使用宿主机网络(需注意端口冲突)
如果不想配置hosts,可以让容器直接复用宿主机的网络栈,这样容器和宿主机处于同一网络环境,自然能访问api.test:
- 修改
docker-compose.yml的network_mode为host:
这个方案的缺点是容易出现端口冲突,比如你的容器用80端口,而Valet的nginx也用80,就会启动失败,所以更适合临时测试用。version: '2' services: web: build: . # 注意:用host模式后,ports配置会失效,容器的80端口会直接占用宿主机80端口 # 如果Valet已经占用80端口,会冲突,需要先停掉Valet或者调整容器端口 volumes: - .:/var/www/html network_mode: host
解决方案3:配置容器DNS指向宿主机
把容器的DNS服务器设置为宿主机IP,这样容器就能用Valet的dnsmasq来解析.test域名:
- 修改
docker-compose.yml,添加dns配置:
这个方案和方案1类似,好处是如果有多个version: '2' services: web: build: . ports: - "8090:80" volumes: - .:/var/www/html network_mode: bridge dns: - 192.168.1.100 # 替换成你的宿主机IP.test域名,不用一个个加hosts,直接就能解析。
总结
个人最推荐方案1,既稳定又不会有端口冲突问题,配置一次就能长期用。
内容的提问来源于stack exchange,提问作者oldo.nicho
相关产品推荐
相关产品推荐

