Docker Compose คืออะไร? ทำไมถึงจำเป็นต้องใช้

เมื่อคุณรัน Application ที่ประกอบด้วยหลาย Service เช่น Web App + Database + Cache การพิมพ์คำสั่ง docker run ทีละตัวเริ่มน่าเบื่อหน่าย Docker Compose คือเครื่องมือที่ช่วยจัดการทั้งหมดด้วยไฟล์ YAML เดียว

Docker Compose คืออะไร?

Docker Compose คือเครื่องมือสำหรับสร้างและจัดการ Multi-Container Application คุณเพียงเขียนนิยาม Container ทั้งหมดในไฟล์ docker-compose.yml แล้วเรียกคำสั่งเดียวก็รันได้ทั้งหมด

ปัญหาที่ Compose แก้

สมมติว่าคุณต้องรัน WordPress + MySQL โดยไม่ใช้ Compose:

# ต้องรันคำสั่งเหล่านี้ทั้งหมด และจำ Network/Volume
docker network create wp-network
docker volume create mysql-data

docker run -d \
  --name mysql \
  --network wp-network \
  -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=wordpress \
  mysql:8.0

docker run -d \
  --name wordpress \
  --network wp-network \
  -p 80:80 \
  -e WORDPRESS_DB_HOST=mysql \
  -e WORDPRESS_DB_PASSWORD=secret \
  wordpress

ด้วย Compose เหลือแค่เขียนไฟล์ YAML และคำสั่งเดียว:

docker compose up -d

โครงสร้างของ Docker Compose

Docker Compose ทำงานผ่านไฟล์ docker-compose.yml (Compose v2 ใช้ได้ทั้งชื่อ docker-compose.yml หรือ compose.yml) โดยไฟล์นี้ประกอบด้วย 4 ส่วนหลัก:

  • services — นิยาม Container แต่ละตัว
  • networks — กำหนด Network สำหรับ Service
  • volumes — สร้าง Volume สำหรับเก็บข้อมูล
  • configs/secrets — จัดการ Config และข้อมูลลับบับ

ตัวอย่างไฟล์ docker-compose.yml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app

  app:
    build: .
    environment:
      - DB_HOST=db
      - DB_PASSWORD=secret
    depends_on:
      - db

  db:
    image: mysql:8.0
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp

volumes:
  db-data:

คำสั่งหลักของ Compose

# รันทุก Service ใน Background
docker compose up -d

# หยุดทุก Service
docker compose down

# ดู Log
docker compose logs -f

# ดูสถานะ Service
docker compose ps

ข้อดีของ Docker Compose

  • เรียบง่าย — ทุกอย่างอยู่ในไฟล์เดียว ไม่ต้องจำคำสั่งยาวๆ
  • Reproducible — ใครก็รันได้ในเครื่องใดก็ได้ผลลัพธ์เหมือนกัน
  • Version Control — ไฟล์ YAML เก็บใน Git ได้
  • Dependencies — กำหนด depends_on เพื่อให้ Service เริ่มตามลำดับ

Docker Compose v1 vs v2

Compose v1 Compose v2 (ปัจจุบัน)
คำสั่ง docker-compose up docker compose up
การติดตั้ง ติดตั้งแยก Built-in ใน Docker ใหม่
Status Deprecated แนะนำ

ปัจจุบันใช้ docker compose (v2, ไม่มี dash) ซึ่งติดตั้งพร้อมกับ Docker Engine เลย

สรุป

Docker Compose ทำให้การจัดการ Multi-Container App ง่ายขึ้นมาก ทำให้ Environment เหมือนกันทุกเครื่อง และเก็บ Config ไว้ใน Git ได้ บทความถัดไปจะอธิบายวิธีเขียนไฟล์ docker-compose.yml อย่างละเอียด