发布于 2026-01-06 8 阅读
0

使用 Docker 设置 NestJS 项目以进行后端开发 前提条件 创建一个新的 NestJS 应用程序 创建一个新的 API 服务 让我们将其 Docker 化! 运行 Docker 容器 完成!

使用 Docker 设置 NestJS 项目以进行后端开发

先决条件

创建一个新的 NestJS 应用程序

创建新的 API 服务

让我们把它容器化吧!

运行 Docker 容器




完毕!

在发现搭建 NodeJS + Express 应用程序有多么麻烦之后,NestJS 已经成为我在 NodeJS 中进行 API 开发的首选后端框架很长一段时间了,更不用说如果你想要 TypeScript 支持,它需要进行大量的设置。

此外,我认为在所有后端应用程序中,开发(以及生产)都必须实现 Docker,因为它使得部署变得极其简单和可预测,无论部署到哪个服务。

先决条件

我不会深入讲解 NestJS 或 Docker,因为本教程的重点是使用 Docker 运行 NestJS 应用环境,仅此而已。未来我会专门制作一个系列教程,更深入地讲解 NestJS 和 Docker,并分享最佳实践。

为了充分理解接下来要介绍的代码的工作原理,您应该对以下几个方面有一定的了解:

  • 使用终端
  • JavaScript/TypeScript
  • Docker 的工作原理

我们开始吧!

创建一个新的 NestJS 应用程序

首先在您的计算机上安装 NestJS CLI npm,然后创建一个新项目:



$ npm i -g @nestjs/cli
$ nest new nestjs-docker


Enter fullscreen mode Exit fullscreen mode

创建新项目时,NestJS 会询问您

你最喜欢用哪个软件包管理器?

我将npm在本教程中选择一种方式,但yarn如果你真的想的话,你也可以自己选择。

安装完成后,cd进入新的应用程序目录,然后像这样运行应用程序:



$ cd nestjs-docker
$ npm run start:dev


Enter fullscreen mode Exit fullscreen mode

然后,使用地址http://localhost:3000在浏览器中打开您新创建的应用程序,以确保一切运行顺畅。

创建新的 API 服务

让我们创建一个新的 API 服务,该服务返回一个硬编码的电影数组,我们可以在用 Docker 容器化后使用该数组来测试我们的 API。

使用您喜欢的文本/代码编辑器(我使用的是Visual Studio Code )打开新建的项目目录
您的工作区应该看起来像这样:
替代文字

然后,打开该src目录。这里存放着应用程序的源文件,以便我们开始开发。

打开文件app.service.ts,并将文件的全部内容替换为以下代码:



import { Injectable } from '@nestjs/common';

export interface Movie {
  id: number;
  name: string;
  year: number;
}

@Injectable()
export class AppService {
  private movies: Movie[] = [
    { id: 1, name: 'Star Wars: The Force Awakens', year: 2015 },
    { id: 2, name: 'Star Wars: The Last Jedi', year: 2017 },
    { id: 3, name: 'Star Wars: The Rise of Skywalker', year: 2019 },
  ];

  getMovies(): Movie[] {
    return this.movies;
  }
}


Enter fullscreen mode Exit fullscreen mode

注意:在服务类文件中添加可导出的模型(例如 `<model_name> Movie`)绝对不是好的做法,任何情况下都不应该这样做。这仅用于演示目的。请在您的应用程序中使用不同的模型文件。

接下来,打开该文件app.controller.ts,并将文件的全部内容替换为以下代码:



import { Controller, Get } from '@nestjs/common';
import { AppService, Movie } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getMovies(): Movie[] {
    return this.appService.getMovies();
  }
}


Enter fullscreen mode Exit fullscreen mode

再次运行项目npm run start:dev,然后在浏览器中打开http://localhost:3000访问应用程序;或者,您可以使用Postman创建一个新的GET请求,以获得更规范、更语义化的工作流程。
最终结果应如下所示:
替代文字

让我们把它容器化吧!

现在我们的后端 API 应用已经启动并运行,让我们使用 Docker 将其容器化以进行开发。

首先在项目根目录中创建以下文件:

  • Dockerfile此文件将负责导入 Docker 镜像,将其划分为development不同的production环境,复制所有文件并安装npm依赖项。
  • docker-compose.yml此文件将负责定义我们的容器、应用程序和其他服务所需的镜像、存储卷、环境变量等。

打开文件Dockerfile,并在其中添加以下代码:



FROM node:12.19.0-alpine3.9 AS development

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install glob rimraf

RUN npm install --only=development

COPY . .

RUN npm run build

FROM node:12.19.0-alpine3.9 as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --only=production

COPY . .

COPY --from=development /usr/src/app/dist ./dist

CMD ["node", "dist/main"]


Enter fullscreen mode Exit fullscreen mode

打开docker-compose.yml文件并添加以下代码:



version: '3.8'

services:
    dev:
        container_name: nestjs_api_dev
        image: nestjs-api-dev:1.0.0
        build:
            context: .
            target: development
            dockerfile: ./Dockerfile
        command: npm run start:debug
        ports:
            - 3000:3000
            - 9229:9229
        networks:
            - nesjs-network
        volumes:
            - .:/usr/src/app
            - /usr/src/app/node_modules
        restart: unless-stopped
    prod:
        container_name: nestjs_api_prod
        image: nestjs-api-prod:1.0.0
        build:
            context: .
            target: production
            dockerfile: ./Dockerfile
        command: npm run start:prod
        ports:
            - 3000:3000
            - 9229:9229
        networks:
            - nesjs-network
        volumes:
            - .:/usr/src/app
            - /usr/src/app/node_modules
        restart: unless-stopped

networks:
    nesjs-network:


Enter fullscreen mode Exit fullscreen mode

运行 Docker 容器

现在我们已经定义了 Docker 文件,我们可以完全在 Docker 上运行我们的应用程序了。

要启动我们的应用程序,请在终端中输入以下命令:



docker-compose up dev


Enter fullscreen mode Exit fullscreen mode

这将以开发模式启动。保存文件时,我们甚至还会收到文件监视器,这样每次修改后就不用重新运行了😍。

要让我们的应用以生产模式运行,你猜对了……在终端中运行以下命令:



docker-compose up prod


Enter fullscreen mode Exit fullscreen mode

GET再次向http://localhost:3000发送请求……瞧!应该可以正常工作了。

PS:如果您想关闭终端日志记录,可以使用-d如下标志将容器运行在单独的守护进程中:



docker-compose up -d prod

Enter fullscreen mode Exit fullscreen mode




完毕!

您可以在这里找到完整的源代码

欢迎在评论区留言告诉我你的想法,也欢迎提出任何问题✌️

文章来源:https://dev.to/erezhod/setting-up-a-nestjs-project-with-docker-for-back-end-development-30lg