مقدمه
برنامههای ابرمحور مدرن معمولاً از چند سرویس کوچک و بههممتصل ساخته میشوند، نه یک برنامه یکپارچه — معماریای که میکروسرویس (Microservices) نامیده میشود. مدیریت دستی چند کانتینر مرتبط با دستورات جداگانه docker بهسرعت پیچیده میشود. Docker Compose، که اغلب بهاختصار Compose نامیده میشود، این مشکل را با امکان توصیف کل یک اپلیکیشن در یک فایل YAML واحد و استقرار آن با یک دستور حل میکند.
پیشینه
Compose در ابتدا ابزاری به نام Fig بود که توسط Orchard Labs برای سادهسازی استقرار اپلیکیشنهای چندکانتینری روی داکر ساخته شد. شرکت Docker, Inc. بعداً Orchard Labs را خرید، این ابزار را با نام Docker Compose تغییر برند داد و در نهایت آن را مستقیماً به CLI داکر بهعنوان زیردستور docker compose اضافه کرد. Compose همچنین توسط یک Compose Specification باز و جامعهمحور هدایت میشود، و Docker Compose پیادهسازی مرجع آن است.
تمام نسخههای مدرن داکر شامل Compose بهصورت ازپیشنصبشده هستند و وجود آن با دستور زیر قابل بررسی است:
docker compose versionساختار یک فایل Compose
یک فایل Compose، که معمولاً compose.yaml نام دارد، سرویسها، شبکهها و volumeهای یک اپلیکیشن را تعریف میکند. یک مثال معمول، یک سرویس web front-end و یک بکاند Redis را تعریف میکند که از طریق یک شبکه مشترک به هم متصلاند و Redis از یک volume ماندگار استفاده میکند:
services:
web-fe:
build: .
command: python app.py
ports:
- target: 8080
published: 5001
networks:
- counter-net
redis:
image: "redis:alpine"
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /app
networks:
counter-net:
volumes:
counter-vol:کلید services هر میکروسرویس را تعریف میکند، از جمله نحوه ساخت یا دریافت ایمیج، دستوری که باید اجرا شود، پورتهایی که باید expose شوند و شبکهای که باید به آن متصل شود. کلیدهای networks و volumes منابع مشترکی را که سرویسها میتوانند به آن متصل شوند یا mount کنند تعریف میکنند. از آنجا که هر دو سرویس به یک شبکه مشترک متصلاند، میتوانند یکدیگر را با نام سرویس شناسایی و با هم ارتباط برقرار کنند — برای مثال، برنامه وب فقط با ارجاع به redis بهعنوان hostname به Redis متصل میشود.
استقرار اپلیکیشن
رایجترین روش استقرار یک اپلیکیشن Compose دستور زیر است:
docker compose up --detachاین دستور واحد، هر ایمیج موردنیاز را میسازد یا دریافت میکند، شبکهها و volumeهای تعریفشده را ایجاد میکند و تمام کانتینرهای تعریفشده را راهاندازی میکند. داکر منابع حاصل را با ترکیبی از نام پروژه — که از نام دایرکتوری build context گرفته میشود — و نام سرویس، مانند multi-container-web-fe-1، نامگذاری میکند.
میتوان نام یا مسیر سفارشی فایل Compose را با فلگ -f مشخص کرد:
docker compose -f apps/ddd-book/sample-app.yml up --detachمدیریت چرخه حیات اپلیکیشن
پس از استقرار، یک اپلیکیشن Compose را میتوان با مجموعهای کوچک از زیردستورهای اختصاصی مدیریت کرد. docker compose ps کانتینرهای در حال اجرا و وضعیت آنها را فهرست میکند، در حالی که docker compose top فرآیندهای در حال اجرا داخل هر کانتینر را نشان میدهد.
docker compose stop
docker compose restartتوقف یک اپلیکیشن، کانتینرها، شبکهها و volumeهای آن را دستنخورده باقی میگذارد، بنابراین راهاندازی مجدد آن دقیقاً از همان نقطه ادامه مییابد — از جمله هر دادهای که در یک volume ذخیره شده است. بررسی وضعیت کلی اپلیکیشن با دستور زیر انجام میشود:
docker compose lsپاکسازی
برای حذف کامل یک اپلیکیشن، از جمله volumeها و ایمیجهای آن، میتوان از دستور زیر استفاده کرد:
docker compose down --volumes --rmi allبهطور پیشفرض، docker compose down فقط کانتینرها و شبکهها را حذف میکند و volumeها و ایمیجها را دستنخورده باقی میگذارد — یک محافظت در برابر از دست رفتن ناخواسته دادههای ذخیرهشده.
نتیجهگیری
Docker Compose آنچه را که در غیر این صورت مجموعهای از دستورات شکننده و اجراشده بهصورت دستی بود، به یک تعریف واحد و قابل نگهداری در سیستم کنترل نسخه از یک اپلیکیشن تبدیل میکند. از آنجا که یک فایل Compose هر سرویس، ایمیج، پورت، شبکه و volumeای را که یک اپلیکیشن به آن وابسته است مستند میکند، بهعنوان مستندات زنده و ارزشمندی نیز عمل میکند که به کاهش فاصله میان تیمهای توسعه و عملیات کمک میکند.