Skip to Content

 

`


Docker Compose and Volume

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"
    }
]