Docker Compose — รันหลายคอนเทนเนอร์ (+ Lab)
นิยามทั้งระบบ (web + db) ในไฟล์เดียว สั่งขึ้นพร้อมกัน
ปูพื้นฐาน: ถ้าระบบของเรามีแค่เว็บแอปเดียว การใช้คำสั่ง docker run ทีละตัวก็เพียงพอ แต่ในความจริง ระบบหนึ่งๆ มักจะมีหลายส่วนประกอบ เช่น มีเว็บ, มีฐานข้อมูล (Database), มีตัวช่วยจำ (Cache) การมานั่งพิมพ์คำสั่งรันทีละตัวคงไม่สะดวกนัก
สั่ง docker run ทีละ container เหมือนเปิดเครื่องใช้ไฟฟ้าทีละตัว · Docker Compose เหมือนสวิตช์รวมที่กดครั้งเดียวเปิดทั้งบ้าน — นิยามทุก service (เว็บ, ฐานข้อมูล, cache) ในไฟล์ YAML เดียว แล้วสั่งขึ้นพร้อมกัน
Docker Compose เหมาะกับแอปที่มีหลาย container ทำงานร่วมกัน (เช่น เว็บ + ฐานข้อมูล) · เขียนทุกอย่างใน compose.yaml แล้วจัดการทั้งชุดด้วยคำสั่งเดียว
compose.yaml เดียว = หลาย service ขึ้นพร้อมกัน คุยกันด้วยชื่อ
🧪 Lab: เว็บ + ฐานข้อมูลด้วยไฟล์เดียว
services:
web:
build: . # build จาก Dockerfile ในโฟลเดอร์นี้
ports:
- "8080:3000"
environment:
DB_HOST: db # เรียก service "db" ด้วยชื่อได้เลย
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data # เก็บข้อมูลถาวร
volumes:
pgdata:docker compose up -d # สร้าง+รันทั้งชุด (เบื้องหลัง)
docker compose ps # ดูสถานะทุก service
docker compose logs -f web # ดู log ของ service web
docker compose down # หยุด+ลบทั้งชุด (เติม -v = ลบ volume ด้วย)สรุป Key Takeaways
- Compose นิยามหลาย service ในไฟล์เดียว สั่งขึ้น/ลงทั้งชุดด้วย docker compose up/down
- service ใน compose เดียวกันคุยกันด้วยชื่อ (network อัตโนมัติ)
- เหมาะ dev บนเครื่องเดียว — งาน production หลายเครื่องไป Kubernetes
คำถามที่พบบ่อย
Compose ต่างจาก docker run หลายๆ คำสั่งยังไง
เปลี่ยนคำสั่งยาวๆ หลายบรรทัดเป็นไฟล์ compose.yaml เดียว: ทุก service, network, volume ประกาศรวมกัน ขึ้นทั้งชุดด้วย docker compose up — ได้ทั้งความทำซ้ำได้ (ทีมใช้ไฟล์เดียวกัน) และ DNS ระหว่าง service อัตโนมัติ — เป็นเครื่องมือหลักของ dev environment ยุคนี้
depends_on การันตีว่า database พร้อมก่อนแอป start ไหม
จุดหลอกคลาสสิก: depends_on เปล่าๆ รอแค่ container "เริ่มรัน" ไม่ได้รอจน database "พร้อมรับ connection" — ต้องใช้ depends_on แบบ condition: service_healthy คู่กับ healthcheck ของ database หรือให้แอป retry connection เอง (ซึ่งควรทำอยู่แล้ว)

