使用 Docker 和 PostgreSQL 设置 NestJS 应用程序

1,076 阅读5分钟

NestJS、PostgreSQL 和 Docker 这三个强大的工具可以帮助您快速轻松地构建健壮的 Web 应用程序。NestJS 是一个现代的、渐进的 Node.js 框架,允许您使用 TypeScript 构建服务器端应用程序。PostgreSQL 是一个功能强大的开源数据库管理系统,可提供可靠的数据存储和检索。Docker 是一个容器化平台,可简化应用程序的部署和管理。

这三个工具为构建可伸缩且高效的 Web 应用程序提供了强大的工具包。本文将为初学者提供使用 NestJS、PostgreSQL 和 Docker 构建 Web 应用程序的友好指南。

用于构建高效且可扩展的服务器端应用程序的渐进式Node.js框架。

NPM 版本
包许可证
NPM 下载
圈子CI
覆盖范围
不和谐
Open Collective 的支持者
Open Collective 赞助商

支持我们

描述

Nest框架 TypeScript 入门存储库。

安装

$ npm install

运行应用程序

# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod

测试

# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov

先决条件

  • 对 TypeScript、PostgreSQL 和 RESTful API 的基本了解
  • 在您的计算机上安装 Docker Desktop(运行命令docker -v以验证安装);如果没有,从这里安装

设置 NestJS 应用程序

我们需要node及其包管理器npm来初始化一个新项目。

要安装 Node,我们转到Nodejs 网站并按照说明进行操作。我们使用下面的终端命令验证 Node.js 的安装:

node -v
v18.15.0 //node version installed

结果显示了我们在计算机上安装的 Node.js 版本。

接下来我们将全局安装 NestJS 并通过在我们的终端中运行以下命令来初始化一个新项目:

$ npm i -g @nestjs/cli

$ nest new nest-docker-postgres

确保npm从提示中选择包管理器。

使用以下命令启动开发服务器并访问http://localhost:3000/以查看应用程序运行情况:

$ npm run start:dev

容器化应用程序

Dockerfile为了容器化我们的 NestJS 应用程序,我们首先在项目的根目录中创建一个名为的文件,然后docker-compose.yml在项目的根目录中创建一个文件。

设置Dockerfile用于运行应用程序的容器。它安装必要的依赖项,将应用程序代码复制到容器中,构建应用程序,并使用生产构建启动服务器。

docker-compose文件设置了一个多容器环境。在其中,我们将使用 PostgreSQL 和 pgAdmin 运行 NestJS 应用程序。

文件

FROM node:18

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

CMD [ "npm", "run", "start:dev" ]

以下是此文件中每个命令的作用:

  1. FROM node:18:指定 Docker 容器的基础镜像。在这种情况下,我们使用官方 Node.js18.x图像作为基础。
  2. WORKDIR /app: 将容器内的工作目录设置为/app. 这是应用程序代码将被复制的地方,也是容器运行的地方。
  3. COPY package*.json ./ : 将宿主机当前目录中的package.json和文件复制到容器中的目录中。in允许我们一次复制这两个文件。package-lock.json``/app``*``package*.json
  4. RUN npm install:在容器中安装应用程序依赖项。该步骤使用npm install命令安装 中列出的依赖项package.json
  5. COPY . . :将应用程序代码从宿主机复制到/app容器中的目录中。
  6. RUN npm run build:该npm run build命令用于在容器中构建应用程序。此命令通常会创建一个dist文件夹,其中包含应用程序的生产版本。
  7. CMD ["npm", "run", "start:dev"] :指定容器启动时要运行的命令。在这种情况下,我们正在运行命令npm run start:dev,它将以开发模式启动服务器。此命令监视代码中的更改并在检测到更改时自动重建容器。这允许更快的开发周期,因为可以在容器中快速测试对代码的更改,而无需手动重建或重新启动。

docker-compose.yml

version: '3.5'

services:
  db:
    image: postgres
    restart: always
    environment:
      - POSTGRES_PASSWORD=postgres
    container_name: postgres
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: nest-docker-postgres
    environment:
      - PORT=${PORT}
    ports:
      - '3000:3000'
    depends_on:
      - db
    volumes:
      - ./src:/app/src

  pgadmin:
    image: dpage/pgadmin4
    restart: always
    container_name: nest-pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@admin.com
      - PGADMIN_DEFAULT_PASSWORD=pgadmin4
    ports:
      - '5050:80'
    depends_on:
      - db

在这个文件中:

  • version:Docker Compose 文件开头的这个字段指定我们正在使用的 Compose 文件格式的版本。
  • db:此服务使用来自 Docker Hub 的官方图像设置 PostgreSQL 数据库postgres。它将用户的密码设置postgrespostgres,创建一个用于pgdata存储数据库数据的命名卷,并将容器端口映射5432到主机端口5432。该restart: always选项确保容器在崩溃或停止时自动重启。
  • appDockerfile:此服务使用当前目录中的为 NestJS 应用程序构建 Docker 映像。它将容器名称设置为nest-docker-postgres,将环境变量设置PORT为主机环境变量的值PORT,将容器端口映射3000到主机端口3000,并将src主机上的目录挂载到/app/src容器中的目录。该depends_on选项指定此服务依赖于db服务,意味着db容器将在容器之前启动app
  • pgadmindpage/pgadmin4:此服务使用Docker Hub 中的映像设置 pgAdmin,这是一个基于 Web 的 PostgreSQL 管理工具。它将容器名称设置为nest-pgadmin4,设置 pgAdmin 登录的默认电子邮件和密码,将容器端口映射80到主机端口5050,并指定此服务依赖于该db服务。

我们还需要添加一个名为.dockerignore.dockerignore它指定应从 Docker 构建上下文中排除的文件和目录。

.dockerignore

Dockerfile
.dockerignore
node_modules
npm-debug.log
dist

构建容器

接下来我们需要做的是构建以在 Docker 中运行我们的应用程序——构建容器。运行以下命令以容器化应用程序:

$ docker compose up

该命令查找**docker-compose.yml**文件中指定的服务并为它们创建容器。如果这些服务所需的镜像在本地不可用,Docker 将从 Docker Hub 或任何其他已配置的注册表中拉取它们。如果镜像已经在本地可用,Docker 将使用它们而不是再次拉取它们。

容器启动并运行后,我们可以通过在 Web 浏览器中访问http://localhost:3000 来访问 NestJS 应用程序,在 Web 浏览器中访问http://localhost:5050来访问 pgAdmin。

使用我们之前在文件中指定的电子邮件和密码登录 pgAdmin docker-compose.yml,然后我们将看到:

pgAdmin 仪表板

设置 pgAdmin 和 PostgreSQL 服务器

要从 PgAdmin 连接到 PostgreSQL 服务器,我们需要在 PgAdmin 中创建一个服务器对象,其中包含 PostgreSQL 服务器的详细信息。

以下是在 PgAdmin 中创建服务器的步骤:

  1. 通过访问http://localhost:5050在 Web 浏览器中打开 PgAdmin (假设我们使用文件中的默认配置**docker-compose.yml**)。

  2. docker-compose.yml使用服务文件中的电子邮件和密码登录pgadmin

  3. 在左侧边栏中,单击Servers以展开Servers菜单。

  4. 右键单击Servers并选择Register-> Server

  5. 在对话框General的选项卡中Create - Server,我们可以为服务器指定一个我们选择的名称。

  6. Connection选项卡中,填写以下详细信息:

    • 主机名/地址:db
    • 端口:5432
    • 维护数据库:postgres
    • 用户名:postgres
    • 密码:postgres
  7. 单击Save以保存服务器配置。

注意: 由于 PostgreSQL 服务器在 Docker 容器中运行,因此主机名/地址将是文件中定义的数据库容器的 Docker 服务名称**docker-compose.yml** 。默认情况下,服务名称成为 Docker 网络中容器的主机名/地址。

我们现在应该在 PgAdmin 的左侧边栏中看到我们创建的服务器。我们可以展开服务器以查看其中的数据库和其他对象。

PgAdmin 仪表板

从 NestJS 连接到 PostgreSQL 服务器

Nest 提供了@nestjs/typeorm与 SQL 和 NoSQL 数据库集成的包。使用以下命令安装软件包:

$ npm install --save @nestjs/typeorm typeorm pg

接下来,在app.module.ts文件中的数组中添加以下代码imports

    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'db',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: 'postgres',
      entities: [],
      synchronize: true,
      autoLoadEntities: true,
    }),

TypeOrmModule我们从包中导入@nestjs/typeorm

我们将一个options对象传递给以TypeOrmModule配置 PostgreSQL 连接详细信息。该type选项指定正在使用的数据库管理系统,PostgreSQL。、、、和选项提供 PostgreSQL 服务器的连接详细信息hostport``username``password``database

我们使用该entities选项来指定应用程序使用的实体。实体表示应用程序中的数据模型,可用于查询数据库。在这种情况下我们不指定实体,因为我们通过设置为动态加载autoLoadEntities它们true

我们将synchronize选项设置为true,这意味着 TypeORM 将根据实体自动生成数据库表。但是,在生产中应谨慎使用此选项,因为它可能会导致数据丢失和冲突。

由于所做的更改,要重建我们的应用程序容器,我们执行以下命令:

$ docker compose up --build

瞧,我们的应用程序已连接到在 Docker 中运行的 PostgreSQL 服务器。我们现在可以开始创建实体并在它们之上构建 API。

结论

总之,我们已经在分步指南中了解了如何使用 Docker 和 PostgreSQL 设置 NestJS 应用程序。将 Docker 和 PostgreSQL 与 NestJS 结合使用可以使您的 Web 应用程序开发更快、更高效。