Contents

如何使用 Docker 和 Docker Compose 容器化 Nest.js 應用程序

“但它可以在我的計算機上運行……”開發人員的笑話完美地凸顯了跨不同系統部署和運行應用程序的挑戰。

對於開發人員來說,瀏覽複雜的依賴配置和版本兼容性可能是一項艱鉅的任務。然而,有一種有效的方法可以通過利用 Docker 等容器化技術來緩解這些挑戰。這種方法通過將所有必要的組件封裝在一個獨立的環境中來簡化流程,從而減少潛在的衝突並簡化部署流程。

該平台使用戶能夠在容器化環境中無縫部署和執行應用程序及其所需的組件;從而消除了生產環境中復雜的設置程序的必要性。

了解 Docker 和 Docker Compose

Docker 是一個開源開發平台,提供用於構建和打包應用程序及其依賴項作為可移植映像的容器化技術。

上述視覺效果隨後以可執行模塊的形式在獨立容器設置內執行。在這種範圍內部署應用程序可確保不同生產平台的性能一致性,避免任何潛在的差異或互操作性障礙。

/bc/images/ship-with-containers.jpg

Docker Compose 與 Docker 結合使用時可充當輔助工具,有助於簡化多容器應用程序設置和管理流程。

Docker Compose 通過管理共同構成單個應用程序的多個容器來擴展 Docker 的功能。

這種方法在軟件應用涉及多個相互依賴的服務(包括但不限於各種數據庫系統,以及多個相互依賴的API服務)的場景中尤其有利。

在深入研究代碼之前,您需要在本地計算機上安裝 Docker Desktop。完成官方文檔中特定於系統的要求和安裝步驟。

人們可以在其 GitHub 存儲庫中找到該軟件的源代碼,該存儲庫充當數字存檔和版本控制系統,用於跟踪程序隨時間的變化。

設置 Nest.js 項目

本教程將描述串聯部署兩個 Docker 容器以充當統一的 Nest.js 應用程序的過程。初始容器應託管 Nest.js Web 服務器 Docker 映像的實例,後續容器應運行 Docker 的 PostgreSQL 數據庫映像。

要啟動該過程,需要安裝 Nest.js 命令行界面 (CLI) 實用程序。這將提供一種與項目交互並從終端執行各種命令的便捷方法。

 npm i -g @nestjs/cli 

要使用終端建立新的 Nest.js 項目,請在終端窗口中執行以下命令:

 nest new docker-nest-app 

選擇“創建項目”後,將顯示可用包管理器的列表。此時請選擇所需的一項。為了舉例,讓我們選擇“npm”,它是節點包管理器。

最後,可以導航到項目目錄並啟動開發服務器。

 cd docker-nest-app
npm run start 

創建數據庫模塊

首先,安裝這些依賴項:

 npm install pg typeorm @nestjs/typeorm @nestjs/config 

在項目的主目錄中,建立一個“.env”文件並插入數據庫連接的後續配置:

 DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123" 

最後,繼續創建數據庫模塊。

 nest g module database 

在 Visual Studio Code 中創建新模塊後,訪問“database/database.module.ts”文件並合併後續數據庫設置代碼,如下所示:

 import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';


 @Module({
  imports: [
    ConfigModule.forRoot(),
     TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
       useFactory: async (configService: ConfigService) => ({
        type: 'postgres',
        host: configService.get<string>('DATABASE_HOST'),
         port: configService.get<number>('DATABASE_PORT'),
        username: configService.get<string>('DATABASE_USER'),
        password: configService.get<string>('DATABASE_PASSWORD'),
        synchronize: true,
      }),
      inject: [ConfigService],
     }),
  ],
})

export class DatabaseModule {} 

在 TypeORM 設置中實現指定的 Docker PostgreSQL 配置後,您的 Nest.js 應用程序應成功與數據庫連接。

更新 app.module.ts 文件

最後,修改主應用程序模塊文件以集成數據庫模塊的設置。

 import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DatabaseModule } from './database/database.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
     }),
    DatabaseModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})

export class AppModule {} 

設置 Dockerfile

Dockerfile 充當藍圖,指定構建 Docker 映像的必要步驟,其中包含應用程序的源代碼及其所有必需的依賴項。

在項目的主文件夾中,開始創建一個新文檔並將其指定為“Dockerfile”。隨後,將後續組成部分納入其範圍內:

 FROM node:16.3.0-alpine3.13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD [ "npm", "run", "start:dev" ] 

以下是每個命令代表的含義:

上述指令規定了指示 Docker 構建軟件視覺表示(稱為圖像)的基礎。

上述指令指示“/app”文件夾被指定為 Docker 容器範圍內應用程序操作的活動工作區。

作為配置過程的一部分,“package.json”文件會自動將指定格式的所有文件從當前項目目錄複製到“app”文件夾。

上述步驟涉及執行“npm install”命令,該命令有助於安裝應用程序在 Docker 容器範圍內正常運行所需的所有必要包和依賴項。

通過此指令,Docker 被指示將當前工作目錄的所有應用程序源文件內容複製到指定的“/app”子目錄中。

要執行 Nest.js 應用程序,建議的步驟是首先通過運行“npm run build”命令啟動構建過程。此操作涉及使用指定的預設和插件將 TypeScript 源代碼轉換為其相應的 JavaScript 等效代碼。同時,它會在“ dist ”文件夾中生成一個優化的捆綁包,以供進一步部署或執行之用。

給定的文本描述了一條 Dockerfile 指令,該指令指定容器啟動時要執行的命令。具體來說,它指導執行 npm run start:dev 命令,該命令將服務器啟動到開發狀態。

上述配置使軟件應用程序能夠仔細觀察其源代碼中的更改。一旦識別出任何修改,容器就會被編程為啟動自動重建過程。

創建 Docker Compose 文件

在項目工作區的主目錄中,開始在該目錄中創建新的 docker-compose.yml 文檔。然後,將後續的規定附加到這個新建立的文件中:

 version: '3.9'

services:
  server:
    build: .
    ports:
      - '3000:3000'
    depends_on:
      - db
  db:
    image: 'postgres'
    ports:
      - '5432:5432'
    environment:
      POSTGRES_PASSWORD: 'mypassword123'
      POSTGRES_USER: 'testUser'
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data: 

Docker Compose 將利用提供的指南在兩個單獨的 Docker 容器中構建和執行兩個 Docker 映像。初始容器被指定為“服務器”,應作為託管應用程序映像的平台,並可通過端口 3000 進行訪問。

第二個容器將容納 PostgreSQL 數據庫映像,該映像將使用 Docker 映像存儲庫中的現有 PostgreSQL 映像構建。不需要單獨的 Dockerfile,因為預構建的映像中已提供必要的說明。

啟動 Docker 容器

總之,為了構建圖像並啟動容器,請執行以下命令:

 docker compose up 

成功執行該過程後,預計系統的終端輸出中將顯示一組可比較的日誌數據。

/bc/images/started-docker-containers.jpg

事實上,一旦 Web 服務器和數據庫容器都可以運行,就可以進一步擴展 Nest.js 應用程序的功能了。其中一項增強功能是構建一個用戶友好的界面,用於使用基於 Nest.js 框架構建的 CRUD(創建、讀取、更新、刪除)RESTful API 與存儲在 PostgreSQL 數據庫中的數據進行交互。

將 Docker 鏡像推送到 Docker Hub

將 Docker 鏡像傳輸到 Docker Hub 與將項目提交到 GitHub 非常相似。要上傳 Nest.js 應用程序 Docker 鏡像,請按照以下流程操作:

⭐ 前往 Docker Hub ,註冊並登錄到您帳戶的概述頁面。

⭐ 單擊“創建存儲庫”按鈕,填寫存儲庫的名稱,通過選擇“公共”或“私有”指定其可見性,然後單擊“創建”。 /bc/images/docker-hub-1.jpg

⭐ 現在,您需要通過運行以下命令通過終端登錄您的帳戶,然後提供您的 Docker 用戶名和密碼。

 docker login 

⭐ 接下來,通過運行以下命令來更新 Docker 的映像名稱以匹配此格式:/。

 docker tag <image> <your docker username>/<repo name> 

⭐ 最後,推送 Docker 鏡像。

 docker push <image>/<repo name> 

在開發中利用 Docker 的容器化技術

Docker 的容器化功能允許將應用程序及其所需的依賴項捆綁到 Docker 鏡像中。這確保了這些映像可以在各種開發和生產設置中無縫運行,而不會遇到任何復雜性或兼容性問題。