مدیریت سرویسهای چندکانتینری با Docker Compose
چرا به Docker Compose نیاز داریم؟
تا به اینجا یاد گرفتید که چطور برای هر سرویس یک دستور docker run اجرا کنید، برایش شبکه بسازید، والیوم متصل کنید و متغیرهای محیطی را پاس بدهید. اما فرض کنید یک برنامهی وب معمولی شامل بخشهای زیر باشد:
- یک سرویس فرانتاند (React)
- یک وبسرویس بکاند (Node.js یا FastAPI)
- یک پایگاه داده (PostgreSQL)
- یک کش موقت (Redis)
برای بالا آوردن این سیستم، باید هر بار ۴ دستور طولانی docker run با دهها فلگ و پارامتر بنویسید، مراقب ترتیب اجرای آنها باشید و اگر سرور ریستارت شد همه را دوباره دستی اجرا کنید!
در هفتهی چهارم با تفاوت رویکرد Imperative (دستوری) و Declarative (توصیفی) آشنا شدید. Docker Compose ابزاری Declarative است که به شما اجازه میدهد کل معماری چندکانتینری پروژه را در یک فایل متنی با فرمت YAML (به نام compose.yaml) تعریف کنید و مجموعهی سرویسها را با دستوراتی یکپارچه مدیریت و اجرا نمایید.
ساختار فایل compose.yaml
طبق استاندارد مدرن Compose Specification، نام پیشفرض فایل compose.yaml است (اگرچه نام قدیمی docker-compose.yml نیز همچنان پشتیبانی میشود).
یک فایل استاندارد از بخشهای زیر تشکیل شده است:
تحلیل بخشهای کلیدی:
services: کانتینرهایی که باید اجرا شوند. در مثال بالا دو سرویسdbوwebداریم.imageدر مقابلbuild: برای دیتابیس مستقیماً ایمیج آماده را از داکر هاب دانلود میکنیم (image)، اما برای وبسرویس، داکر آن را از روی Dockerfile محلی بیلد میکند (build).- ارتباط شبکه و کشف خودکار: هر دو سرویس به شبکهی
backend-netمتصل هستند. سرویسwebبدون نیاز به دانستن IP دیتابیس، مستقیماً از نام سرویس یعنیdbبهعنوان آدرس میزبان استفاده میکند (DATABASE_HOST: db). ports: پورت8080هاست به پورت80کانتینر وب متصل شده است. دقت کنید که پورت دیتابیس را اصلاً به سیستم میزبان باز نکردیم تا از بیرون در دسترس نباشد و امنیت حفظ شود!depends_on: ترتیب روشن شدن سرویسها را تعیین میکند؛ ابتداdbو سپسwebاجرا خواهد شد.volumesوnetworksسراسری: تعریف والیوم ماندگارdb_dataو شبکهی ایزولهیbackend-net.
مدیریت متغیرهای محیطی با فایلهای .env و env_file
هرگز کلمات عبور و متغیرهای حساس را مستقیماً داخل فایل compose.yaml هاردکد نکنید. Docker Compose روشهای منعطفی برای تزریق متغیرهای محیطی در اختیارتان قرار میدهد:
۱. جایگزینی متغیرها در فایل Compose با فایل پیشفرض .env
داکر کامپوز بهصورت پیشفرض و خودکار فایلی به نام .env را در همان دایرکتوری جستوجو کرده و مقادیر آن را در متغیرهای ${VARIABLE} جایگزین (Interpolate) میکند:
فایل .env:
فایل compose.yaml:
۲. تزریق مستقیم فایل env به داخل کانتینر با env_file
گاهی نمیخواهید تکتک متغیرها را در بخش environment فایل YAML لیست کنید، بلکه میخواهید دهها متغیر را مستقیماً از یک فایل مجزا وارد محیط کانتینر کنید. برای این کار از کلید env_file استفاده میشود:
در این حالت، تمام خطوط داخل .env.web مستقیماً بهعنوان متغیر محیطی داخل کانتینر web در دسترس خواهند بود.
۳. استفاده از فایلهای سفارشی با فلگ --env-file (محیطهای مختلف: Dev، Staging، Prod)
در پروژههای واقعی، تنظیمات دیتابیس و متغیرها در محیط توسعه (Local) با محیط تست یا پروداکشن متفاوت است. بهجای داشتن چندین فایل Compose، میتوانید فایلهای متغیر اختصاصی (Custom Env Files) بسازید:
.env.development.env.staging.env.production
برای مشخص کردن این فایل سفارشی در دستورات Compose، از فلگ --env-file استفاده کنید:
همچنین میتوانید برای اعتبارسنجی مقادیر جایگزینشده قبل از اجرا، دستور زیر را بزنید:
این دستور خروجی نهایی و ترکیبشدهی فایل YAML را با متغیرهای پرشده در ترمینال نمایش میدهد.
دستورهای پرکاربرد Docker Compose CLI
در نگارش مدرن داکر (Docker Compose V2)، دستورات با خط فاصلهی فاصله (docker compose) اجرا میشوند (بهجای ابزار پایتونی قدیمی docker-compose).
۱. راهاندازی و اجرای کل پشته (Stack)
۲. بررسی وضعیت سرویسها
۳. بررسی لاگهای یکپارچه
۴. اجرای دستور داخل کانتینر سرویس
۵. خاموش کردن و جمعآوری پشته
بررسی سلامت سرویسها (Healthchecks)
دستور depends_on بهتنهایی فقط مطمئن میشود که پردازش دیتابیس استارت خورده است، اما پردازش دیتابیس چند ثانیه طول میکشد تا آمادهی پذیرش اتصال (Ready for connections) شود.
برای رفع این مشکل، از healthcheck استفاده میشود:
با این تنظیم هوشمند، سرویس web تا زمانی که دیتابیس کاملاً آماده و سالم (healthy) نشده باشد، استارت نمیخورد.
منابع یادگیری
ویدیو
- Ultimate Docker Compose Tutorial — TechWorld with Nana — آموزش جامع و عملی Docker Compose، ساختار فایلهای YAML و سناریوهای چندکانتینری
مستندات و مقالات
- Docker Compose Getting Started — Official Docs — راهنمای رسمی شروع سریع و پروژهمحور با Docker Compose
- What is Docker Compose & How to Use It — freeCodeCamp — راهنمای جامع و گامبهگام کار با Docker Compose برای مبتدیان