Docker 镜像:为什么页面无法访问?

问题描述 投票:0回答:1

我正在尝试为我用 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 打开页面。

我做错了什么?

node.js docker dockerfile docker-image
1个回答
0
投票

您需要接受来自 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
时,您还需要与主机共享此端口。

© www.soinside.com 2019 - 2024. All rights reserved.