Docker Compose ابزاری است که اجرای چند کانتینر را در یک پروژه آسان میکند. پیش از این، برای راهاندازی هر سرویس باید چند دستور جداگانه وارد میشد و یک خطای کوچک میتوانست کل سیستم را تحت تاثیر قرار دهد. Docker Compose این روند را یکدست میکند و اجازه میدهد همهی سرویسها در یک فایل YAML تعریف و با یک دستور کنار هم اجرا شوند. این روش خطا را کم میکند و مدیریت پروژههای چندسرویسی را سریعتر پیش میبرد. همچنین، توسعهدهندگان بدون درگیر شدن با جزییات تکراری میتوانند محیط اجرایی پروژه را تنها با یک دستور راهاندازی کنند.
این راهنما کمک میکند تا درک روشنتری از مزایا و قابلیتهای این ابزار بهدست آورید و بتوانید بهطور موثر از آن در پروژههای خود استفاده کنید. در ادامه همراه ما باشید.
Docker Compose چیست؟
Docker Compose ابزاری است که چند سرویس را کنار هم و در قالب یک پروژهی یکپارچه اجرا میکند. این ابزار زمانی وارد دنیای داکر شد که اجرای جداگانهی هر کانتینر با دستورهای متعدد، پروژهها را پیچیده و مستعد خطا میکرد. Compose این روند را ساده و امکان تعریف کامل سرویسها، شبکه و ولومها را در یک فایل YAML فراهم ساخت.
داکر در سال ۲۰۱۳ با هدف ایجاد یک محیط اجرای یکپارچه و مستقل از سیستم میزبان معرفی شد و با محبوبیت سریع آن، نیاز به ابزاری برای مدیریت مجموعهای از کانتینرهای وابسته شکل گرفت. در پاسخ به این نیاز، پروژهی Fig در سال ۲۰۱۴ توسط Docker خریداری و بهطور رسمی با نام Docker Compose ارایه شد تا پیکربندی و راهاندازی سرویسهای چندکانتینری بهشکل خودکار و یکپارچه انجام بگیرد.
داکر یک پلتفرم برای ساخت و اجرای سرویسها داخل کانتینر است و درک نقش داکر کامپوز زمانی بهتر میشود که شناخت کاملی از داکر داشته باشیم. به همین منظور، مطالعهی مطلب داکر چیست میتواند مفید باشد.
Docker Compose چگونه کار میکند؟
Docker Compose با یک فایل اصلی به نام docker-compose.yml کار خود را شروع میکند. در این فایل، همهی سرویسهای پروژه تعریف میشوند و هر سرویس تنظیمات مخصوص خود را دارد. مهمترین بخشهای این فایل شامل موارد زیر است:
- Services: فهرست سرویسها و کانتینرهای پروژه
- Image یا Build: اجرای سرویس از یک ایمیج آماده یا ساخت آن از Dockerfile
- Ports: مشخص کردن پورتهایی که باید بین کانتینر و سیستم میزبان برقرار شود
- Volumes: محل ذخیرهسازی دادهها بهشکل پایدار
- Environment Variables: متغیرهای محیطی لازم برای اجرای سرویس
- Networks: شبکههایی که سرویسها روی آن با هم ارتباط میگیرند
وقتی دستور Docker-Compose Up اجرا میشود، چند مرحله پشت سر هم انجام میگیرد. اگر سرویس نیاز به ساخت ایمیج داشته باشد، Compose آن را میسازد یا اگر ایمیج وجود داشته باشد، آن را از مخزن دریافت میکند.
در مرحلهی بعد شبکههای تعریفشده ایجاد میشوند تا سرویسها بتوانند با هم ارتباط داشته باشند. سپس ولومها ساخته یا بازیابی میشوند تا دادهها هنگام توقف کانتینر از بین نروند. در نهایت، سرویسها براساس تنظیمات نوشتهشده در فایل YAML و با ترتیب مناسب شروع به کار میکنند.
دستورهای اصلی Docker Compose
Docker Compose مجموعهای از دستورهای کاربردی دارد که مدیریت سرویسها را ساده میکند. مهمترین آنها عبارتاند از:
- Docker-Compose Up: راهاندازی سرویسها براساس تنظیمات فایل YAML. با گزینهی -d در پسزمینه اجرا میشود.
- Docker-Compose Down: متوقفکردن سرویسها و حذف شبکهها و کانتینرهای ساختهشده.
- Docker-Compose Logs: نمایش لاگهای هر سرویس برای بررسی وضعیت اجرا.
- Docker-Compose Exec: اجرای یک دستور داخل یک سرویس فعال، مثل ورود به محیط شل کانتینر.
- Docker-Compose Scale: افزایش یا کاهش تعداد کانتینرهای یک سرویس برای اجرای نسخههای بیشتر از همان سرویس.
مزایای Docker Compose
پروژههایی که از چند سرویس تشکیل میشوند، برای اجرا و نگهداری به هماهنگی دقیق نیاز دارند. Docker Compose این هماهنگی را ساده میکند و همهی بخشهای پروژه را در یک ساختار مشخص قرار میدهد. در ادامه مهمترین مزایای آن را میبینید.
1. سادهسازی اجرای چند کانتینر در کنار هم
Compose امکان اجرای تمام سرویسهای یک پروژه را تنها با یک دستور فراهم میسازد، بدون آن که نیاز باشد هر کانتینر را جداگانه مدیریت کنید. این کار سرعت راهاندازی محیط و کارایی توسعهدهنده را بهطور چشمگیری افزایش میدهد.
2. هماهنگی سرویسها و کنترل ترتیب اجرا
برخی سرویسها باید قبل از بقیه شروع به کار کنند. برای نمونه پایگاه داده باید پیش از سرویس وب آماده باشد. Docker Compose این وابستگیها و ترتیب اجرا را مدیریت میکند تا کل سیستم بدون خطا و با هماهنگی کامل بالا بیاید.
3. تعریف سرویس، شبکه و ولومها در یک فایل YAML
تمام پیکربندیهای پروژه از جمله سرویسها، شبکهها و ولومهای ذخیرهسازی در یک فایل واحد قرار میگیرند. این ساختار یکپارچه، نگهداری و بهروزرسانی پروژه را سادهتر و شفافتر میکند.
4. تکرارپذیری کامل محیط در توسعه، تست و اجرا
با Compose میتوان محیطی مشابه برای توسعه، تست و حتا استقرار ایجاد کرد؛ بدون این که تفاوت در تنظیمات باعث بروز خطا شود. این تکرارپذیری، کیفیت و پایداری چرخهی توسعه را افزایش میدهد.
کاربردهای داکر کامپوز
Docker Compose در پروژههایی که از چند سرویس تشکیل شدهاند، نقش یک ابزار هماهنگکننده را دارد. این ابزار محیطی میسازد که در آن سرویسها سریعتر اجرا و ارتباط آنها با هم بدون پیچیدگی کنترل میشود. کاربردهای زیر نشان میدهند Compose در چه موقعیتهایی بیشترین ارزش را دارد.
1. راهاندازی سریع پروژه
وقتی پروژه به چند سرویس نیاز دارد، Compose همهی آنها را با یک دستور اجرا میکند. این روند زمان آمادهسازی محیط را کم کرده و امکان شروع سریع کار را فراهم میسازد.
2. پروژههای مبتنی بر میکروسرویس
در معماری میکروسرویس، هر بخش سیستم جداگانه اجرا میشود. Compose این سرویسها را کنار هم نگه میدارد و ارتباط آنها را از راه شبکهی داخلی هماهنگ میکند.
3. محیط توسعه محلی
توسعهدهنده میتواند همان محیطی را که در سرور اصلی اجرا میشود، روی سیستم خود بالا بیاورد. این کار مشکلات مربوط به تفاوت محیطها را کم میکند.
4. تستهای Integration
برای تست تعامل سرویسها، اجرای همهی آنها در کنار یکدیگر ضروری است. Compose این مجموعه را بهشکل یکجا فراهم میکند و امکان بررسی رفتار واقعی سیستم را میدهد.
Dev/Test Automation .5
در مراحل خودکارسازی توسعه و تست، Compose کمک میکند هر بار محیطی ثابت ساخته شود. به همین ترتیب، نتیجهی تستها را معتبرتر میشود.
6. پروژههای دارای چند سرویس وابسته
هرجا سرویسها به پایگاه داده، کش، صف پیام یا ابزارهای جانبی وابسته باشند، Compose این وابستگیها را یکجا مدیریت میکند تا همهی کارها بدون خطا اجرا شود.
مقیاسپذیری با Docker Compose
Docker Compose میتواند یک سرویس را با چند کانتینر اجرا کند تا ظرفیت بیشتری در اختیار پروژه قرار بگیرد. با تعیین تعداد مورد نیاز، نسخههای بیشتری از همان سرویس اجرا میشود و Compose آنها را هماهنگ نگه میدارد. این روش برای پروژههای کوچک و متوسط کافی است و نیاز به تنظیمات پیچیده ندارد.
در پروژههایی که سرویسها گستردهتر هستند و کنترل دقیق منابع لازم است، ابزارهای پیشرفتهتری استفاده میشود. پلتفرمهایی مانند Kubernetes یا سرویسهای کانتینر ابری مدیریت کاملتری برای مقیاس و توزیع بار ارایه میدهند.
محدودیتهای استفاده از Docker Compose
Docker Compose برای پروژههای کوچک تا متوسط انتخاب مناسبی است، اما در مقایسه با ابزارهای ارکستریشن پیشرفته محدودیتهایی دارد. این محدودیتها زمانی خود را نشان میدهند که حجم سرویسها بالا میرود یا پروژه نیاز به مدیریت پیچیدهتری دارد.
1. مناسب برای پروژههای کوچک و متوسط
Compose روی یک میزبان اجرا میشود و شاید برای پروژههایی که دهها سرویس دارند یا تحت بار سنگین قرار میگیرند، مناسب نباشد. در چنین شرایطی، مدیریت سرویسها، هماهنگی آنها و کنترل منابع دشوار میشود.
2. نبود امکانات کامل ارکستریشن
در سامانههای پیچیده، کنترل بار، بازیابی خودکار سرویسها، مدیریت منابع و نگهداری وضعیت سرویسها اهمیت بسیاری دارد. Compose چنین قابلیتهایی ارایه نمیدهد و تنها راهاندازی سرویسها را ساده میسازد. ابزارهایی مانند Kubernetes این ضعف را جبران میکنند.
3. اجرای محدود روی یک سرور
Compose توانایی توزیع سرویسها روی چند گره را ندارد و همه چیز روی یک سرور اجرا میشود. این موضوع ظرفیت مقیاسپذیری افقی را محدود میکند.
4. محدودیت در نظارت و مانیتورینگ سرویسها
Compose ابزار داخلی برای بررسی سلامت سرویسها یا مدیریت خطا ندارد. توسعهدهنده باید از ابزارهای جانبی برای مانیتورینگ استفاده کند تا از وضعیت سرویسها مطمین شود.
5. نبود امکان انتشار مرحلهای
در پروژههای بزرگ، نسخههای جدید باید مرحلهبهمرحله منتشر شوند تا هنگام بروز مشکل، بازگشت به نسخهی قبل ساده باشد. Compose چنین روندی را پشتیبانی نمیکند و تنها شروع و توقف سرویسها را انجام میدهد.
ساخت و اجرای یک پروژه با Docker Compose
برای درک بهتر روش کار Docker Compose، یک سناریوی ساده را بررسی میکنیم. فرض کنیم پروژه شامل یک سرویس وب و یک دیتابیس است. در حالت عادی اجرای هر سرویس باید جداگانه باشد و تنظیمات شبکه، پورت و وابستگیها بهشکل دستی کنترل شوند. Compose این فرآیند را خلاصه میکند و همه را در یک فایل YAML قرار میدهد.
1. تعریف سرویس وب و دیتابیس
در فایل docker-compose.yml دو سرویس تعریف میشود. اجرای سرویس وب از ایمیج یا فایل ساخت خودش است و پورت مشخصی را در اختیار کاربر قرار میدهد. سرویس دیتابیس نیز با تنظیمات لازم مانند یوزر، پسورد و محل ذخیرهی داده راهاندازی میشود. Compose وابستگی سرویس وب به دیتابیس را مدیریت میکند تا سرویسها با ترتیب درست بالا بیایند.
2. راهاندازی پروژه با Compose
پس از آماده شدن فایل YAML، اجرای پروژه فقط به یک دستور نیاز دارد. Compose براساس تنظیمات فایل، ایمیجها را میسازد، شبکهی داخلی میان سرویسها را شکل میدهد و هر سرویس را در محیط جداگانه اجرا میکند. نتیجه این است که هر دو سرویس همراه با تنظیمات درست و بدون نیاز به اجرای چند دستور مختلف در کنار هم فعال میشوند.
تفاوت Docker Compose با Docker و ابزارهای Orchestration
Docker Compose برای زمانی طراحی شده که چند سرویس در کنار هم اجرا میشوند و مدیریت آنها با دستورهای جداگانه دشوار است. در مقابل، اجرای Docker بهشکل عادی بیشتر برای یک یا چند کانتینر مستقل کاربرد دارد. در پروژههای بزرگتر نیز ابزارهای ارکستریشن مانند Kubernetes امکانات گستردهتری برای مقیاسپذیری و کنترل سرویسها ارایه میدهند. جدول زیر تفاوت این سه روش را نشان میدهد.
| ویژگی | Docker عادی | Docker Compose | ابزارهای Orchestration |
| تعداد سرویسها | مناسب کانتینرهای تکمنظوره | مناسب چند سرویس وابسته | مناسب مجموعههای بزرگ با سرویسهای زیاد |
| مدیریت تنظیمات | دستی و پراکنده | یکجا در فایل YAML | پیشرفته و مبتنی بر چند فایل و ساختارهای پیچیده |
| مقیاسپذیری | محدود | افزایش تعداد کانتینر در یک سرویس | مقیاسپذیری کامل و توزیع روی چند گره |
| هماهنگی سرویسها | کنترل دستی | هماهنگی خودکار در شبکهی داخلی | هماهنگی با سیاستهای دقیق و تنظیم شدنی |
| مناسب برای | پروژههای ساده | محیط توسعه و پروژههای کوچک تا متوسط | تولید، بار سنگین و سیستمهای گسترده |
جمعبندی
Docker Compose راهی ساده و سریع برای اجرای پروژههایی است که از چند سرویس وابسته تشکیل شدهاند. با یک فایل YAML میتوان سرویسها، شبکه و داده را کنار هم تعریف کرد و هر بار محیطی یکسان ساخت. این ویژگی در توسعه، تست و راهاندازی پروژههای کوچک تا متوسط ارزش بسیاری دارد و مدیریت سرویسها را بسیار سبکتر میکند.
در عین حال، Compose برای مقیاسهای بزرگ و سیستمهایی که نیاز به کنترل دقیق منابع، نظارت پیشرفته یا توزیع سرویسها روی چند گره دارند مناسب نیست. در چنین موقعیتی، انتخاب ابزارهای ارکستریشن مانند Kubernetes منطقیتر است. با این حال، برای بسیاری از پروژهها Compose همچنان یکی از موثرترین و کاربردیترین گزینهها برای اجرای چند کانتینر در کنار یکدیگر محسوب میشود.




