خلاصه سریع: Docker Compose ابزاری برای تعریف و اجرای چند کانتینر Docker بهصورت یک مجموعه است. بهجای اجرای جداگانه دستورهای طولانی برای وبسرور، دیتابیس و سرویسهای جانبی، تنظیمات را در یک فایل Compose مینویسید و کل استک را با یک دستور مدیریت میکنید. این روش برای راهاندازی پروژهها روی VPS، محیط توسعه و بسیاری از استقرارهای تکسروری بسیار کاربردی است.
Docker Compose چیست؟
در Docker هر کانتینر معمولاً یک سرویس مشخص را اجرا میکند؛ مثلاً Nginx، اپلیکیشن، Redis یا MySQL. وقتی پروژه چند سرویس دارد، مدیریت تکتک کانتینرها با دستورهای جداگانه هم زمانبر میشود و هم احتمال خطا را بالا میبرد. Docker Compose این مشکل را با یک فایل پیکربندی YAML حل میکند.
در این فایل مشخص میکنید چه سرویسهایی اجرا شوند، از چه Image یا Build استفاده کنند، چه پورتهایی منتشر شوند، چه Volumeهایی لازم است و سرویسها چگونه به یکدیگر متصل شوند. سپس با دستور docker compose up مجموعه سرویسها ساخته و اجرا میشود.
Docker Compose چه تفاوتی با Docker دارد؟
| Docker | Docker Compose |
|---|---|
| مدیریت مستقیم کانتینرها و Imageها | تعریف و مدیریت یک برنامه چندسرویسی |
| مناسب اجرای یک کانتینر با دستورهای CLI | مناسب استکهایی شامل چند کانتینر |
| تنظیمات ممکن است در چند دستور پراکنده باشد | تنظیمات اصلی در فایل Compose نگهداری میشود |
| برای اجرای مجدد باید گزینهها را به خاطر بسپارید یا اسکریپت بنویسید | فایل Compose نقش تعریف قابلتکرار محیط را دارد |
پیشنیازهای اجرای Docker Compose روی VPS
برای این آموزش به یک سرور لینوکسی با دسترسی SSH و Docker Engine نیاز دارید. برای پروژههای واقعی بهتر است کاربر غیرضروری با دسترسی root مستقیم استفاده نشود و فایروال سرور نیز فقط پورتهای لازم را باز نگه دارد.
اگر برای اجرای پروژه به سرور نیاز دارید، میتوانید مشخصات سرور مجازی

وانسرور را بررسی کنید. مقدار 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: productionHealthcheck و ترتیب آمادهشدن سرویسها
وجود 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.
