การใช้งาน Docker กับ NestJS แบบง่ายๆ

Oct. 6, 2024 · boychawin

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

มาเริ่มต้นใช้งาน Docker กับ NestJS กัน

เรามาดูตัวอย่าง Dockerfile และ docker-compose.yml ที่จะช่วยให้เรารันแอปพลิเคชัน NestJS ใน Docker ได้ง่ายๆ กันครับ

  1. Dockerfile ใน Dockerfile เราได้แบ่งการ build เป็นสองขั้นตอน โดยในขั้นตอนแรกจะใช้ node:18-alpine เพื่อทำการติดตั้ง dependencies ที่จำเป็นก่อน แล้วค่อย Copy ไปยัง container สุดท้ายที่เราจะใช้งาน

# ใช้ node เวอร์ชัน 18-alpine ในการ build โปรเจกต์
FROM node:18-alpine AS builder

# ตั้งค่า directory ที่จะทำงานใน container
WORKDIR /home/node/app

# ก็อปปี้ไฟล์ package.json และ tsconfig.json ไปยัง container
COPY package.json ./
COPY tsconfig.json ./

# ติดตั้ง dependencies
RUN yarn install

# สร้าง container สุดท้ายสำหรับรันแอปพลิเคชัน
FROM node:18-alpine
WORKDIR /home/node/app

# ก็อปปี้ไฟล์ทั้งหมดจากขั้นตอนการ build
COPY --from=builder /home/node/app/ .

# คำสั่งที่จะรันแอปพลิเคชัน
CMD npm run start:dev

  1. docker-compose.yml ต่อมาเราจะสร้างไฟล์ docker-compose.yml เพื่อจัดการการรัน container ต่างๆ ได้อย่างง่ายดาย โดยไฟล์นี้จะระบุการเชื่อมต่อพอร์ตและการตั้งค่า environment ของเรา

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: my-app
    volumes:
      - ./src:/home/node/app/src  # ตั้งค่าให้โค้ดในเครื่องเรา sync กับ container
    env_file:
      - .env.local  # ใช้ environment variables จากไฟล์ .env.local
    ports:
      - "3035:3000"  # เปิดพอร์ต 3035 ให้เข้าถึงแอปได้จากภายนอก

อธิบายโค้ด

  • Dockerfile: เราใช้ node:18-alpine เนื่องจากเป็นภาพขนาดเล็กและเหมาะกับการรัน Node.js แอปพลิเคชัน นอกจากนี้ยังใช้เทคนิคการ multi-stage build เพื่อให้ container สุดท้ายมีขนาดเล็กลง
  • docker-compose.yml: ใช้สำหรับการจัดการ container หลายๆ ตัวได้อย่างง่ายดาย รวมถึงการตั้งค่าการเชื่อมต่อพอร์ตและ environment ของแอป

สรุป

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