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
相关产品推荐
相关产品推荐

