Docker Compose چیست؟
Docker Compose ابزاری برای تعریف و مدیریت چندین Container و سرویس مرتبط با یکدیگر است. با استفاده از یک فایل Compose میتوان مشخصات سرویسها، Imageها، Portها، Volumeها و سایر تنظیمات موردنیاز را در یک مکان تعریف کرد و سپس مجموعه سرویسها را بهصورت یکپارچه اجرا و مدیریت کرد.
به عنوان مثال، یک برنامه ممکن است شامل Application، Nginx و PostgreSQL باشد. به جای مدیریت جداگانه هر Container، میتوان همه این سرویسها را در یک فایل Compose تعریف کرد و با یک دستور آنها را اجرا کرد.
مزایای Docker Compose
ویژگی | مدیریت دستی با Docker | استفاده از Docker Compose |
اجرای چند Container | نیاز به اجرای جداگانه هر Container دارد | تمام سرویسهای تعریفشده با یک دستور اجرا میشوند |
تنظیمات | تنظیمات در دستورات مختلف قرار میگیرند | تنظیمات در یک فایل Compose متمرکز هستند |
مدیریت سرویسها | هر Container باید جداگانه مدیریت شود | سرویسهای یک پروژه بهصورت یکپارچه مدیریت میشوند |
اجرای مجدد پروژه | نیاز به اجرای دوباره دستورات مختلف دارد | با docker compose up بهسادگی اجرا میشود |
توقف سرویسها | باید Containerها را جداگانه متوقف کرد | با docker compose down مجموعه پروژه مدیریت میشود |
قابلیت تکرار | راهاندازی مجدد محیط میتواند زمانبر باشد | فایل Compose امکان ایجاد یک محیط مشابه و قابل تکرار را فراهم میکند |
مناسب برای | پروژههای ساده با یک یا چند Container | پروژههای چندسرویسی و پیچیدهتر |
مثال عملی Docker Compose
برای درک بهتر نحوه کار Docker Compose، یک پروژه ساده شامل دو سرویس Nginx و PostgreSQL ایجاد میکنیم. هدف این مثال این است که ببینیم چگونه میتوان چند Container را در یک فایل تعریف و با یک دستور اجرا کرد.
1. ایجاد پوشه پروژه
ابتدا یک پوشه برای پروژه ایجاد میکنیم:
mkdir docker-compose-example cd docker-compose-example
2. ایجاد فایل Compose
در این پوشه یک فایل به نام compose.yaml ایجاد میکنیم:
nano compose.yaml
و مشخصات سرویس هایی که میخوایم را درون فایل قرار می دهیم:
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: mypasswordd
در این فایل دو سرویس تعریف کردهایم:
- web از Image مربوط به Nginx استفاده میکند.
- db از Image مربوط به PostgreSQL استفاده میکند.
همچنین برای Nginx پورت 8080 سیستم را به پورت 80 داخل Container متصل کردهایم و برای PostgreSQL یک Password مشخص کردهایم.
3. اجرای سرویسها
حالا کافی است دستور زیر را اجرا کنیم:
docker compose up -d
Docker Compose فایل compose.yaml را میخواند، Imageهای موردنیاز را دریافت میکند و Containerهای مربوط به سرویسهای تعریفشده را ایجاد و اجرا میکند.
4. بررسی وضعیت سرویسها
برای مشاهده وضعیت سرویسهای این پروژه:
docker compose ps
خروجی چیزی شبیه زیر خواهد بود:
NAME IMAGE STATUS docker-compose-web-1 nginx Up docker-compose-db-1 postgres:16 Up
5. متوقف کردن پروژه
برای متوقف کردن و حذف Containerهای این پروژه:
docker compose down
با این دستور Containerهای ایجادشده توسط Compose متوقف و حذف میشوند، اما Imageها حذف نمیشوند.
6.اجرای container با docker compose:
docker compose exec web bash
Docker Volume چیست؟
ممکن است این سؤال پیش بیاید که اگر Containerها موقتی هستند و با دستور docker compose down حذف میشوند، اطلاعات و دادههایی که داخل آنها ایجاد کردهایم کجا ذخیره میشوند؟
بهصورت پیشفرض، دادههایی که فقط داخل فایلسیستم خود Container قرار دارند، همراه با حذف Container از بین میروند. بنابراین برای اطلاعات مهم و دائمی، مانند اطلاعات یک Database، نباید به فایلسیستم خود Container وابسته باشیم.
اینجاست که مفهوم Docker Volume مطرح میشود. Volume محلی برای نگهداری دادهها در خارج از چرخه عمر Container فراهم میکند؛ به این ترتیب حتی اگر Container حذف و دوباره ایجاد شود، دادههای ذخیرهشده در Volume میتوانند باقی بمانند.

مثال عملی Docker Volume
Volume را در compose.yaml که در مثال قبل داشتیم تعریف میکنیم:
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- nginx-data:/usr/share/nginx/html
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: mypassword
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
، برای اینکه بفهمی Volume درست ساخته شده و در حال استفاده است، چند دستور ساده داری:
docker volume ls
باید Volumeای که در compose.yaml تعریف کردی را ببینی، مثلاً:
DRIVER VOLUME NAME
local my-compose_postgres-data
برای اینکعه ببینیم Container به Volume وصل است:
docker inspect my-compose-db-1
در خروجی دنبال بخش Mounts بگرد. اگر Volume درست متصل شده باشد، چیزی شبیه این میبینی:
"Mounts": [
{
"Type": "volume",
"Name": "my-compose_postgres-data",
"Destination": "/var/lib/postgresql/data"
}
]