Container vs Virtual Machine (VM)
ก่อนจะเรียน Docker ให้ถึงแก่น ต้องเข้าใจก่อนว่า Container กับ VM ต่างกันอย่างไร เพราะทั้งสองแก้ปัญหาเดียวกัน แต่วิธีคิดและต้นทุนต่างกันอย่างมาก ความเข้าใจตรงนี้จะช่วยให้คุณเลือกเครื่องมือได้ถูกต้องและเข้าใจว่าทำไม Docker ถึงเปลี่ยนวงการ DevOps
ภาพจำสำคัญบทนี้
VM = บ้านแยกหลัง มี OS เป็นของตัวเอง / Container = ห้องในบ้านเดียวกัน แชร์ OS kernel ร่วมกัน
ส่วนที่ 1
ปัญหาที่ทั้ง VM และ Container พยายามแก้
ลองนึกถึงปัญหาคลาสสิกของนักพัฒนา: "แอปรันได้บนเครื่องฉัน แต่พอขึ้น server กลับพัง" ปัญหานี้เกิดเพราะสภาพแวดล้อม (environment) ของแต่ละเครื่องต่างกัน เช่น เวอร์ชัน OS, library, หรือ configuration ทั้ง VM และ Container ถูกสร้างมาเพื่อแก้ปัญหานี้ด้วยแนวคิดเดียวกัน คือ "แพ็กสภาพแวดล้อมไปพร้อมกับแอป" แต่วิธีทำนั้นต่างกันมาก
ประเด็นที่ 1
VM: จำลองเครื่องคอมพิวเตอร์ทั้งเครื่องพร้อม OS เต็มรูปแบบ
ประเด็นที่ 2
Container: แชร์ OS kernel กับ host และแพ็กเฉพาะสิ่งที่แอปต้องการ
ประเด็นที่ 3
เป้าหมายเหมือนกัน: สภาพแวดล้อมสม่ำเสมอ ย้ายได้ รันได้ทุกที่
ส่วนที่ 2
Virtual Machine คืออะไร
ให้นึกถึงการเช่าอพาร์ตเมนต์ทั้งยูนิต VM คือการจำลองเครื่องคอมพิวเตอร์ทั้งเครื่อง (hardware เสมือน) รวมถึง CPU, RAM, และ disk ของตัวเอง ด้านบนของ hardware จริงจะมีซอฟต์แวร์ที่เรียกว่า Hypervisor ทำหน้าที่จัดการและแบ่งทรัพยากรให้แต่ละ VM แต่ละ VM มี Guest OS เป็นของตัวเองซึ่งอาจเป็น Windows หรือ Linux ก็ได้ และรันอิสระจากกันโดยสมบูรณ์ ตัวอย่าง Hypervisor ที่รู้จักกันดี ได้แก่ VMware, VirtualBox, และ Hyper-V
ส่วนที่ 3
Container คืออะไร
ถ้า VM คืออพาร์ตเมนต์แยกยูนิต Container คือห้องแบ่งเช่าในบ้านเดียวกัน ทุกคนใช้โครงสร้างบ้าน (ระบบไฟ ประปา) ร่วมกัน แต่มีพื้นที่ส่วนตัวของตัวเอง Container แชร์ OS kernel กับ host โดยตรง จึงไม่ต้องบูต OS ใหม่ทุกครั้ง ตัว Container Engine (เช่น Docker) จะใช้ฟีเจอร์ของ Linux kernel อย่าง namespaces และ cgroups เพื่อแยก process, network, filesystem ให้แต่ละ container อยู่ในพื้นที่ของตัวเองโดยไม่รบกวนกัน
ส่วนที่ 4
เปรียบเทียบ VM กับ Container แบบตรงๆ
ตารางด้านล่างสรุปความต่างในมิติสำคัญ ไม่มีฝ่ายไหนชนะทุกมิติ แต่ละอันมีจุดแข็งและจุดอ่อนต่างกัน
| มิติ | Virtual Machine | Container |
|---|---|---|
| ขนาด | หลาย GB ต่อ VM (รวม Guest OS) | หลาย MB ต่อ Container (แค่ app + deps) |
| ความเร็วในการเริ่มต้น | หลายนาที (ต้องบูต OS) | วินาที (แชร์ kernel อยู่แล้ว) |
| การใช้ทรัพยากร | สูง — แต่ละ VM จอง RAM/CPU แยก | ต่ำ — แชร์ kernel รัน container ได้มากกว่า |
| Isolation | แข็งแกร่งมาก — แยก hardware เสมือน | ดี — แยก process/network แต่แชร์ kernel |
| ความปลอดภัย | สูงกว่า — escape จาก VM ยากมาก | ดี แต่ kernel vulnerability กระทบทุก container |
| Portability | ย้ายได้แต่ image ใหญ่ ช้า | ย้ายได้เร็ว image เล็ก push/pull สะดวก |
| OS ที่รองรับ | ใช้ Guest OS ใดก็ได้ (Windows บน Linux ได้) | ต้องเป็น OS เดียวกับ host kernel |
ส่วนที่ 5
ควรใช้ VM เมื่อไหร่
VM ยังคงมีบทบาทสำคัญในหลายสถานการณ์ โดยเฉพาะเมื่อต้องการ isolation ระดับสูงหรือต้องรัน OS ที่แตกต่างกัน
- ต้องการรัน Windows application บน Linux server (ต่าง kernel)
- ระบบที่ต้องการ security isolation ระดับสูง เช่น banking, government
- ทดสอบ OS configurations หรือ kernel-level features
- Legacy application ที่ต้องการ OS เฉพาะเวอร์ชัน
- สภาพแวดล้อมที่ต้องการ hardware virtualization เต็มรูปแบบ
ส่วนที่ 6
ควรใช้ Container เมื่อไหร่
Container เหมาะกับงาน modern application development ที่เน้นความเร็ว ความยืดหยุ่น และการ scale
- Microservices — แต่ละ service รันในแต่ละ container แยกกัน
- CI/CD pipeline — build, test, deploy เร็วและสม่ำเสมอ
- Development environment — ทีมใช้ environment เดียวกันผ่าน Docker
- Cloud-native application ที่ต้อง scale ขึ้นลงตามโหลด
- แอปที่ต้องการ deploy บ่อย หรือมีหลาย version พร้อมกัน
ส่วนที่ 7
ทำไม Container ถึงนิยมในยุค DevOps และ Cloud
ยุค DevOps ต้องการ deploy เร็ว ทดสอบบ่อย และ scale ได้ทันที VM ทำได้แต่หนักเกินไป Container เข้ามาตอบโจทย์ตรงนี้ได้พอดี การที่ Container ใช้ทรัพยากรน้อย เริ่มได้เร็ว และ image เล็กทำให้รัน container ได้หลายสิบหรือหลายร้อยตัวบนเครื่องเดียวได้อย่างมีประสิทธิภาพ ประกอบกับ Docker Hub และ container registry ต่างๆ ทำให้แชร์และแจกจ่าย image ได้ง่าย และ Kubernetes ก็ถูกสร้างมาเพื่อ orchestrate container โดยเฉพาะ ทำให้ ecosystem ทั้งหมดเชื่อมกันได้ลงตัว
ประเด็นที่ 1
Deploy ไว — container เริ่มเป็นวินาที ไม่ต้องรอบูต OS
ประเด็นที่ 2
Scale ได้ง่าย — Kubernetes จัดการ container หลายร้อยตัวโดยอัตโนมัติ
ประเด็นที่ 3
Consistent environment — Dev, Staging, Production ใช้ image เดียวกัน