รูปปกบทความ

1. 🎯 ตอนที่ 3: Image vs Container ความแตกต่างที่มือใหม่ต้องรู้

สวัสดีครับน้องๆ กลับมาจิบกาแฟคุยเรื่อง Infrastructure กันต่อครับ หลังจากที่เราได้เห็นภาพรวมและสถาปัตยกรรมของ Docker กันไปแล้วในตอนก่อนๆ วันนี้พี่จะพามาเจาะลึกคำศัพท์ 2 คำที่ถือเป็น “หัวใจและวิญญาณ” ของโลก Docker นั่นก็คือ Docker Image และ Docker Container ครับ

2. 📖 เปิดฉาก (The Hook)

เชื่อว่ามือใหม่ที่เพิ่งเริ่มใช้ Docker ร้อยทั้งร้อยต้องเคยสับสนกับ 2 คำนี้แน่นอนครับ! บางทีเราสั่งดาวน์โหลดแอปมา รันคำสั่งไป อ้าว ตกลงตอนนี้ฉันกำลังจัดการกับ Image หรือ Container กันแน่? ลบอันนี้แล้วข้อมูลจะหายไหม? ทำไมบางอันรันได้ บางอันแค่เก็บไว้เฉยๆ?

ถ้าใครเคยเขียนโปรแกรมเชิงวัตถุ (OOP) มาก่อน พี่อยากให้ลองนึกภาพตามนี้ครับ… การเขียนโค้ดคลาส (Class) กับการสร้างออบเจกต์ (Object) มันเกี่ยวข้องกันยังไง ในโลกของ Docker ตัว Image และ Container ก็มีความสัมพันธ์ที่ลึกซึ้งแบบนั้นเลยครับ วันนี้เราจะมาเคลียร์ความสับสนนี้ให้กระจ่าง ชนิดที่ว่าเอาไปอธิบายต่อให้เพื่อนในทีมฟังได้สบายๆ เลย!

3. 🧠 แก่นวิชา (Core Concepts)

เพื่อให้เห็นภาพชัดเจนที่สุด พี่ขอเปรียบเทียบแบบนี้ครับ:

1. Docker Image (พิมพ์เขียว / สูตรอาหาร / Class)

  • มันคืออะไร: Image คือเทมเพลตแบบอ่านอย่างเดียว (Read-only template) ที่รวบรวมทุกสิ่งทุกอย่างที่แอปพลิเคชันต้องการเพื่อรัน ไม่ว่าจะเป็น โค้ดของเรา, Runtime (เช่น Node.js, Python), Libraries, และการตั้งค่า Environment ต่างๆ
  • คุณสมบัติหลัก: Image เป็นสิ่งที่ไม่สามารถเปลี่ยนแปลงได้ (Immutable) เมื่อถูกสร้างขึ้นมาแล้ว มันประกอบขึ้นมาจาก “ชั้น” (Layers) หลายๆ ชั้นซ้อนทับกัน
  • เปรียบเทียบ: ให้คิดซะว่า Image คือ “พิมพ์เขียวของบ้าน” หรือ “Class ในการเขียนโปรแกรม” เราไม่สามารถเข้าไปนอนในพิมพ์เขียวได้ แต่มันคือต้นแบบที่บอกว่าบ้านหน้าตาจะเป็นอย่างไร

2. Docker Container (บ้านที่สร้างเสร็จ / อาหารที่พร้อมทาน / Object)

  • มันคืออะไร: Container คือ Instance ของ Image ที่กำลังถูกเรียกใช้งาน (Running instance of an image)
  • คุณสมบัติหลัก: เมื่อเราสั่งรัน Image ตัว Docker Engine จะสร้างชั้นพิเศษขึ้นมาทับบนสุดเรียกว่า “Read-Write Layer” หรือชั้นที่สามารถอ่านและเขียนข้อมูลได้ ทำให้แอปพลิเคชันที่รันอยู่สามารถสร้างไฟล์ชั่วคราว หรือรับ Request ได้ แต่จำไว้นะครับว่า Container เป็นสิ่งชั่วคราว (Ephemeral) หากเราลบ Container ทิ้ง ข้อมูลที่อยู่ในชั้น Read-Write จะหายวับไปทันที
  • เปรียบเทียบ: Container คือ “บ้านที่สร้างเสร็จแล้วและเข้าไปอยู่ได้จริง” หรือ “Object ที่ถูก Instantiate มาจาก Class” (เราสามารถสร้างบ้านกี่หลังก็ได้จากพิมพ์เขียวแผ่นเดียว คล้ายกับการรันหลาย Container จาก Image เดียวกันนั่นเองครับ)

วงจรชีวิตของระบบ (The Lifecycle Flow) Container มีวงจรชีวิต (States) ตั้งแต่เกิดจนดับ ดังนี้ครับ:

  1. Created: ถูกสร้างขึ้นมาจาก Image แล้ว แต่ยังไม่ได้สตาร์ท
  2. Running: กำลังทำงาน (มีการประมวลผล Process หลักอยู่)
  3. Paused: ถูกแช่แข็งชั่วคราว (กระบวนการทุกอย่างถูกหยุดไว้ แต่ยังอยู่ใน Memory)
  4. Stopped (Exited): หยุดทำงานแล้ว (Process จบลง หรือถูกเราสั่ง Stop) แต่ตัว Container ยังมีตัวตนอยู่บนฮาร์ดดิสก์
  5. Removed: ถูกทำลายทิ้ง ข้อมูลในชั้น Read-Write หายเกลี้ยง
รูปประกอบ Image และ Container Lifecycle

4. 💻 ร่ายมนต์คำสั่ง (Show me the Code/Commands)

มาดูคำสั่งที่เราใช้จัดการ Image และ Container กันครับ จะได้แยกออกชัดเจน:

# === ฝั่งของ Docker Image (พิมพ์เขียว) ===

# 1. ดาวน์โหลด Image จาก Docker Hub มาเก็บไว้ในเครื่อง
docker pull nginx:latest

# 2. ดูรายชื่อ Image ทั้งหมดที่มีในเครื่อง (เหมือนดูคลังพิมพ์เขียว)
docker image ls


# === ฝั่งของ Docker Container (ตัวบ้าน) ===

# 3. สร้างและรัน Container จาก Image ที่ชื่อ nginx (ดึงพิมพ์เขียวมาสร้างบ้าน)
# -d คือให้รันแบบ Background, --name คือตั้งชื่อบ้านว่า my-web
docker run -d --name my-web nginx:latest

# 4. ดูรายชื่อ Container ที่กำลังรันอยู่ (มีบ้านหลังไหนเปิดไฟอยู่บ้าง)
docker ps

# 5. ดูรายชื่อ Container ทั้งหมด รวมถึงที่หยุดทำงานไปแล้ว (ใช้ flag -a)
docker ps -a

# 6. หยุดการทำงานของ Container (ไล่คนออกจากบ้าน ปิดไฟ)
docker stop my-web

# 7. ลบ Container ทิ้งถาวร (ทุบบ้านทิ้ง! ข้อมูลชั่วคราวหายหมด)
docker rm my-web

อธิบายคอมเมนต์สไตล์พี่สอนน้อง: เห็นไหมครับว่าคำสั่งมันแยกกันชัดเจน docker pull ทำงานกับ Image ส่วน docker run หรือ docker stop ทำงานกับ Container ท่องไว้ให้ขึ้นใจเลยว่า “เรา pull image มารันเป็น container” ครับ!

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)

พี่มีเคล็ดลับระดับ Advanced ที่อยู่เบื้องหลังการทำงานมาเล่าให้ฟังครับ:

  • กลไก Copy-on-Write (CoW): อย่างที่บอกว่า Image เป็นแบบ Read-only ถ้าแอปใน Container พยายามจะแก้ไขไฟล์ที่มาจาก Image ตัว Docker จะทำการ “ก๊อปปี้” ไฟล์นั้นจากชั้น Image ดึงขึ้นมาไว้ที่ชั้น Container (Read-Write Layer) แล้วค่อยทำการแก้ไข นี่คือเหตุผลว่าทำไม Container ถึงทำงานได้เร็วและกินพื้นที่น้อย เพราะมันจะก๊อปปี้มาเฉพาะไฟล์ที่มีการเปลี่ยนแปลงเท่านั้นครับ!
  • กับดักเรื่องข้อมูลหาย: มือใหม่หลายคนตกม้าตายตรงนี้ครับ! เวลาเราสร้าง Database Container แล้วใช้งานไปเรื่อยๆ พอมีการอัปเดตเวอร์ชัน ดันไปสั่ง docker rm ลบ Container ทิ้ง… ปรากฏว่าข้อมูล Database หายเกลี้ยง! เพราะมันถูกเก็บอยู่ในชั้น Read-Write ของ Container นั่นเอง วิธีแก้คือเราต้องใช้ Docker Volumes เพื่อแยกที่เก็บข้อมูลออกมาให้เป็นอิสระจากวงจรชีวิตของ Container ครับ (เดี๋ยวเราจะว่ากันต่อใน EP ถัดๆ ไป)

6. 🏁 บทสรุป (To be continued…)

สรุปสั้นๆ ให้จำขึ้นใจ: Image คือพิมพ์เขียวแบบอ่านอย่างเดียว ส่วน Container คือแอปพลิเคชันที่มีชีวิตและมีชั้นที่สามารถเขียนข้อมูลลงไปได้ การเข้าใจความแตกต่างและการจัดการวงจรชีวิต (Lifecycle) ของมัน จะช่วยให้เราออกแบบระบบ CI/CD และ Deploy งานได้อย่างมั่นใจ ไม่เผลอลบข้อมูลผิดตัวแน่นอนครับ

ในตอนต่อไป พี่จะพาน้องๆ ไปสวมวิญญาณสถาปนิก เรียนรู้วิธีการเขียน “พิมพ์เขียว” เป็นของตัวเองผ่านสิ่งที่เรียกว่า Dockerfile ห้ามพลาดเด็ดขาด เตรียมตัวลุยโค้ดกันได้เลยครับ!


ต้องการที่ปรึกษาด้านการวางระบบ Infrastructure, DevOps และ CI/CD ให้กับองค์กรของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและวางระบบ Server/Cloud แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p