
สารบัญ
Docker Compose คืออะไร
Docker Compose คือเครื่องมือสำหรับนิยามและรัน multi-container Docker application ด้วยไฟล์ YAML ไฟล์เดียว แทนที่จะต้องพิมพ์คำสั่ง docker run ยาวๆ หลายบรรทัดสำหรับแต่ละ container คุณแค่เขียน docker-compose.yml แล้วรัน docker compose up คำสั่งเดียวก็จบ
ตัวอย่างเช่น เว็บแอปพลิเคชันทั่วไปมักประกอบด้วย 3 ส่วน ได้แก่ web server, application server และ database ซึ่ง Docker Compose จะช่วยให้สามเซอร์วิสนี้ทำงานร่วมกันได้ โดยไม่ต้องตั้งค่าเครือข่ายเองแต่ละตัว
💡 Docker Compose เป็นส่วนหนึ่งของ Docker ecosystem และตั้งแต่ Docker v20.10 เป็นต้นมา Compose v2 ถูกรวมเข้ามาเป็น plugin มาตรฐานแล้ว ไม่ต้องติดตั้งแยก
ต่างจาก Docker อย่างไร
ผู้เริ่มต้นมักสับสนว่า Docker กับ Docker Compose ต่างกันอย่างไร ตารางด้านล่างเปรียบเทียบให้เห็นชัด:
| หัวข้อ | Docker | Docker Compose |
|---|---|---|
| จัดการ | Container เดียว | หลาย Container พร้อมกัน |
| คำสั่งหลัก | docker run | docker compose up |
| ไฟล์ config | Dockerfile | docker-compose.yml |
| Network | ตั้งเองด้วย flag | สร้าง network อัตโนมัติ |
| ความเหมาะสม | Single service, CI/CD | Multi-service app, Dev/Prod |
| Dependency order | ไม่มี | depends_on รองรับ |
วิธีติดตั้ง Docker + Compose บน VPS Ubuntu
สำหรับ VPS ที่รัน Ubuntu 22.04 หรือ 24.04 ให้ทำตามขั้นตอนนี้:
ขั้นตอนที่ 1: อัปเดต package และติดตั้ง dependencies
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
ขั้นตอนที่ 2: เพิ่ม Docker GPG key และ repository
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
ขั้นตอนที่ 3: ติดตั้ง Docker Engine + Compose plugin
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
ขั้นตอนที่ 4: เพิ่ม user เข้ากลุ่ม docker (ไม่ต้องพิมพ์ sudo)
sudo usermod -aG docker $USER
newgrp docker
ตรวจสอบการติดตั้ง
docker --version
docker compose version
⚠️ ถ้ายังไม่เห็น docker compose (v2) ให้ตรวจสอบว่าติดตั้ง docker-compose-plugin แล้ว — อย่าสับสนกับ docker-compose (v1 แบบ dash ที่ deprecated แล้ว)
โครงสร้างไฟล์ docker-compose.yml
ไฟล์ docker-compose.yml ใช้รูปแบบ YAML มีโครงสร้างหลัก 3 ส่วน:
services: # นิยาม container แต่ละตัว
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: .
environment:
- DB_HOST=db
networks:
- backend
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
networks:
- backend
volumes: # นิยาม named volume
db_data:
networks: # นิยาม custom network
backend:
| Key | ความหมาย |
|---|---|
services | กลุ่ม container ทั้งหมด |
image | Docker image ที่ใช้ |
build | Build จาก Dockerfile |
ports | Map port host:container |
volumes | Mount ไฟล์/โฟลเดอร์ |
environment | Environment variables |
depends_on | รอ service อื่นก่อนเริ่ม |
networks | กำหนด network ที่ใช้ |
restart | นโยบาย restart อัตโนมัติ |
ตัวอย่าง: WordPress + MySQL บน VPS
ตัวอย่างนี้เป็นการรัน WordPress พร้อม MySQL database ซึ่งเป็นกรณีใช้งานที่พบบ่อยที่สุด:
version: '3.9'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
volumes:
wp_data:
db_data:
บันทึกเป็น docker-compose.yml แล้วรัน:
docker compose up -d
docker compose ps # ดู status
คำสั่งที่ใช้บ่อย
| คำสั่ง | ความหมาย |
|---|---|
docker compose up -d | เริ่มทุก service (detached) |
docker compose down | หยุดและลบ container |
docker compose down -v | หยุด + ลบ volume ด้วย |
docker compose ps | ดู status ทุก service |
docker compose logs -f | ดู log แบบ real-time |
docker compose logs web | ดู log เฉพาะ service "web" |
docker compose exec app bash | เข้า shell ของ container |
docker compose restart db | restart เฉพาะ service "db" |
docker compose pull | ดึง image ล่าสุด |
docker compose build --no-cache | Build image ใหม่ |
Networking และ Volume
Network
เมื่อรัน docker compose up Docker จะสร้าง default network ชื่อ <foldername>_default โดยอัตโนมัติ ทำให้ทุก service คุยกันผ่าน service name ได้เลย เช่น ถ้า service ชื่อ db สามารถเชื่อมต่อด้วย hostname db ได้จาก container อื่น
Volume ประเภทต่างๆ
| ประเภท | ตัวอย่าง | เหมาะกับ |
|---|---|---|
| Named volume | db_data:/var/lib/mysql | Database, persistent data |
| Bind mount | ./src:/app/src | Development, hot reload |
| Anonymous volume | /tmp/cache | Temp data |
จัดการ Environment Variables ด้วย .env
ข้อมูลที่ sensitive เช่น password ควรเก็บในไฟล์ .env แยกออกมา:
# .env
DB_PASSWORD=myS3cur3P@ss
MYSQL_ROOT_PASSWORD=r00tS3cr3t
Docker Compose จะโหลดไฟล์ .env อัตโนมัติเมื่ออยู่โฟลเดอร์เดียวกัน และ ${DB_PASSWORD} ใน YAML จะถูกแทนที่ด้วยค่าจริง
🔒 อย่าลืมเพิ่ม .env เข้า .gitignore ก่อน commit เพื่อป้องกัน credential รั่วไหล
เคล็ดลับใช้งาน Production บน VPS
- ใส่
restart: alwaysใน service สำคัญ เพื่อให้ container รีสตาร์ทอัตโนมัติหลัง VPS reboot - จำกัด resource ด้วย
deploy.resources.limitsเพื่อป้องกัน container ใดใดใช้ CPU/RAM เกิน - ใช้ Nginx Reverse Proxy ด้านหน้าเพื่อจัดการ SSL termination และ routing
- ตั้ง health check ด้วย
healthcheck:เพื่อให้ Compose รู้ว่า service พร้อมใช้งานจริงก่อน start service ที่ depends_on - Backup volume สม่ำเสมอ — ข้อมูลใน named volume จะอยู่ที่
/var/lib/docker/volumes/ - แยก compose file สำหรับ dev และ prod ด้วย
docker-compose.override.yml
📌 VPS AsiaGB มี SSD storage และ Uptime 99% เหมาะสำหรับรัน Docker Compose app ได้ทั้ง VPS ไทย (BKK) และ VPS สิงคโปร์ — เริ่มต้นได้ทันทีที่ asiagb.com/vps.html
คำถามที่พบบ่อย (FAQ)
docker-compose (Python-based, deprecated) ส่วน v2 เป็น plugin ของ Docker CLI ใช้ docker compose ไม่มี dash มีประสิทธิภาพดีกว่าและรองรับ Compose Specification ล่าสุดdocker compose up ใหม่ volume เดิมจะถูก mount กลับมา ข้อมูลใน database จะคงอยู่ — แต่ถ้า docker compose down -v volume จะถูกลบด้วย-d ย่อมาจาก detached mode หมายถึงรัน container ในพื้นหลังโดยไม่แสดง log ออกหน้าจอ ทำให้ terminal ยังใช้งานได้ตามปกติสรุป
Docker Compose เป็นเครื่องมือที่ขาดไม่ได้สำหรับนักพัฒนาที่ต้องการรัน multi-container app บน VPS อย่างมีระเบียบ ข้อดีหลักคือ:
- นิยาม stack ทั้งหมดในไฟล์ YAML เดียว — ทีมทำงานร่วมกันได้ง่าย
- สร้าง network อัตโนมัติ — service คุยกันด้วย name ได้เลย
- จัดการ volume ง่าย — ข้อมูลไม่หายเมื่อ restart
- คำสั่งเดียว
docker compose up -dเปิด stack ทั้งหมด
เริ่มต้นด้วย VPS AsiaGB ที่มี SSD storage พร้อม Uptime 99% เหมาะสำหรับรัน Docker Compose app ทั้ง dev และ production