使用 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
创建新项目时,NestJS 会询问您
你最喜欢用哪个软件包管理器?
我将npm在本教程中选择一种方式,但yarn如果你真的想的话,你也可以自己选择。
安装完成后,cd进入新的应用程序目录,然后像这样运行应用程序:
$ cd nestjs-docker
$ npm run start:dev
然后,使用地址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;
}
}
注意:在服务类文件中添加可导出的模型(例如 `<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();
}
}
再次运行项目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"]
打开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:
运行 Docker 容器
现在我们已经定义了 Docker 文件,我们可以完全在 Docker 上运行我们的应用程序了。
要启动我们的应用程序,请在终端中输入以下命令:
docker-compose up dev
这将以开发模式启动。保存文件时,我们甚至还会收到文件监视器,这样每次修改后就不用重新运行了😍。
要让我们的应用以生产模式运行,你猜对了……在终端中运行以下命令:
docker-compose up prod
GET再次向http://localhost:3000发送请求……瞧!应该可以正常工作了。
PS:如果您想关闭终端日志记录,可以使用-d如下标志将容器运行在单独的守护进程中:
docker-compose up -d prod
完毕!
您可以在这里找到完整的源代码。
欢迎在评论区留言告诉我你的想法,也欢迎提出任何问题✌️
文章来源:https://dev.to/erezhod/setting-up-a-nestjs-project-with-docker-for-back-end-development-30lg