คู่มือ Docker Compose ฉบับสมบูรณ์

เลิกพิมพ์คำสั่ง Docker ด้วยตัวเองทีละคำสั่งสำหรับทุกๆ service ได้แล้ว

หากคุณรันแอปพลิเคชันสมัยใหม่ คุณมักจะมีทั้ง frontend, backend, database และ cache การรันสิ่งเหล่านี้ทีละอย่างนั้นทั้งช้าและเสี่ยงต่อการเกิดข้อผิดพลาด

Docker Compose ช่วยแก้ปัญหานี้ได้ โดยคุณสามารถกำหนด stack ทั้งหมดของคุณไว้ในไฟล์ YAML เพียงไฟล์เดียว และสั่งเริ่มทำงานทุกอย่างได้ด้วยคำสั่งเดียว

พื้นฐานที่ควรรู้

  • หากไม่มี Compose: คุณต้องรันคำสั่งแยกกัน 4 คำสั่งสำหรับ 4 containers
  • หากใช้ Compose: คุณแค่รัน "docker compose up" แล้วทุกอย่างก็จะเริ่มทำงาน

แนวคิดที่สำคัญ

• Services: แต่ละ service แทนหนึ่ง container คุณสามารถใช้ "build" สำหรับโค้ดของคุณเอง หรือใช้ "image" สำหรับเครื่องมือสำเร็จรูปอย่าง PostgreSQL หรือ Redis • Port Mapping: ใช้รูปแบบ HOST:CONTAINER เพื่อเชื่อมต่อพอร์ตจากเครื่องคอมพิวเตอร์ของคุณไปยังพอร์ตของ container • Environment Variables: ใช้ "environment" สำหรับค่าทั่วไป หรือใช้ "env_file" เพื่อเก็บความลับ (secrets) ไว้ในไฟล์ .env แยกต่างหาก • Volumes: ใช้ volumes เพื่อรักษาข้อมูลของคุณให้ปลอดภัย หากไม่มี volumes ข้อมูลใน database จะหายไปเมื่อ container หยุดทำงาน • Networks: Compose จะสร้าง network ให้โดยอัตโนมัติ โดย container ต่างๆ จะสื่อสารกันผ่านชื่อ service แทนการใช้ localhost • Depends_on: ใช้สำหรับกำหนดลำดับการเริ่มทำงาน โดยจะบอกให้ Docker เริ่มทำงาน database ก่อน backend ทั้งนี้ โปรดทราบว่ามันไม่ได้รอจนกว่า database จะพร้อมใช้งานอย่างสมบูรณ์

เคล็ดลับสำหรับการสัมภาษณ์งาน

  • ควรใช้ build หรือ image เมื่อไหร่? ใช้ "build" สำหรับแอปพลิเคชันที่คุณเขียนขึ้นเอง และใช้ "image" สำหรับเครื่องมือที่มีอยู่แล้วบน Docker Hub
  • container สื่อสารกันได้อย่างไร? พวกมันใช้ชื่อ service เป็น hostname ภายใน Docker network
  • จะหลีกเลี่ยงการสูญเสียข้อมูลได้อย่างไร? ให้ใช้ named volumes สำหรับ database เสมอ
  • จะจัดการกับ secrets อย่างไร? ห้ามเขียนลงไปในโค้ดโดยตรง (hardcode) ให้ใช้ไฟล์ .env แทน

ข้อผิดพลาดที่พบบ่อยที่ควรหลีกเลี่ยง

  • การใช้ tag "latest": สิ่งนี้อาจทำให้เกิดการอัปเดตที่ไม่คาดคิด ควรใช้เวอร์ชันที่ระบุเจาะจง เช่น "postgres:16"
  • การใช้ localhost: container ไม่สามารถมองเห็นกันผ่าน localhost ได้ ให้ใช้ชื่อ service แทน
  • การไม่มี healthchecks: ควรใช้ healthchecks เพื่อตรวจสอบว่า service ของคุณพร้อมทำงานจริงๆ หรือไม่

ที่มา: https://dev.to/adityaguptareal/docker-compose-complete-guide-1gac