คอนเทนเนอร์ (Containers)
คืออะไร
ลองนึกถึงตู้คอนเทนเนอร์ขนส่งสินค้า ไม่ว่าจะบรรจุอะไรไว้ข้างในก็เดินทางไปเป็นหน่วยเดียวที่ปิดสนิท และไปถึงท่าเรือไหนก็หน้าตาเหมือนเดิม คอนเทนเนอร์ซอฟต์แวร์ก็ทำงานแบบเดียวกัน — มันบรรจุแอปของคุณพร้อมกับทุกอย่างที่แอปต้องใช้ในการทำงาน (โค้ด, ไลบรารี, เครื่องมือของระบบ) รวมเป็นชุดเดียวที่พกพาได้ ชุดนี้จะทำงานเหมือนกันไม่ว่าจะรันบนแล็ปท็อปของคุณ เซิร์ฟเวอร์ทดสอบ หรือบนคลาวด์ ซึ่งช่วยขจัดปัญหาคลาสสิกที่ว่า "รันบนเครื่องฉันได้นะ" (it works on my machine) Docker คือเครื่องมือที่นิยมใช้สร้างคอนเทนเนอร์มากที่สุด
จุดแข็ง
- สภาพแวดล้อมเหมือนกันทุกที่ — สร้างครั้งเดียว รันได้ทุกที่
- ควบคุมได้เต็มที่ทั้ง runtime, แพ็กเกจของ OS และ ต่าง ๆ
- ไม่มี cold start เมื่อรันขึ้นมาแล้ว เหมาะกับทราฟฟิกที่สม่ำเสมอ
- พกพาข้ามผู้ให้บริการคลาวด์ได้ ไม่ถูกผูกติดกับเจ้าใดเจ้าหนึ่ง
- รองรับภาษาหรือเฟรมเวิร์กอะไรก็ได้ รวมถึงโปรเซสที่ทำงานต่อเนื่องยาว ๆ
ข้อแลกเปลี่ยน
- คุณต้องดูแลมากขึ้น เช่น base image, การอัปเดต, และการปรับขนาดทรัพยากร
- การสเกลไม่ได้เกิดขึ้นอัตโนมัติ เว้นแต่คุณจะเพิ่มตัวจัดการออร์เคสตราชั่น (orchestrator) อย่าง Kubernetes ซึ่งเพิ่มความซับซ้อนเข้ามาจริง ๆ
- คอนเทนเนอร์ที่กำลังรันอยู่มีค่าใช้จ่ายแม้ตอนที่ไม่มีคนใช้งาน
- อิมเมจที่ใหญ่กว่าหมายถึงการ build และ ที่ช้ากว่า
- การแพตช์ความปลอดภัยของอิมเมจเป็นหน้าที่ของคุณเอง
เมื่อไหร่ควรใช้
เลือกใช้คอนเทนเนอร์เมื่อคุณต้องการสภาพแวดล้อมที่สม่ำเสมอและควบคุมได้เต็มที่ เช่น แอปที่มี system dependency เฉพาะเจาะจง, บริการที่ทำงานต่อเนื่องยาว ๆ, background worker หรือสิ่งใดก็ตามที่เกินขีดจำกัดของ และ function
ความเหมาะสมกับการเขียนโค้ดแบบ vibe coding
คอนเทนเนอร์เป็นเป้าหมายที่ AI กำกับได้ดี เพราะ Dockerfile ก็เป็นเพียงสูตรอาหารสูตรหนึ่ง และเอเจนต์ก็เก่งเรื่องเขียนสูตรอาหาร คุณสามารถให้ AI สร้าง Dockerfile, ไฟล์ .dockerignore, และคำสั่ง deploy ให้ได้ แล้วค่อยวนกลับไปแก้ไขโดยเอา error จากการ build ไปให้มันอ่านต่อ เคล็ดลับ: ขอให้ใช้ base image ขนาดเล็ก (เช่น alpine หรือรุ่น slim) และทำ multi-stage build ซึ่งจะช่วยให้อิมเมจเล็กลง, build เร็วขึ้น และลดพื้นผิวที่อาจถูกโจมตี (attack surface) แพลตฟอร์มอย่าง Fly.io, Google Cloud Run, และ Railway สามารถ deploy คอนเทนเนอร์ได้ด้วยคำสั่งเดียว
# Dockerfile — multi-stage Node app
FROM node:20-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-slim
WORKDIR /app
COPY --from=build /app .
EXPOSE 3000
CMD ["node", "server.js"]
# Build and run locally
docker build -t my-app .
docker run -p 3000:3000 my-app