Docker Compose چند کانتینر را با یک فایل تعریف و بالا میآورد. برای اپهایی که وبسرور، دیتابیس و worker دارند Compose معمولاً سادهترین نقطه شروع است.
ساختار سرویسها
services:
web:
build: .
ports: ['8080:80']
env_file: .env
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
volumes: ['pgdata:/var/lib/postgresql/data']
healthcheck:
test: ['CMD-SHELL', 'pg_isready']
volumes:
pgdata:
هر سرویس یک کانتینر منطقی است. ports انتشار به میزبان است. volumes داده پایدار میسازد. env_file برای تنظیمات غیرحساس/نیمهحساس؛ secretهای واقعی بهتر است از سازوکار secret مدیریت شوند.
شبکه و کشف سرویس
Compose یک شبکه پیشفرض میسازد و سرویسها با نام DNS داخلی هم را میبینند؛ مثلاً host دیتابیس میشود db. اشتباه رایج استفاده از localhost داخل کانتینر برای رسیدن به سرویس دیگر است.
healthcheck و ترتیب شروع
depends_on بهتنهایی منتظر ready بودن اپ نمیماند مگر با condition و healthcheck. برای دیتابیسها healthcheck ضروری است تا migration روی دیتابیس نیمهآماده اجرا نشود.
عملیات روزمره
docker compose up -d
docker compose ps
docker compose logs -f web
docker compose down
در محیطهایی با محدودیت رجیستری، ایمیجها را از قبل کش کنید و از تگ latest بپرهیزید. تگ ثابت قابلیت بازتولید build را بالا میبرد.
اگر میخواهید بعد از یادگیری این مفاهیم، مسیر استقرار را سریعتر جلو ببرید، میتوانید از پروژه ابری هوشمند هوشگراف هم استفاده کنید؛ اما مبانی این مقاله مستقل از هر پلتفرمی برای کار روزمره مفید است.
نکات عملی بیشتر درباره Docker Compose
وقتی روی Docker Compose کار میکنید، مهمترین اصل این است که هر تغییر را قابلبرگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط بهخاطر عجله و نبود چکلیست ساده رخ میدهند.
یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.
در محیطهای ایران، محدودیت شبکه، latency رجیستری و قطعی لحظهای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.
اشتباهات رایجی که باید از آنها دوری کنید
- کپیکردن دستور از اینترنت بدون فهم پارامترها
- اجرای دستور مخرب روی production بدون بکاپ
- نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
- تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
- ذخیره secret داخل ریپو یا اسکریپتهای عمومی
چکلیست جمعبندی
قبل از بستن کار روی Docker Compose، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان میدهد؟ آیا دسترسیها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمامشده فرض نکنید.
یادگیری عمیق زمانی رخ میدهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه میکنید. این چرخه از دهها دوره آموزشی سطحی مؤثرتر است.
نکات عملی بیشتر درباره Docker Compose
وقتی روی Docker Compose کار میکنید، مهمترین اصل این است که هر تغییر را قابلبرگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط بهخاطر عجله و نبود چکلیست ساده رخ میدهند.
یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.
در محیطهای ایران، محدودیت شبکه، latency رجیستری و قطعی لحظهای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.
اشتباهات رایجی که باید از آنها دوری کنید
- کپیکردن دستور از اینترنت بدون فهم پارامترها
- اجرای دستور مخرب روی production بدون بکاپ
- نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
- تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
- ذخیره secret داخل ریپو یا اسکریپتهای عمومی
چکلیست جمعبندی
قبل از بستن کار روی Docker Compose، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان میدهد؟ آیا دسترسیها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمامشده فرض نکنید.
یادگیری عمیق زمانی رخ میدهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه میکنید. این چرخه از دهها دوره آموزشی سطحی مؤثرتر است.
نکات عملی بیشتر درباره Docker Compose
وقتی روی Docker Compose کار میکنید، مهمترین اصل این است که هر تغییر را قابلبرگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط بهخاطر عجله و نبود چکلیست ساده رخ میدهند.
یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.
در محیطهای ایران، محدودیت شبکه، latency رجیستری و قطعی لحظهای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.
اشتباهات رایجی که باید از آنها دوری کنید
- کپیکردن دستور از اینترنت بدون فهم پارامترها
- اجرای دستور مخرب روی production بدون بکاپ
- نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
- تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
- ذخیره secret داخل ریپو یا اسکریپتهای عمومی
چکلیست جمعبندی
قبل از بستن کار روی Docker Compose، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان میدهد؟ آیا دسترسیها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمامشده فرض نکنید.
یادگیری عمیق زمانی رخ میدهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه میکنید. این چرخه از دهها دوره آموزشی سطحی مؤثرتر است.
نکات عملی بیشتر درباره Docker Compose
وقتی روی Docker Compose کار میکنید، مهمترین اصل این است که هر تغییر را قابلبرگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط بهخاطر عجله و نبود چکلیست ساده رخ میدهند.
یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.
در محیطهای ایران، محدودیت شبکه، latency رجیستری و قطعی لحظهای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.
نظرات
هنوز نظری ثبت نشده. دیدگاهتان را بنویسید.