กลับไปหน้าสูตร
#docker#compose#devops#cheatsheet
Docker Compose Patterns (Prod-like Local Stack)
รวมแพตเทิร์น Docker Compose แบบจัดเต็มสำหรับ local ที่ใกล้ production: app+db+cache+queue, healthcheck, profiles, secrets, observability
11 มีนาคม 2569อ่านประมาณ 2 นาที
สารบัญสูตร
Core Commands
| Command | ใช้ทำอะไร |
|---|---|
docker compose up -d | start stack |
docker compose down | stop stack |
docker compose ps | ดู service status |
docker compose logs -f | logs รวม |
docker compose logs -f api | logs service เดียว |
docker compose exec api sh | เข้า shell |
docker compose down -v | down พร้อมลบ volume |
Pattern 1: App + DB + Redis
services:
api:
build: .
ports: ["3000:3000"]
environment:
DATABASE_URL: postgres://postgres:postgres@db:5432/app
REDIS_URL: redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: app
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 20
redis:
image: redis:7
volumes:
db_data:
Pattern 2: Worker + Queue
| Service | หน้าที่ |
|---|---|
api | รับ request |
worker | ประมวลผลงาน background |
redis/rabbitmq | queue broker |
db | persistent store |
Pattern 3: Profiles (dev/test/tools)
services:
api:
profiles: ["dev", "test"]
mailhog:
image: mailhog/mailhog
ports: ["8025:8025"]
profiles: ["dev-tools"]
| Command | ใช้ทำอะไร |
|---|---|
docker compose --profile dev up -d | เปิดเฉพาะ profile dev |
docker compose --profile dev-tools up -d | เปิด tool เพิ่ม |
Pattern 4: Override per Environment
| File | บทบาท |
|---|---|
compose.yml | base config |
compose.override.yml | local dev overrides |
compose.prod-like.yml | prod-like settings |
| Command | ตัวอย่าง |
|---|---|
| รวมหลายไฟล์ | docker compose -f compose.yml -f compose.prod-like.yml up -d |
Healthchecks & Dependencies
| แนวทาง | เหตุผล |
|---|---|
| ใช้ healthcheck กับ DB/API | ลด race condition ตอน startup |
ใช้ depends_on.condition | คุมลำดับให้ชัด |
| app ต้อง retry connection เอง | กันกรณี healthcheck ผ่านช้ากว่า |
Volumes Strategy
| Pattern | เหมาะกับ |
|---|---|
| named volumes | data persistence |
| bind mount | live code reload |
| tmpfs | temporary high-speed data |
Secrets / Env
| แนวทาง | รายละเอียด |
|---|---|
.env | config non-sensitive |
secrets: | เก็บค่า sensitive ในไฟล์แยก |
| ไม่ hardcode key ใน compose | security baseline |
Observability Local
| Tool | ประโยชน์ |
|---|---|
docker compose logs -f | รวม logs |
prometheus + grafana | metrics dashboard |
jaeger | trace debugging |
loki | log aggregation |
Build & Performance Tips
| เทคนิค | ผลลัพธ์ |
|---|---|
| multi-stage Dockerfile | image เล็กลง |
| caching dependencies | build เร็วขึ้น |
| pin image tags | ลด surprise จาก latest |
pull_policy ชัดเจน | คุมเวอร์ชันง่ายขึ้น |
Troubleshooting Playbook
| ปัญหา | วิธีแก้ |
|---|---|
| service ขึ้นไม่ครบ | docker compose ps + logs |
| app ต่อ DB ไม่ได้ | ตรวจ hostname ต้องเป็น service name |
| data หาย | เช็กว่าใช้ named volume จริง |
| port ชน | เปลี่ยน mapping host port |
| build ช้า | optimize Dockerfile layers |
Makefile Helpers (Optional)
up:
docker compose up -d
logs:
docker compose logs -f --tail=200
down:
docker compose down
reset:
docker compose down -v && docker compose up -d --build