我正在尝试为我用 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:“加载页面时,与服务器的连接已重置。” 卷曲:“卷曲:(56)接收失败:连接被对等方重置”
Fastify 在端口 3000 下运行,端口 3000 也用于“docker run”命令,我使用端口 3000 打开页面。
我做错了什么?
您需要接受来自 0.0.0.0 的连接,因为 127.0.0.1 引用容器而不是主机。
因此,例如,假设您的项目如下所示(非常简化!):
├── Dockerfile
└── src
├── index.js
├── package.json
└── package-lock.json
那么你的
index.js
可能是:
const fastify = require('fastify')({
logger: true
});
fastify.get('/', async (request, reply) => {
return { hello: 'world' }
});
const start = async () => {
try {
await fastify.listen({ port: 3000, host: '0.0.0.0' });
console.log(`Server is running at ${fastify.server.address().port}`);
} catch (err) {
fastify.log.error(err);
process.exit(1);
}
}
start();
重要的一点是将
host: '0.0.0.0'
指定为 fastify.listen()
。当您通过给予 docker run
-p 3000:3000
时,您还需要与主机共享此端口。