ข้ามไปเนื้อหาหลัก
Docker· ~16 นาที· อัปเดตล่าสุด

Docker Compose — รันหลายคอนเทนเนอร์ (+ Lab)

นิยามทั้งระบบ (web + db) ในไฟล์เดียว สั่งขึ้นพร้อมกัน

ปูพื้นฐาน: ถ้าระบบของเรามีแค่เว็บแอปเดียว การใช้คำสั่ง docker run ทีละตัวก็เพียงพอ แต่ในความจริง ระบบหนึ่งๆ มักจะมีหลายส่วนประกอบ เช่น มีเว็บ, มีฐานข้อมูล (Database), มีตัวช่วยจำ (Cache) การมานั่งพิมพ์คำสั่งรันทีละตัวคงไม่สะดวกนัก

Docker Compose คือสวิตช์ไฟรวม

สั่ง docker run ทีละ container เหมือนเปิดเครื่องใช้ไฟฟ้าทีละตัว · Docker Compose เหมือนสวิตช์รวมที่กดครั้งเดียวเปิดทั้งบ้าน — นิยามทุก service (เว็บ, ฐานข้อมูล, cache) ในไฟล์ YAML เดียว แล้วสั่งขึ้นพร้อมกัน

Docker Compose เหมาะกับแอปที่มีหลาย container ทำงานร่วมกัน (เช่น เว็บ + ฐานข้อมูล) · เขียนทุกอย่างใน compose.yaml แล้วจัดการทั้งชุดด้วยคำสั่งเดียว

compose.yaml เดียว = หลาย service ขึ้นพร้อมกัน คุยกันด้วยชื่อ

compose.yamldocker compose up
▼ สร้าง network + volume ให้อัตโนมัติ
webbuild: .
เรียกชื่อ db
dbpostgres
compose.yaml เดียวนิยามหลาย service ที่คุยกันด้วยชื่อ + volume/network ให้อัตโนมัติ

🧪 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:
compose.yaml
docker compose up -d        # สร้าง+รันทั้งชุด (เบื้องหลัง)
docker compose ps           # ดูสถานะทุก service
docker compose logs -f web  # ดู log ของ service web
docker compose down         # หยุด+ลบทั้งชุด (เติม -v = ลบ volume ด้วย)
คำสั่ง Compose ที่ใช้บ่อย

สรุป 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 เอง (ซึ่งควรทำอยู่แล้ว)

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