ข้ามไปยังเนื้อหา

แอปหลาย 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=secret

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=secret

เมื่อรัน 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) -->

stream logs จากทุก service พร้อมกัน:

Terminal window
docker compose logs -f

ติดตามเฉพาะ service เดียว:

Terminal window
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
ตัวเลือกBenefitCost
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 + db local ระหว่างพัฒนา เพื่อให้ dev experience เร็วและครบ แล้วเมื่อ deploy production ก็เอา image เดียวกันไปขึ้นบน Kubernetes ที่แทนที่ depends_on ด้วย readiness probe และแทนที่ Compose network ด้วย Kubernetes Service — โค้ดแอปไม่ต้องเปลี่ยน เปลี่ยนแค่ orchestration layer

service app เชื่อมต่อฐานข้อมูลใน Compose app อย่างไร?
depends_on: - db รับประกันอะไร?
คำสั่งใด stream logs จากทุก service พร้อมกัน?
อะไรสร้าง internal network ที่เชื่อมต่อ Compose services ทั้งหมด?