แอปหลาย service
รันเว็บแอปและฐานข้อมูลพร้อมกัน
หัวข้อที่มีชื่อว่า “รันเว็บแอปและฐานข้อมูลพร้อมกัน”application จริงแทบทุกตัวต้องการฐานข้อมูล ด้วย Docker Compose คุณกำหนดทั้งสอง service ในไฟล์เดียว และ Compose จัดการ networking ให้อัตโนมัติ — ไม่ต้อง docker network create เองเลย
นี่คือเว็บแอปที่ใช้ PostgreSQL เป็น backend:
services: app: image: node:22-alpine working_dir: /app command: ["node", "server.js"] ports: - "3000:3000" environment: - DATABASE_HOST=db - DATABASE_PORT=5432 - DATABASE_NAME=mydb depends_on: - db
db: image: postgres:17-alpine environment: - POSTGRES_DB=mydb - POSTGRES_USER=user - POSTGRES_PASSWORD=secretdepends_on — ลำดับการเริ่มต้น
หัวข้อที่มีชื่อว่า “depends_on — ลำดับการเริ่มต้น”depends_on บอก Compose ให้สตาร์ท db ก่อน app นี่ควบคุมลำดับการสตาร์ท container ไม่ใช่ความพร้อม — database process ภายใน container อาจยังไม่รับ connection ในทันทีที่ container สตาร์ท สำหรับ production ให้เพิ่ม healthcheck ใน db และใช้ depends_on: condition: service_healthy ใน app
ลำดับการสตาร์ทแบบพื้นฐาน (เพียงพอสำหรับการเรียนรู้และการพัฒนา):
depends_on: - dbลำดับการสตาร์ทแบบ health-checked (pattern สำหรับ production):
services: app: depends_on: db: condition: service_healthy
db: image: postgres:17-alpine healthcheck: test: ["CMD-SHELL", "pg_isready -U user -d mydb"] interval: 5s timeout: 5s retries: 5 environment: - POSTGRES_DB=mydb - POSTGRES_USER=user - POSTGRES_PASSWORD=secretNetworking อัตโนมัติ
หัวข้อที่มีชื่อว่า “Networking อัตโนมัติ”เมื่อรัน docker compose up Compose จะสร้าง network สำหรับโปรเจกต์ของคุณโดยอัตโนมัติ ทุก service ในไฟล์ถูก attach เข้า network นั้น service เข้าถึงกันโดยใช้ ชื่อ service เป็น hostname
ในตัวอย่างด้านบน app เชื่อมต่อฐานข้อมูลที่ host db port 5432 — ตรงกับชื่อ service ไม่มี IP address ไม่มีการกำหนดค่า network เอง
app --[db:5432]--> db <-- myapp-network (auto-created) -->ดู logs จากหลาย service
หัวข้อที่มีชื่อว่า “ดู logs จากหลาย service”stream logs จากทุก service พร้อมกัน:
docker compose logs -fติดตามเฉพาะ service เดียว:
docker compose logs -f appลองปฏิบัติจริง
หัวข้อที่มีชื่อว่า “ลองปฏิบัติจริง”snippet ด้านล่างสตาร์ท app container ที่เชื่อมต่อ PostgreSQL container โดยใช้ชื่อ service db
# Write a two-service compose.yaml
cat > compose.yaml <<'EOF'
services:
app:
image: alpine
command: >
sh -c "
echo 'Waiting for db...' &&
sleep 3 &&
echo 'Connecting to db:5432 (postgres service)' &&
nc -zv db 5432 &&
echo 'Connection to db succeeded via service name DNS!'
"
depends_on:
- db
db:
image: postgres:17-alpine
environment:
- POSTGRES_PASSWORD=secret
EOF
# Start both services (app waits 3s then probes db)
docker compose up
# Clean up
docker compose downข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| Docker Compose | เชื่อม service หลายตัวด้วยไฟล์เดียว รัน local ได้ครบวงจรในไม่กี่วินาที | ทำงานบน host เดียว ไม่มี orchestration ข้าม node เมื่อ service เยอะขึ้น |
| Kubernetes | จัดการ service-to-service communication ข้ามคลัสเตอร์พร้อม self-healing | ต้องตั้ง Service, Deployment, network policy แยกกัน ซับซ้อนกว่า compose.yaml มาก |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- เชื่อว่า
depends_on: - dbรับประกันว่าdbพร้อมรับ connection ก่อนappสตาร์ท ทั้งที่แค่ควบคุมลำดับการสตาร์ท container เท่านั้น — ถ้าต้องรอความพร้อมจริงต้องใช้healthcheckกับcondition: service_healthy - hardcode IP address หรือ
localhostแทนชื่อ service ตอนต่อ database ทำให้ networking พังทันทีที่ container ถูก recreate และได้ IP ใหม่ - ลืมว่า network ที่ Compose สร้างอัตโนมัติเป็นแบบ project-scoped เมื่อรันหลายโปรเจกต์ที่ชื่อ directory คล้ายกัน อาจได้ network ซ้ำซ้อนโดยไม่ตั้งใจ
💡 ตัวอย่างจากของจริง
pipeline ที่พบบ่อยในทีมจริงคือใช้ Docker Compose รัน
app+dblocal ระหว่างพัฒนา เพื่อให้ dev experience เร็วและครบ แล้วเมื่อ deploy production ก็เอา image เดียวกันไปขึ้นบน Kubernetes ที่แทนที่depends_onด้วย readiness probe และแทนที่ Compose network ด้วย Kubernetes Service — โค้ดแอปไม่ต้องเปลี่ยน เปลี่ยนแค่ orchestration layer