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