راهنمای کامل Docker Compose
از اجرای دستی دستورات Docker برای هر سرویس دست بردارید.
اگر یک اپلیکیشن مدرن را اجرا میکنید، احتمالاً یک frontend، یک backend، یک database و یک cache دارید. اجرای تکبهتک آنها کند و مستعد خطا است.
Docker Compose این مشکل را حل میکند. شما کل پشته (stack) خود را در یک فایل YAML تعریف میکنید و همه چیز را با یک دستور اجرا میکنید.
اصول اولیه
- بدون Compose: شما چهار دستور جداگانه را برای چهار کانتینر اجرا میکنید.
- با Compose: شما دستور "docker compose up" را اجرا میکنید و همه چیز شروع به کار میکند.
مفاهیم مهم
• سرویسها (Services): هر سرویس نشاندهنده یک کانتینر است. میتوانید از "build" برای کد خودتان یا از "image" برای ابزارهای از پیش ساخته شده مانند PostgreSQL یا Redis استفاده کنید. • نگاشت پورت (Port Mapping): از فرمت HOST:CONTAINER استفاده کنید. این کار پورت کامپیوتر شما را به پورت کانتینر متصل میکند. • متغیرهای محیطی (Environment Variables): از "environment" برای مقادیر ساده یا از "env_file" برای نگهداری اطلاعات حساس (secrets) در یک فایل جداگانه .env استفاده کنید. • والیومها (Volumes): از volumes برای ایمن نگه داشتن دادههای خود استفاده کنید. بدون volumes، دادههای دیتابیس شما با متوقف شدن کانتینر از بین میروند. • شبکهها (Networks): Compose به طور خودکار یک شبکه ایجاد میکند. کانتینرها به جای localhost، با استفاده از نام سرویسهای خود با یکدیگر ارتباط برقرار میکنند. • depends_on: این دستور ترتیب اجرا را تعیین میکند. به Docker میگوید که دیتابیس را قبل از backend اجرا کند. توجه داشته باشید که این دستور منتظر نمیماند تا دیتابیس کاملاً آماده به کار شود.
نکات مصاحبهای
- چه زمانی از build در مقابل image استفاده کنیم؟ از "build" برای اپلیکیشن سفارشی خود استفاده کنید. از "image" برای ابزارهای موجود در Docker Hub استفاده کنید.
- کانتینرها چگونه با هم ارتباط برقرار میکنند؟ آنها از نام سرویسها به عنوان hostname در شبکه Docker استفاده میکنند.
- چگونه از دست رفتن دادهها را جلوگیری کنیم؟ همیشه برای دیتابیسها از named volumes استفاده کنید.
- چگونه اطلاعات حساس (secrets) را مدیریت کنیم؟ هرگز آنها را به صورت hardcode در کد قرار ندهید. از یک فایل .env استفاده کنید.
اشتباهات رایج که باید از آنها اجتناب کرد
- استفاده از تگ "latest": این کار باعث بهروزرسانیهای غیرمنتظره میشود. از نسخههای مشخص مانند "postgres:16" استفاده کنید.
- استفاده از localhost: کانتینرها نمیتوانند از طریق localhost یکدیگر را ببینند. از نام سرویس استفاده کنید.
- عدم استفاده از healthchecks: از healthchecks برای نظارت بر اینکه آیا سرویس شما واقعاً آماده کار است یا خیر، استفاده کنید.
منبع: https://dev.to/adityaguptareal/docker-compose-complete-guide-1gac