ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~12 นาที· อัปเดตล่าสุด

Container คืออะไร (และต่างจาก VM ยังไง)

กล่องเล็ก ๆ ที่ห่อแอปพร้อมทุกอย่างที่มันต้องใช้ ให้รันเหมือนกันทุกที่

ปูพื้นฐาน: ปัญหาคลาสสิกของคนทำแอปคือประโยค "บนเครื่องผมมันรันได้นะ" (works on my machine) — โค้ดเดียวกันรันได้บนเครื่องเรา แต่พอเอาขึ้นเซิร์ฟเวอร์จริงกลับพัง เพราะเวอร์ชันของไลบรารี หรือการตั้งค่าไม่เหมือนกัน Container จึงเกิดมาเพื่อแก้ปัญหานี้

Container คือตู้คอนเทนเนอร์เรือมาตรฐาน

Container เหมือนตู้คอนเทนเนอร์เรือ — ไม่ว่าข้างในจะเป็นของอะไร ตู้มีขนาดมาตรฐานเท่ากัน จึงยกขึ้นเรือ/รถ/รถไฟลำไหนก็ได้โดยไม่ต้องแกะของ · แอปที่ถูกใส่ container ก็ "ยกไปรันที่ไหนก็ได้" เหมือนกัน — เครื่อง dev, เครื่องเพื่อน, หรือ cloud ก็ทำงานเหมือนเดิม

Container แก้ปัญหานี้โดยการห่อแอป + library + ไฟล์ตั้งค่า + runtime ทั้งหมดไว้ในกล่องเดียว กล่องนี้รันได้เหมือนกันเป๊ะทุกที่ที่มี container runtime (เช่น Docker) ติดตั้งอยู่

Container ต่างจาก Virtual Machine (VM) ยังไง

VM แบก OS ต่อเครื่อง · Container แชร์ OS kernel

Virtual Machines

App A
Guest OS
App B
Guest OS
App C
Guest OS
Hypervisor
Host OS + Hardware

หนัก · เปิดเป็นนาที · Guest OS ซ้ำทุกตัว

Containers

App A
App B
App C
App D
Container Runtime
Host OS (kernel ร่วม) + Hardware

เบา · เปิดเสี้ยววินาที · ไม่มี Guest OS ซ้ำ

VM แบกทั้ง OS ต่อเครื่อง · Container แชร์ OS kernel ของ host จึงเบาและเปิดเร็วกว่ามาก
  • 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 ตัดตัวแปร "เครื่องใครลงอะไรไว้" ออกทั้งก้อน

อ่านจบแล้วอย่าลืมทำเครื่องหมาย