在Docker容器内连接到Nest.js服务器

3

我正在尝试创建一个Nest.js服务器的容器。目前,我只有创建Nest项目时自动生成的基本版本服务器。我在Dockerfile和docker-compose中尝试了一些东西,但是当我启动容器并转到浏览器访问localhost:3042时,它提示页面无法访问,但应该会获取对象。

因此,现在我的Dockerfile看起来像这样:

FROM node:10

WORKDIR /microservices

COPY package*.json ./
COPY tsconfig.json tsconfig.json
COPY src src
RUN ["npm","install","global","@nestjs/cli"]
RUN ["npm", "install"]

EXPOSE 3042

ENTRYPOINT ["npm","run","start"]

我的 docker-compose.yaml 文件长这样:

version: "3.2"
services:
  server:
    container_name: server
    hostname: localhost
    build: ./
    ports:
    - "3042:3042"

我运行了 docker-compose up 命令,但在浏览器中无法工作。 docker-compose up 命令的输出为:
server      | [Nest] 18   - 07/12/2019, 1:44 PM   [NestFactory] Starting Nest application...
server      | [Nest] 18   - 07/12/2019, 1:44 PM   [InstanceLoader] AppModule dependencies initialized +26ms
server      | [Nest] 18   - 07/12/2019, 1:44 PM   [RoutesResolver] AppController {/}: +10ms
server      | [Nest] 18   - 07/12/2019, 1:44 PM   [RouterExplorer] Mapped {/, GET} route +7ms
server      | [Nest] 18   - 07/12/2019, 1:44 PM   [NestApplication] Nest application successfully started +5ms

因此似乎内部正在进行某些操作,应用程序成功启动。

我查看了一些示例,其中一个使用了 Python 的官方文档,并且还有另一个使用了 Express.js 的示例,但都没有帮助我。


当你说“不起作用”时,实际上发生了什么?你是从浏览器还是另一个Docker容器连接的?在同一主机上还是在不同的主机上? - David Maze
我基本上按照此处https://docs.docker.com/compose/gettingstarted/的步骤进行操作,但针对Nestjs服务器。我期望通过在我的电脑浏览器中连接到地址localhost:3042(因为我暴露了3042端口,并且在docker-compose中将其映射到相同的3042端口)来接收从服务器中GET方法的消息,就像他们的示例一样。 - Pop Emann
你的代码或框架中是否有设置“绑定地址”或“监听地址”的选项?如果它被设置为仅监听'localhost'或'127.0.0.1',那么你的服务将无法从容器外部访问,需要改为监听'0.0.0.0'。(这是一个常见问题,但这只是一个猜测;包含足够的代码使别人能够重现这个问题会很有帮助。) - David Maze
好的,也许我应该添加一些关于Nestjs服务器的信息。我只是按照他们的教程运行了命令来创建一个基本服务器,这基本上就是我所拥有的全部内容。 该教程链接为:https://docs.nestjs.com/first-steps - Pop Emann
4个回答

3
在我的情况下,我使用的是FastifyAdapter,而当在docker环境中时,你必须将主机指定为"0.0.0.0"而不是localhost。问题在于,你必须将主机作为第二个参数添加,而不是连接字符串:

WRONG

const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());
await app.listen("0.0.0.0:3000");

正确

const app = await NestFactory.create(AppModule);
await app.listen(3000, "0.0.0.0");

1
Nest默认使用端口3000,所以我认为这就是问题所在。您可以尝试在main.ts中更改它:
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3042);
}

或者更改您的Docker配置。 Dockerfile
EXPOSE 3000/tcp

docker-compose.yml

version: "3.2"
services:
  server:
    container_name: server
    hostname: localhost
    build: ./
    ports:
    - 3000:3000

在他们的文档(使用Python)中,我看到他们为服务器应用程序使用了不同的端口,而不是容器的端口(对于应用程序,他们使用了6379,但对于容器则是5000:5000)。无论如何,我尝试使用各种端口组合,但似乎都没有起作用。我甚至尝试将服务器端口和Docker端口都设置为3042:3042。 - Pop Emann
你尝试过从docker-compose中删除主机名吗?你收到了什么错误? - Miguel Santos

0

如果您正在使用 process.env,请确保在 .env 文件中定义特定的端口,例如:

APP_PORT=3000

@main.ts

 await app.listen(process.env.APP_PORT || 3000, '0.0.0.0');

并在你的依赖项中添加@nestjs/config。从此处查看更多详细信息。


0

如果有人遇到同样的问题,我的问题是我在app.listen中添加了第二个参数

将其更改为:

    await app.listen(this.port, this.host);

转换成这个

    await app.listen(this.port);

问题已解决


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接