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

Docker部署Node API服务容器内可访问但浏览器无法访问问题排查

问题现象
  • Docker Compose部署Node.js全栈项目,客户端3000端口可正常通过浏览器访问
  • API容器内执行curl localhost:3001可正常获得响应,但宿主机浏览器无法访问3001端口
  • 经docker inspect确认端口映射规则正常,3001、3002端口均已绑定到宿主机0.0.0.0地址
核心原因

Fastify默认调用listen(port)时,仅会绑定容器内的回环地址127.0.0.1:

  • 容器内部访问localhost:3001走lo回环网卡,可正常连通
  • Docker端口转发的流量会走到容器的虚拟以太网卡,服务未在该网卡绑定端口,因此外部请求无法到达服务
  • 客户端服务默认启动时绑定0.0.0.0,因此3000端口映射后可正常访问
调试步骤
  • 进入API容器执行ss -tulpn(若镜像无该命令可先执行apk add iproute2安装),查看3001端口绑定地址,可确认输出为127.0.0.1:3001而非0.0.0.0:3001
  • 在宿主机执行curl http://localhost:3001,会返回连接拒绝错误,和浏览器访问表现一致
  • 核对服务启动代码,确认app.listen()仅传入端口参数,未指定对外绑定的host地址
解决方案
  1. 修改服务端启动代码,将Fastify和Socket服务均绑定到0.0.0.0地址:
    将原Fastify启动代码
await app.listen(ENV.APP.PORT);

修改为

await app.listen({ port: ENV.APP.PORT, host: '0.0.0.0' });

将原Socket服务启动代码

socketServer.listen(ENV.APP.SOCKET_PORT);

修改为

socketServer.listen(ENV.APP.SOCKET_PORT, '0.0.0.0');
  1. (规范优化,不影响功能)修正server.Dockerfile中的EXPOSE声明,原配置写的暴露端口8654和实际使用端口不符,改为:
EXPOSE 3001 3002
  1. (冗余清理,不影响功能)当前server.Dockerfile中重复拷贝、构建了客户端代码,会无谓增加API镜像体积,可删除server.Dockerfile中所有和client目录构建相关的步骤。
验证流程
  • 重新构建并启动API服务:docker compose up -d --build api
  • 再次进入容器执行ss -tulpn,确认3001、3002端口绑定地址为0.0.0.0
  • 宿主机执行curl http://localhost:3001验证返回正常
  • 浏览器访问对应API路径即可正常响应

内容的提问来源于stack exchange,提问作者DF1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:18:17