Contents

วิธีบรรจุแอปพลิเคชัน Nest.js โดยใช้ Docker และ Docker Compose

“แต่มันใช้งานได้บนคอมพิวเตอร์ของฉัน…” เรื่องตลกของนักพัฒนาเน้นย้ำถึงความท้าทายในการปรับใช้และรันแอปพลิเคชันข้ามระบบที่แตกต่างกันอย่างสมบูรณ์แบบ

การนำทางผ่านความซับซ้อนของการกำหนดค่าการขึ้นต่อกันและความเข้ากันได้ของเวอร์ชันอาจเป็นงานที่น่ากังวลสำหรับนักพัฒนา อย่างไรก็ตาม มีแนวทางที่มีประสิทธิภาพซึ่งสามารถบรรเทาความท้าทายเหล่านี้ได้โดยการใช้เทคโนโลยีการบรรจุคอนเทนเนอร์ เช่น Docker แนวทางนี้ทำให้กระบวนการง่ายขึ้นโดยการห่อหุ้มส่วนประกอบที่จำเป็นทั้งหมดไว้ภายในสภาพแวดล้อมที่มีในตัวเอง ซึ่งช่วยลดข้อขัดแย้งที่อาจเกิดขึ้นและทำให้กระบวนการปรับใช้มีความคล่องตัว

แพลตฟอร์มดังกล่าวให้อำนาจแก่ผู้ใช้ในการปรับใช้และดำเนินการแอปพลิเคชันต่างๆ ได้อย่างราบรื่น พร้อมด้วยส่วนประกอบที่จำเป็น ภายในสภาพแวดล้อมแบบคอนเทนเนอร์ จึงขจัดความจำเป็นสำหรับขั้นตอนการตั้งค่าที่ซับซ้อนในการตั้งค่าการผลิต

ทำความเข้าใจนักเทียบท่าและนักเทียบท่าเขียน

Docker เป็นแพลตฟอร์มการพัฒนาแบบโอเพ่นซอร์สที่ให้บริการเทคโนโลยีคอนเทนเนอร์ที่ใช้ในการสร้างและบรรจุภัณฑ์ควบคู่ไปกับการพึ่งพาอิมเมจแบบพกพา

ภาพดังกล่าวข้างต้นจะถูกดำเนินการในภายหลังในรูปแบบของโมดูลปฏิบัติการภายในการตั้งค่าเรือที่มีอยู่ในตัวเอง การใช้งานแอปพลิเคชันภายในขอบเขตดังกล่าวทำให้มั่นใจได้ถึงความสม่ำเสมอในแง่ของประสิทธิภาพที่สม่ำเสมอสำหรับแพลตฟอร์มการผลิตที่หลากหลาย โดยไม่มีความคลาดเคลื่อนที่อาจเกิดขึ้นหรืออุปสรรคในการทำงานร่วมกัน

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

Docker Compose ทำหน้าที่เป็นเครื่องมือเสริมเมื่อใช้ร่วมกับ Docker ซึ่งช่วยอำนวยความสะดวกในการทำให้ขั้นตอนการตั้งค่าและการจัดการแอปพลิเคชันหลายคอนเทนเนอร์คล่องตัวขึ้น

Docker Compose ขยายฟังก์ชันการทำงานของ Docker โดยเปิดใช้งานการจัดการคอนเทนเนอร์หลายตัวที่รวมกันเป็นแอปพลิเคชันเดียว

วิธีการนี้พิสูจน์ให้เห็นถึงข้อได้เปรียบโดยเฉพาะอย่างยิ่งในสถานการณ์ที่แอปพลิเคชันซอฟต์แวร์เกี่ยวข้องกับบริการที่พึ่งพาซึ่งกันและกัน รวมถึงแต่ไม่จำกัดเพียงระบบฐานข้อมูลต่างๆ ตลอดจนบริการ API ที่หลากหลายที่มีการพึ่งพาซึ่งกันและกัน

ก่อนที่คุณจะเจาะลึกโค้ด คุณต้องติดตั้ง Docker Desktop บนเครื่องของคุณ อ่านข้อกำหนดเฉพาะระบบและขั้นตอนการติดตั้งจากเอกสารอย่างเป็นทางการ

อาจค้นหาซอร์สโค้ดของซอฟต์แวร์นี้ภายในพื้นที่เก็บข้อมูล GitHub ซึ่งทำหน้าที่เป็นระบบจัดเก็บถาวรและกำหนดเวอร์ชันดิจิทัลสำหรับติดตามการเปลี่ยนแปลงของโปรแกรมเมื่อเวลาผ่านไป

ตั้งค่าโครงการ Nest.js

บทช่วยสอนนี้จะอธิบายขั้นตอนการปรับใช้คอนเทนเนอร์ Docker สองตัวควบคู่กันเพื่อให้ทำงานเป็นแอปพลิเคชัน Nest.js แบบรวมศูนย์ คอนเทนเนอร์เริ่มต้นจะโฮสต์การสร้างอินสแตนซ์ของอิมเมจ Docker ของเว็บเซิร์ฟเวอร์ Nest.js และคอนเทนเนอร์ที่ตามมาจะรันอิมเมจฐานข้อมูล PostgreSQL ของ Docker

ในการเริ่มต้นกระบวนการ จำเป็นต้องติดตั้งยูทิลิตี Nest.js Command Line Interface (CLI) นี่จะเป็นช่องทางที่สะดวกในการโต้ตอบกับโปรเจ็กต์ของคุณและดำเนินการคำสั่งต่างๆ จากเทอร์มินัล

 npm i -g @nestjs/cli 

หากต้องการสร้างโปรเจ็กต์ Nest.js ใหม่โดยใช้ Terminal ให้รันคำสั่งต่อไปนี้ในหน้าต่าง Terminal:

 nest new docker-nest-app 

เมื่อเลือก’สร้างโครงการ’รายชื่อผู้จัดการแพ็คเกจที่มีอยู่จะถูกนำเสนอ กรุณาเลือกรายการที่ต้องการในขณะนี้ เพื่อเป็นตัวอย่าง ให้เราเลือกใช้’npm’ซึ่งเป็น Node Package Manager

ท้ายที่สุด เราอาจนำทางไปยังไดเร็กทอรีของโปรเจ็กต์และเริ่มต้นเซิร์ฟเวอร์การพัฒนา

 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 {} 

เมื่อใช้การกำหนดค่า Docker PostgreSQL ที่ระบุภายในการตั้งค่า TypeORM แอปพลิเคชัน 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" ] 

นี่คือสิ่งที่แต่ละคำสั่งแสดงถึง:

คำสั่งดังกล่าวกำหนดรากฐานที่นักเทียบท่าได้รับคำสั่งให้สร้างการแสดงภาพของซอฟต์แวร์หรือที่เรียกว่ารูปภาพ

คำสั่งดังกล่าวกำหนดว่าโฟลเดอร์ /app ถูกกำหนดให้เป็นพื้นที่ทำงานที่ใช้งานอยู่สำหรับการทำงานของแอปพลิเคชันภายในขอบเขตของคอนเทนเนอร์ Docker

ไฟล์ package.json จะคัดลอกไฟล์ทั้งหมดในรูปแบบที่ระบุจากไดเร็กทอรีโปรเจ็กต์ปัจจุบันไปยังโฟลเดอร์"app"โดยอัตโนมัติ ซึ่งเป็นส่วนหนึ่งของกระบวนการกำหนดค่า

ขั้นตอนข้างต้นเกี่ยวข้องกับการดำเนินการคำสั่ง “npm install” ซึ่งอำนวยความสะดวกในการติดตั้งแพ็คเกจและการขึ้นต่อกันที่จำเป็นทั้งหมดที่จำเป็นสำหรับการทำงานที่เหมาะสมของแอปพลิเคชันภายในขอบเขตของคอนเทนเนอร์ Docker

นักเทียบท่าได้รับคำสั่งให้จำลองเนื้อหาไฟล์ต้นฉบับแอปพลิเคชันของไดเรกทอรีการทำงานปัจจุบันทั้งหมดภายในไดเรกทอรีย่อยที่กำหนด’/app’โดยใช้คำสั่งนี้

ในการรันแอปพลิเคชัน Nest.js ขั้นตอนที่แนะนำคือเริ่มต้นกระบวนการสร้างก่อนโดยการรันคำสั่ง npm run build การดำเนินการนี้เกี่ยวข้องกับการแปลงซอร์สโค้ด TypeScript ไปเป็น JavaScript ที่เทียบเท่ากันโดยใช้ค่าที่กำหนดล่วงหน้าและปลั๊กอินที่ระบุ ในขณะเดียวกันก็สร้างชุดที่ได้รับการปรับปรุงภายในโฟลเดอร์ dist เพื่อวัตถุประสงค์ในการปรับใช้หรือการดำเนินการเพิ่มเติม

ข้อความที่กำหนดจะอธิบายคำสั่ง Dockerfile ที่ระบุคำสั่งที่จะดำเนินการเมื่อคอนเทนเนอร์เริ่มทำงาน โดยเฉพาะอย่างยิ่ง คำสั่งดังกล่าวกำหนดทิศทางการดำเนินการของคำสั่ง npm run start:dev ซึ่งเริ่มต้นเซิร์ฟเวอร์ในสถานะการพัฒนา

การกำหนดค่าดังกล่าวช่วยให้แอปพลิเคชันซอฟต์แวร์สามารถสังเกตการเปลี่ยนแปลงในซอร์สโค้ดได้อย่างขยันขันแข็ง เมื่อตรวจพบการดัดแปลงใดๆ คอนเทนเนอร์จะถูกตั้งโปรแกรมให้เริ่มกระบวนการสร้างใหม่โดยอัตโนมัติ

สร้างไฟล์เขียนนักเทียบท่า

ในไดเร็กทอรีหลักของเวิร์กสเปซโปรเจ็กต์ของคุณ ให้เริ่มต้นการสร้างเอกสาร 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 ซึ่งจะถูกสร้างขึ้นโดยใช้อิมเมจ PostgreSQL ที่มีอยู่จากที่เก็บอิมเมจของ Docker ไม่จำเป็นต้องแยก Dockerfile เนื่องจากมีคำแนะนำที่จำเป็นอยู่ในอิมเมจที่สร้างไว้ล่วงหน้าแล้ว

เริ่มคอนเทนเนอร์นักเทียบท่า

โดยสรุป เพื่อสร้างอิมเมจและเปิดใช้งานคอนเทนเนอร์ ให้ดำเนินการคำสั่งต่อไปนี้:

 docker compose up 

เมื่อดำเนินการตามกระบวนการสำเร็จแล้ว คาดว่าชุดข้อมูลบันทึกที่เปรียบเทียบกันได้จะแสดงในเอาต์พุตเทอร์มินัลของระบบของคุณ

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

อันที่จริง เมื่อทั้งเว็บเซิร์ฟเวอร์และคอนเทนเนอร์ฐานข้อมูลทำงานได้ ก็ถึงเวลาขยายขีดความสามารถของแอปพลิเคชัน Nest.js ของเราเพิ่มเติม การปรับปรุงอย่างหนึ่งอาจเป็นการสร้างอินเทอร์เฟซที่เป็นมิตรต่อผู้ใช้สำหรับการโต้ตอบกับข้อมูลที่จัดเก็บไว้ในฐานข้อมูล PostgreSQL โดยใช้ CRUD (สร้าง อ่าน อัปเดต ลบ) RESTful API ที่สร้างขึ้นบนเฟรมเวิร์ก Nest.js

ผลักดันอิมเมจ Docker ไปที่ Docker Hub

การถ่ายโอนอิมเมจ Docker ไปยัง Docker Hub คล้ายกับการส่งโปรเจ็กต์ไปยัง GitHub อย่างใกล้ชิด หากต้องการอัปโหลดอิมเมจ Docker ของแอปพลิเคชัน Nest.js โปรดทำตามขั้นตอนนี้:

⭐ ไปที่ Docker Hub ลงชื่อสมัครใช้ และเข้าสู่หน้าภาพรวมของบัญชีของคุณ

⭐ คลิกปุ่มสร้างพื้นที่เก็บข้อมูล กรอกชื่อพื้นที่เก็บข้อมูลของคุณ ระบุการเปิดเผยโดยเลือกสาธารณะหรือส่วนตัว จากนั้นคลิกสร้าง /th/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 เพื่อให้แน่ใจว่ารูปภาพเหล่านี้ทำงานได้อย่างราบรื่นในการตั้งค่าการพัฒนาและการผลิตต่างๆ โดยไม่ประสบปัญหายุ่งยากหรือความเข้ากันได้ใดๆ