คู่มือ 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