วิธีบรรจุแอปพลิเคชัน Nest.js โดยใช้ Docker และ Docker Compose
“แต่มันใช้งานได้บนคอมพิวเตอร์ของฉัน…” เรื่องตลกของนักพัฒนาเน้นย้ำถึงความท้าทายในการปรับใช้และรันแอปพลิเคชันข้ามระบบที่แตกต่างกันอย่างสมบูรณ์แบบ
การนำทางผ่านความซับซ้อนของการกำหนดค่าการขึ้นต่อกันและความเข้ากันได้ของเวอร์ชันอาจเป็นงานที่น่ากังวลสำหรับนักพัฒนา อย่างไรก็ตาม มีแนวทางที่มีประสิทธิภาพซึ่งสามารถบรรเทาความท้าทายเหล่านี้ได้โดยการใช้เทคโนโลยีการบรรจุคอนเทนเนอร์ เช่น Docker แนวทางนี้ทำให้กระบวนการง่ายขึ้นโดยการห่อหุ้มส่วนประกอบที่จำเป็นทั้งหมดไว้ภายในสภาพแวดล้อมที่มีในตัวเอง ซึ่งช่วยลดข้อขัดแย้งที่อาจเกิดขึ้นและทำให้กระบวนการปรับใช้มีความคล่องตัว
แพลตฟอร์มดังกล่าวให้อำนาจแก่ผู้ใช้ในการปรับใช้และดำเนินการแอปพลิเคชันต่างๆ ได้อย่างราบรื่น พร้อมด้วยส่วนประกอบที่จำเป็น ภายในสภาพแวดล้อมแบบคอนเทนเนอร์ จึงขจัดความจำเป็นสำหรับขั้นตอนการตั้งค่าที่ซับซ้อนในการตั้งค่าการผลิต
ทำความเข้าใจนักเทียบท่าและนักเทียบท่าเขียน
Docker เป็นแพลตฟอร์มการพัฒนาแบบโอเพ่นซอร์สที่ให้บริการเทคโนโลยีคอนเทนเนอร์ที่ใช้ในการสร้างและบรรจุภัณฑ์ควบคู่ไปกับการพึ่งพาอิมเมจแบบพกพา
ภาพดังกล่าวข้างต้นจะถูกดำเนินการในภายหลังในรูปแบบของโมดูลปฏิบัติการภายในการตั้งค่าเรือที่มีอยู่ในตัวเอง การใช้งานแอปพลิเคชันภายในขอบเขตดังกล่าวทำให้มั่นใจได้ถึงความสม่ำเสมอในแง่ของประสิทธิภาพที่สม่ำเสมอสำหรับแพลตฟอร์มการผลิตที่หลากหลาย โดยไม่มีความคลาดเคลื่อนที่อาจเกิดขึ้นหรืออุปสรรคในการทำงานร่วมกัน
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
เมื่อดำเนินการตามกระบวนการสำเร็จแล้ว คาดว่าชุดข้อมูลบันทึกที่เปรียบเทียบกันได้จะแสดงในเอาต์พุตเทอร์มินัลของระบบของคุณ
อันที่จริง เมื่อทั้งเว็บเซิร์ฟเวอร์และคอนเทนเนอร์ฐานข้อมูลทำงานได้ ก็ถึงเวลาขยายขีดความสามารถของแอปพลิเคชัน Nest.js ของเราเพิ่มเติม การปรับปรุงอย่างหนึ่งอาจเป็นการสร้างอินเทอร์เฟซที่เป็นมิตรต่อผู้ใช้สำหรับการโต้ตอบกับข้อมูลที่จัดเก็บไว้ในฐานข้อมูล PostgreSQL โดยใช้ CRUD (สร้าง อ่าน อัปเดต ลบ) RESTful API ที่สร้างขึ้นบนเฟรมเวิร์ก Nest.js
ผลักดันอิมเมจ Docker ไปที่ Docker Hub
การถ่ายโอนอิมเมจ Docker ไปยัง Docker Hub คล้ายกับการส่งโปรเจ็กต์ไปยัง GitHub อย่างใกล้ชิด หากต้องการอัปโหลดอิมเมจ Docker ของแอปพลิเคชัน Nest.js โปรดทำตามขั้นตอนนี้:
⭐ ไปที่ Docker Hub ลงชื่อสมัครใช้ และเข้าสู่หน้าภาพรวมของบัญชีของคุณ
⭐ คลิกปุ่มสร้างพื้นที่เก็บข้อมูล กรอกชื่อพื้นที่เก็บข้อมูลของคุณ ระบุการเปิดเผยโดยเลือกสาธารณะหรือส่วนตัว จากนั้นคลิกสร้าง
⭐ ตอนนี้ คุณต้องเข้าสู่ระบบบัญชีของคุณผ่านทางเทอร์มินัลโดยเรียกใช้คำสั่งด้านล่าง จากนั้นระบุชื่อผู้ใช้และรหัสผ่าน Docker ของคุณ
docker login
⭐ ถัดไป อัปเดตชื่ออิมเมจของ Docker ให้ตรงกับรูปแบบนี้:/โดยการรันคำสั่งด้านล่าง
docker tag <image> <your docker username>/<repo name>
⭐ สุดท้ายกดอิมเมจ Docker
docker push <image>/<repo name>
การใช้เทคโนโลยีคอนเทนเนอร์ของ Docker ในการพัฒนา
ความสามารถในการบรรจุคอนเทนเนอร์ของ Docker ช่วยให้สามารถรวมแอปพลิเคชันควบคู่ไปกับการพึ่งพาที่จำเป็นลงในอิมเมจ Docker เพื่อให้แน่ใจว่ารูปภาพเหล่านี้ทำงานได้อย่างราบรื่นในการตั้งค่าการพัฒนาและการผลิตต่างๆ โดยไม่ประสบปัญหายุ่งยากหรือความเข้ากันได้ใดๆ