如何从Docker容器内访问Laravel Herd运行的应用?
解决Docker容器访问Mac上Laravel Herd本地域名的问题
针对你在MacOS Sequoia 15.0.1上遇到的Docker容器无法访问Herd托管的myapp1.test等本地域名的问题,以下是几个可行的解决方案:
方法1:配置容器DNS指向本地主机IP
Laravel Herd通过修改本地DNS实现.test域名的解析,让容器使用主机的DNS即可正确解析这些域名:
- 获取你的Mac局域网IP:打开终端执行
ifconfig en0 | grep inet,输出中inet后的值即为目标IP(例如192.168.3.10) - 启动Docker容器时添加
--dns参数指向该IP,同时保留host.docker.internal映射:
docker run --dns=192.168.3.10 --add-host=host.docker.internal:host-gateway your-service-image
此时容器内访问http://myapp1.test/endpoint会通过主机DNS解析到正确的本地服务。
方法2:手动在容器hosts中映射.test域名
如果不想修改DNS配置,可以直接把目标域名映射到host.docker.internal(Mac上该地址指向主机):
启动容器时添加--add-host参数,每个域名对应一条:
docker run --add-host=myapp1.test:host.docker.internal --add-host=myapp2.test:host.docker.internal your-service-image
这个方法直接强制容器将.test域名解析到主机,无需依赖DNS配置。
方法3:通过主机IP+Host头访问
如果你的Herd应用绑定在主机的局域网IP上(而非仅127.0.0.1),可以在容器内通过主机IP访问,并手动指定Host头匹配虚拟主机配置:
- 用方法1的方式获取主机局域网IP(如
192.168.3.10) - 在容器内发起请求时添加
Host头,以curl为例:
curl -H "Host: myapp1.test" http://192.168.3.10/endpoint
如果应用运行在自定义端口(如9090),则加上端口:
curl -H "Host: myapp1.test" http://192.168.3.10:9090/endpoint
若你的服务支持配置请求头,也可在服务代码中固定添加该Host头。
为何之前的方法失效?
--network=host在Mac Docker中无效:Mac的Docker运行在底层虚拟机中,host模式指向的是虚拟机的网络命名空间,而非Mac主机,因此无法直接访问主机的127.0.0.1服务。--add-host=host.docker.internal:host-gateway仅解决了主机IP映射,但容器默认DNS无法解析.test域名,单独使用无法定位到Herd应用。
内容的提问来源于stack exchange,提问作者Sammy Bessette
相关产品推荐
相关产品推荐

