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

Docker部署Fastify+Node API后外部无法访问端口问题求助

问题描述

我正在为自己用Fastify和Node构建的小型API创建Docker镜像,编写了如下Dockerfile:

FROM node:current-alpine3.19

WORKDIR /usr/src/app

RUN chown -R node:node /usr/src/app

COPY src/package.json ./
COPY src/package-lock.json ./

RUN npm install

USER node

COPY --chown=node:node ./src .

CMD [ "npm", "start" ]

镜像构建成功后,我通过命令docker run -p 3000:3000 [my-project]启动容器。文件结构无误,且在容器内执行wget 127.0.0.1:3000能得到预期响应,但从本地电脑用localhost:3000或127.0.0.1:3000无法访问页面:Firefox提示“连接服务器时重置连接”,curl返回“curl: (56) Recv failure: Connection reset by peer”。Fastify运行在3000端口,容器启动命令也映射了3000端口,请问我哪里操作出错了?

解决方案

核心问题是Fastify默认仅监听容器内部的回环地址127.0.0.1,这个地址无法被容器外部的本地电脑访问。你需要修改Fastify的启动代码,让它监听0.0.0.0(容器的所有网络接口),这样端口映射才能将外部请求转发到服务上。

修改Fastify启动代码

假设原来的启动代码是:

const fastify = require('fastify')()

fastify.listen({ port: 3000 }, (err) => {
  if (err) throw err
  console.log('Server running')
})

需要调整为:

const fastify = require('fastify')()

fastify.listen({ port: 3000, host: '0.0.0.0' }, (err) => {
  if (err) throw err
  console.log('Server running on 0.0.0.0:3000')
})

或者使用异步写法:

const fastify = require('fastify')()

async function start() {
  try {
    await fastify.listen({ port: 3000, host: '0.0.0.0' })
    console.log('Server running')
  } catch (err) {
    fastify.log.error(err)
    process.exit(1)
  }
}

start()

原因说明

  • 容器内的127.0.0.1是容器自身的回环地址,和本地电脑的127.0.0.1属于不同的网络空间,本地请求无法直接到达容器内监听127.0.0.1的服务。
  • 监听0.0.0.0会让Fastify接受来自容器所有网络接口的请求,此时Docker的端口映射-p 3000:3000才能将本地电脑的3000端口请求转发到容器内的服务上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:42:51