Container คืออะไร (และต่างจาก VM ยังไง)
กล่องเล็ก ๆ ที่ห่อแอปพร้อมทุกอย่างที่มันต้องใช้ ให้รันเหมือนกันทุกที่
ปูพื้นฐาน: ปัญหาคลาสสิกของคนทำแอปคือประโยค "บนเครื่องผมมันรันได้นะ" (works on my machine) — โค้ดเดียวกันรันได้บนเครื่องเรา แต่พอเอาขึ้นเซิร์ฟเวอร์จริงกลับพัง เพราะเวอร์ชันของไลบรารี หรือการตั้งค่าไม่เหมือนกัน Container จึงเกิดมาเพื่อแก้ปัญหานี้
Container เหมือนตู้คอนเทนเนอร์เรือ — ไม่ว่าข้างในจะเป็นของอะไร ตู้มีขนาดมาตรฐานเท่ากัน จึงยกขึ้นเรือ/รถ/รถไฟลำไหนก็ได้โดยไม่ต้องแกะของ · แอปที่ถูกใส่ container ก็ "ยกไปรันที่ไหนก็ได้" เหมือนกัน — เครื่อง dev, เครื่องเพื่อน, หรือ cloud ก็ทำงานเหมือนเดิม
Container แก้ปัญหานี้โดยการห่อแอป + library + ไฟล์ตั้งค่า + runtime ทั้งหมดไว้ในกล่องเดียว กล่องนี้รันได้เหมือนกันเป๊ะทุกที่ที่มี container runtime (เช่น Docker) ติดตั้งอยู่
Container ต่างจาก Virtual Machine (VM) ยังไง
VM แบก OS ต่อเครื่อง · Container แชร์ OS kernel
Virtual Machines
หนัก · เปิดเป็นนาที · Guest OS ซ้ำทุกตัว
Containers
เบา · เปิดเสี้ยววินาที · ไม่มี Guest OS ซ้ำ
- VM = จำลองทั้งเครื่องรวม OS ของตัวเอง → หนัก (หลาย GB) เปิดใช้เวลาเป็นนาที
- Container = แชร์ OS kernel ของเครื่อง host แล้วแยกกันแค่ระดับ process → เบา (หลัก MB) เปิดในเสี้ยววินาที
- เครื่องหนึ่งรัน container ได้หลายสิบตัวสบาย ๆ ในทรัพยากรเท่ากับ VM ไม่กี่ตัว
สรุป Key Takeaways
- Container ห่อแอป + dependency ทั้งหมด → รันเหมือนกันทุกที่ ("works on my machine" หมดไป)
- ต่างจาก VM ตรงที่แชร์ OS kernel → เบากว่า เร็วกว่า หนาแน่นกว่า
- Image = แม่พิมพ์ (อ่านอย่างเดียว), Container = ตัวที่กำลังรันจริง
- Container เป็น ephemeral โดยธรรมชาติ — ข้อมูลถาวรต้องใช้ Volume
คำถามที่พบบ่อย
Container ต่างจาก VM ยังไง สรุปสั้นที่สุด
VM จำลอง "เครื่องทั้งเครื่อง" รวม OS ของตัวเอง (หนัก GB, boot เป็นนาที) ส่วน container แชร์ kernel ของ host แล้วแยกกันแค่ระดับ process (เบา MB, start เป็นวินาที) — เครื่องเดียวรัน container ได้หนาแน่นกว่า VM หลายเท่า
Container ปลอดภัยเท่า VM ไหม
ฉนวนบางกว่า — container แชร์ kernel เดียวกัน ถ้า kernel มีช่องโหว่ก็กระทบทุก container บนเครื่อง ส่วน VM แยก kernel ใครมัน งานที่ต้องการ isolation สูงสุด (multi-tenant ที่ไม่ไว้ใจกัน) จึงยังใช้ VM หรือ micro-VM อย่าง Firecracker ครอบอีกชั้น
ทำไม container ถึงแก้ปัญหา "เครื่องผมรันได้นะ" ได้จริง
เพราะ image แพ็คทุกอย่างที่แอปต้องการไปด้วยกัน — โค้ด, runtime, library, config — สภาพแวดล้อมจึงเหมือนกันทุกที่ที่รัน ตั้งแต่เครื่อง dev จนถึง production ตัดตัวแปร "เครื่องใครลงอะไรไว้" ออกทั้งก้อน

