پرش به محتوا

اجرای یک برنامه‌ی چندسرویسی با Docker Compose

یک برنامه‌ی وب، پایگاه داده و کش را در یک فایل compose تعریف کنید؛ با شبکه‌ی جدا، volume دائمی، healthcheck و راه‌اندازی خودکار.

Ubuntu 24.04 LTSسطح: متوسطبرای: Ubuntu 24.04 LTS، Ubuntu 26.04 LTS، Ubuntu 22.04 LTSبه‌روزرسانی: ۱۶ آبان ۱۴۰۵

پیش‌نیاز: Docker Engine و افزونه‌ی Compose نصب باشد (نصب Docker).

۱. ساختار پروژه

bash
mkdir -p ~/stacks/app && cd ~/stacks/app

یک فایل .env برای رمزها (این فایل را در git قرار ندهید):

ini
POSTGRES_PASSWORD=change-me-strong

۲. فایل compose

yaml
# compose.yaml
services:
  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_USER: app
      POSTGRES_DB: app
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 10s
      retries: 5

  cache:
    image: redis:7-alpine
    restart: unless-stopped

  web:
    image: ghcr.io/example/app:1.4.2
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://app:${POSTGRES_PASSWORD}@db:5432/app
      REDIS_URL: redis://cache:6379
    ports:
      - "127.0.0.1:8080:8080"

volumes:
  db-data:

نکته‌ها:

  • پایگاه داده و کش هیچ پورتی منتشر نکرده‌اند؛ فقط از داخل شبکه‌ی compose در دسترس‌اند.
  • پورت برنامه فقط روی 127.0.0.1 باز است. دسترسی بیرونی را از طریق Nginx (reverse proxy) بدهید. پورت‌های منتشرشده در Docker قوانین UFW را دور می‌زنند.
  • همیشه نسخه‌ی مشخص ایمیج را بنویسید، نه latest.

۳. اجرا و مدیریت

bash
docker compose up -d
docker compose ps
docker compose logs -f web

به‌روزرسانی به نسخه‌ی جدید ایمیج:

bash
docker compose pull
docker compose up -d
docker image prune -f

۴. پشتیبان‌گیری از پایگاه داده

bash
docker compose exec -T db pg_dump -U app -Fc app > app-$(date +%F).dump

۵. توقف کامل

bash
docker compose down        # volumeها باقی می‌مانند
docker compose down -v     # volumeها هم پاک می‌شوند (داده از بین می‌رود)