ESC را فشار دهید تا بسته شود

Docker Compose چیست؟ آموزش اجرای چند کانتینر روی سرور لینوکس

فهرست

خلاصه سریع: Docker Compose ابزاری برای تعریف و اجرای چند کانتینر Docker به‌صورت یک مجموعه است. به‌جای اجرای جداگانه دستورهای طولانی برای وب‌سرور، دیتابیس و سرویس‌های جانبی، تنظیمات را در یک فایل Compose می‌نویسید و کل استک را با یک دستور مدیریت می‌کنید. این روش برای راه‌اندازی پروژه‌ها روی VPS، محیط توسعه و بسیاری از استقرارهای تک‌سروری بسیار کاربردی است.

Docker Compose چیست؟

در Docker هر کانتینر معمولاً یک سرویس مشخص را اجرا می‌کند؛ مثلاً Nginx، اپلیکیشن، Redis یا MySQL. وقتی پروژه چند سرویس دارد، مدیریت تک‌تک کانتینرها با دستورهای جداگانه هم زمان‌بر می‌شود و هم احتمال خطا را بالا می‌برد. Docker Compose این مشکل را با یک فایل پیکربندی YAML حل می‌کند.

در این فایل مشخص می‌کنید چه سرویس‌هایی اجرا شوند، از چه Image یا Build استفاده کنند، چه پورت‌هایی منتشر شوند، چه Volumeهایی لازم است و سرویس‌ها چگونه به یکدیگر متصل شوند. سپس با دستور docker compose up مجموعه سرویس‌ها ساخته و اجرا می‌شود.

 

Docker Compose چه تفاوتی با Docker دارد؟

DockerDocker Compose
مدیریت مستقیم کانتینرها و Imageهاتعریف و مدیریت یک برنامه چندسرویسی
مناسب اجرای یک کانتینر با دستورهای CLIمناسب استک‌هایی شامل چند کانتینر
تنظیمات ممکن است در چند دستور پراکنده باشدتنظیمات اصلی در فایل Compose نگهداری می‌شود
برای اجرای مجدد باید گزینه‌ها را به خاطر بسپارید یا اسکریپت بنویسیدفایل Compose نقش تعریف قابل‌تکرار محیط را دارد

پیش‌نیازهای اجرای Docker Compose روی VPS

برای این آموزش به یک سرور لینوکسی با دسترسی SSH و Docker Engine نیاز دارید. برای پروژه‌های واقعی بهتر است کاربر غیرضروری با دسترسی root مستقیم استفاده نشود و فایروال سرور نیز فقط پورت‌های لازم را باز نگه دارد.

اگر برای اجرای پروژه به سرور نیاز دارید، می‌توانید مشخصات سرور مجازی

Docker Compose برای مدیریت چند کانتینر روی سرور لینوکس

وان‌سرور را بررسی کنید. مقدار RAM و CPU موردنیاز به تعداد کانتینرها و بار واقعی برنامه بستگی دارد.

بررسی نصب Docker Compose

در نسخه‌های جدید Docker، Compose معمولاً به شکل Plugin و با فاصله بین دو کلمه اجرا می‌شود:

docker compose version

اگر نسخه نمایش داده شد، Compose آماده استفاده است. توجه کنید که دستور جدید docker compose با ابزار قدیمی docker-compose یکسان نیست؛ در سرورهای جدید بهتر است از Compose Plugin استفاده شود.

ساخت اولین پروژه با Docker Compose

یک پوشه برای پروژه بسازید:

mkdir compose-demo
cd compose-demo

سپس فایلی با نام compose.yaml ایجاد کنید:

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    restart: unless-stopped

در این مثال یک سرویس به نام web تعریف شده که Image رسمی Nginx Alpine را اجرا می‌کند. پورت 8080 سرور به پورت 80 کانتینر متصل شده است.

اجرای سرویس‌ها

برای دریافت Image و اجرای سرویس در پس‌زمینه:

docker compose up -d

سپس وضعیت کانتینرهای همین پروژه را ببینید:

docker compose ps

در صورت فعال بودن فایروال، قبل از بازکردن پورت 8080 به اینترنت بررسی کنید که واقعاً به دسترسی عمومی نیاز دارید. در محیط عملیاتی معمولاً سرویس‌های داخلی نباید بی‌دلیل روی تمام Interfaceهای سرور منتشر شوند.

مشاهده لاگ‌ها و عیب‌یابی

یکی از مهم‌ترین دستورها برای پیدا کردن خطاهای سرویس‌ها این است:

docker compose logs

برای دنبال‌کردن زنده لاگ‌ها:

docker compose logs -f

و برای دیدن لاگ یک سرویس مشخص:

docker compose logs -f web

توقف، شروع مجدد و حذف استک

برای توقف سرویس‌ها بدون حذف کانتینرها:

docker compose stop

برای اجرای مجدد:

docker compose start

برای متوقف و حذف کردن کانتینرها و Networkهای ایجادشده توسط پروژه:

docker compose down

هشدار: قبل از استفاده از گزینه‌هایی که Volumeها را حذف می‌کنند، از داده‌های مهم به‌خصوص دیتابیس نسخه پشتیبان داشته باشید.

مثال کاربردی: Nginx و یک اپلیکیشن

Compose زمانی ارزش واقعی خود را نشان می‌دهد که چند سرویس به هم وابسته باشند. نمونه ساده زیر دو سرویس تعریف می‌کند:

services:
  app:
    image: my-app:latest
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - app
    restart: unless-stopped

سرویس‌ها در Network پیش‌فرض پروژه می‌توانند یکدیگر را با نام سرویس پیدا کنند. در نتیجه Nginx می‌تواند به سرویسی با نام app متصل شود، بدون اینکه برای ارتباط داخلی الزاماً پورت اپلیکیشن را روی اینترنت Publish کنید.

Volume در Docker Compose چه کاربردی دارد؟

فایل‌سیستم کانتینر را نباید محل مطمئن نگهداری داده‌های دائمی فرض کرد. برای دیتابیس، فایل‌های آپلودی یا داده‌هایی که باید پس از بازسازی کانتینر باقی بمانند، از Volume یا Bind Mount مناسب استفاده کنید.

services:
  db:
    image: mariadb:latest
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

در محیط Production بهتر است به‌جای تکیه به تگ latest، نسخه Image را آگاهانه Pin کنید تا یک Pull ناخواسته باعث تغییر پیش‌بینی‌نشده نسخه نشود.

Environment Variable و اطلاعات حساس

Compose امکان استفاده از متغیرهای محیطی را فراهم می‌کند، اما فایل‌های حاوی رمز عبور، API Key و Secret نباید وارد مخزن عمومی Git شوند. سطح دسترسی فایل‌ها، محل نگهداری Secretها و روش تزریق آن‌ها باید متناسب با حساسیت پروژه انتخاب شود.

نمونه:

services:
  app:
    image: my-app:1.4
    environment:
      APP_ENV: production

Healthcheck و ترتیب آماده‌شدن سرویس‌ها

وجود depends_on به‌تنهایی به این معنی نیست که سرویس وابسته کاملاً آماده پاسخ‌گویی شده است. مثلاً ممکن است کانتینر دیتابیس اجرا شده باشد اما چند ثانیه تا آماده‌شدن آن زمان لازم باشد. برای استک‌های واقعی، Healthcheck و منطق Retry برنامه را نیز در طراحی در نظر بگیرید.

دستورهای مهم Docker Compose

دستورکاربرد
docker compose up -dساخت و اجرای سرویس‌ها در پس‌زمینه
docker compose psمشاهده وضعیت سرویس‌ها
docker compose logs -fمشاهده زنده لاگ‌ها
docker compose pullدریافت Imageهای تعریف‌شده
docker compose restartراه‌اندازی مجدد سرویس‌ها
docker compose downتوقف و حذف منابع اصلی استک
docker compose configاعتبارسنجی و نمایش پیکربندی نهایی

Docker Compose برای Production مناسب است؟

برای بسیاری از برنامه‌های تک‌سروری و استک‌های کوچک تا متوسط، Compose می‌تواند روش ساده و قابل‌مدیریتی برای استقرار باشد؛ به شرط آنکه بکاپ، مانیتورینگ، مدیریت Secret، به‌روزرسانی Imageها، محدودیت منابع، Healthcheck، لاگ‌ها و امنیت شبکه جدی گرفته شوند.

اما Compose جایگزین خودکار یک Orchestrator کلاستری نیست. اگر برنامه به چند Node، زمان‌بندی پیشرفته Workload، Self-healing در سطح کلاستر یا مقیاس‌پذیری پیچیده نیاز دارد، ابزارهایی مانند Kubernetes مسئله متفاوتی را حل می‌کنند.

اشتباهات رایج هنگام استفاده از Docker Compose

  • استفاده بی‌برنامه از تگ latest در محیط عملیاتی.
  • قرار دادن Password و Token داخل Git.
  • Publish کردن پورت دیتابیس روی اینترنت بدون نیاز واقعی.
  • نداشتن Volume و بکاپ برای داده‌های دائمی.
  • فرض اینکه depends_on به‌تنهایی آماده‌بودن کامل سرویس را تضمین می‌کند.
  • به‌روزرسانی Imageها بدون تست و برنامه Rollback.

سوالات متداول

Docker Compose چیست؟

Docker Compose ابزاری برای تعریف و مدیریت برنامه‌های چندکانتینری است. سرویس‌ها، Networkها، Volumeها و تنظیمات مرتبط در فایل Compose تعریف می‌شوند و با دستورهای مشترک مدیریت می‌شوند.

فرق docker compose و docker-compose چیست؟

docker compose دستور Compose جدید به‌صورت Plugin در Docker CLI است. docker-compose نام ابزار مستقل قدیمی است که در آموزش‌های قدیمی زیاد دیده می‌شود.

آیا برای هر پروژه باید compose.yaml جدا داشته باشیم؟

معمولاً هر استک یا پروژه فایل Compose خودش را دارد تا سرویس‌ها و تنظیمات آن پروژه مستقل و قابل‌تکرار باشند.

آیا Docker Compose فقط برای محیط توسعه است؟

خیر. برای استقرارهای تک‌سروری نیز استفاده می‌شود، اما در Production باید امنیت، پایداری، بکاپ، مانیتورینگ و فرآیند به‌روزرسانی به‌درستی طراحی شوند.

آیا با Docker Compose می‌توان دیتابیس اجرا کرد؟

بله، اما داده دیتابیس باید روی Volume پایدار ذخیره شود و برای آن بکاپ مستقل داشته باشید. همچنین پورت دیتابیس را بدون ضرورت روی اینترنت باز نکنید.

جمع‌بندی

Docker Compose فاصله بین «چند دستور Docker پراکنده» و یک استک قابل‌تکرار را کم می‌کند. برای شروع، کافی است سرویس‌ها را در compose.yaml تعریف کنید، با docker compose up -d اجرا کنید و با docker compose logs و docker compose ps وضعیت را زیر نظر بگیرید. در محیط واقعی، نسخه Imageها، داده‌های پایدار، Secretها، Healthcheck و بکاپ را از همان ابتدا بخشی از طراحی بدانید.

منابع: Docker Compose Documentation، Docker Compose CLI Reference.

5/5 - (1 امتیاز)
اشتراک گذاری نوشته در:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *