无法从Node.js Docker容器调用Laravel API但Postman可正常调用
问题根因
你之前尝试的几个请求地址都不符合Docker容器内网络调用的规则:
http://localhost:8088:localhost在node容器内指向node容器自身,该容器未监听8088端口,因此触发连接拒绝http://php:8088:php容器没有开放8088端口,无服务响应该端口请求http://php:9000:9000是php-fpm的FastCGI协议端口,不支持直接接收HTTP请求,因此触发连接重置
nginx才是处理HTTP请求、转发给php-fpm的入口,同一Docker网桥下的容器可以直接通过服务名+容器内部端口访问。
解决步骤
使用正确的请求地址
在node容器内调用API时,地址改为http://nginx/api/products即可。因为nginx容器内部监听80端口,不需要加端口号,服务名nginx会被Docker内部DNS自动解析为对应容器的IP。验证连通性(可选)
可以进入node容器手动验证:
# 进入node容器 docker exec -it next sh # 安装curl(如果镜像没有自带) apk add curl # 测试请求 curl http://nginx/api/products
如果能正常返回JSON数据,说明配置没问题,直接修改Next.js代码里的API请求地址即可。
拓展注意事项
如果你的Next.js同时存在服务端渲染(SSR/SSG/ISR)和客户端渲染(CSR)的请求,需要区分地址:
- 服务端执行的代码(如getServerSideProps、服务端组件):使用容器内部地址
http://nginx/api/xxx - 客户端执行的代码(如useEffect、客户端组件):使用宿主机对外暴露的地址
http://localhost:8088/api/xxx
可以通过配置不同环境的环境变量来自动切换两个地址,避免手动修改。
其他排查方向
如果上述方法仍然无法解决,可以按以下步骤排查:
- 执行
docker ps确认nginx容器正常运行,没有退出 - 执行
docker inspect next | grep Networks和docker inspect nginx | grep Networks确认两个容器都在laravel网桥下 - 查看nginx容器日志
docker logs nginx确认请求是否正确转发
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

