استقرار اپلیکیشن‌های چندکانتینری با Docker Compose

برنامه‌های مدرن اغلب از چند سرویس به‌هم‌متصل ساخته می‌شوند، نه یک کانتینر واحد، که این موضوع استقرار دستی را پیچیده و مستعد خطا می‌کند. این مقاله توضیح می‌دهد که Docker Compose چگونه با استفاده از یک فایل YAML ساده، یک اپلیکیشن چندکانتینری را تعریف، مستقر و مدیریت می‌کند، آن هم با یک دستور واحد.

Docker ComposeCompose Fileمیکروسرویس

~4 دقیقه مطالعه · آخرین به‌روزرسانی ۱۴ شهریور ۱۴۰۵

مقدمه

برنامه‌های ابرمحور مدرن معمولاً از چند سرویس کوچک و به‌هم‌متصل ساخته می‌شوند، نه یک برنامه یکپارچه — معماری‌ای که میکروسرویس (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ای را که یک اپلیکیشن به آن وابسته است مستند می‌کند، به‌عنوان مستندات زنده و ارزشمندی نیز عمل می‌کند که به کاهش فاصله میان تیم‌های توسعه و عملیات کمک می‌کند.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

داکر چگونه از فناوری‌های امنیتی لینوکس استفاده می‌کند

مدل امنیتی داکر بر پایه دفاع چندلایه ساخته شده و فناوری‌های شناخته‌شده kernel لینوکس را با تنظیمات پیش‌فرض معقول ترکیب می‌کند. این مقاله توضیح می‌دهد که namespaceها، control groupها، capabilityها، Mandatory Access Control و seccomp چگونه در کنار هم کانتینرها را ایزوله و ایمن می‌کنند.

ادامه

مدیریت داده‌های ماندگار در داکر با Volume

کانتینرها به‌طور پیش‌فرض یک لایه نوشتنی موقت دریافت می‌کنند که با حذف کانتینر از بین می‌رود — این برای داده‌های موقتی خوب است، اما برای هر چیزی که ارزش نگهداری دارد ریسک‌آور است. این مقاله توضیح می‌دهد که volumeهای داکر چگونه داده‌های ماندگار را از چرخه حیات کانتینر جدا می‌کنند و نحوه ساخت، استفاده و اشتراک‌گذاری امن آن‌ها را بررسی می‌کند.

ادامه

شبکه‌های Overlay در داکر چگونه کار می‌کنند؛ نگاهی به VXLAN

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

ادامه

اتصال کانتینرهای داکر به VLAN و توزیع بار با Swarm

فراتر از شبکه‌های ساده bridge، داکر امکاناتی برای اتصال مستقیم کانتینرها به VLANهای فیزیکی موجود، تفکیک خودکار نام سرویس‌ها و توزیع ترافیک در سراسر یک کلاستر Swarm ارائه می‌دهد. این مقاله درایور macvlan، سرویس داخلی Service Discovery و مکانیزم Ingress Load Balancing در Swarm را بررسی می‌کند.

ادامه

شبکه‌سازی در داکر؛ آشنایی با CNM، Libnetwork و شبکه‌های Bridge

شبکه‌سازی در داکر بر پایه یک طراحی باز به نام Container Network Model ساخته شده که توسط libnetwork پیاده‌سازی و با درایورهای قابل‌جایگزینی گسترش می‌یابد. این مقاله تئوری پشت شبکه داکر را بررسی کرده و نحوه ساخت و تست شبکه‌های bridge تک‌هاست، از جمله تفکیک نام و نگاشت پورت را توضیح می‌دهد.

ادامه

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

Docker Swarm گروهی از نودهای داکر را به یک کلاستر امن و بسیار در دسترس با قابلیت ارکستریشن داخلی تبدیل می‌کند. این مقاله ساخت یک swarm چندنودی، استقرار یک اپلیکیشن میکروسرویس به‌صورت اعلانی و انجام به‌روزرسانی‌های تدریجی بدون از دست دادن سازگاری با وضعیت مطلوب را بررسی می‌کند.

ادامه
استقرار اپلیکیشن‌های چندکانتینری با Docker Compose | دکتر شاهین صیامی