نحوه استفاده از داکر کامپوز #
Docker Compose ابزاری برای هماهنگسازی چند کانتینری برای یک میزبان واحد است. این ابزار از موتور Docker برای مدیریت و هماهنگسازی کانتینرهای Docker استفاده میکند. این ابزار با فراهم کردن امکان ایجاد کانتینرهای پیچیده و به هم پیوسته به صورت اعلانی، محیط توسعه محلی شما را ساده میکند. Docker Compose همچنین با ارائه یک محیط موقت و ایزوله برای آزمایش، مجموعه تست را در فرآیند CI/CD خودکار میکند.
این مقاله نحوه استفاده از Docker Compose برای ایجاد و مدیریت کانتینرها را توضیح میدهد. اصول اولیه دستور docker composeو نحوه ایجاد compose.yamlمانیفست را پوشش میدهد. همچنین پروفایل Docker Compose را برای اجرای کانتینرها بسته به محیط شما بررسی میکند.
توضیحات کوتاه #
در زیر چند دستور اساسی Docker Compose که روی یک فایل compose.yamlor عمل میکنند، آورده شده است.docker-compose.yaml
# Create/build and start all services in the background.
$ docker compose up -d
# Stop and remove all service containers, networks, and volumes.
$ docker compose down
# Stop all services.
$ docker compose stop
# Start and run stopped services.
$ docker compose start
# View the status of running services.
$ docker compose ps
# Check the logs of all services.
$ docker compose logsیک فایل Docker Compose ایجاد کنید #
این بخش به ایجاد یک فایل نمونه Docker Compose compose.yamlبرای یک برنامه نمونه flask میپردازد.
- نمونه برنامه را دانلود کنید.console
$ git clone https://github.com/ndlrfz/flask-redis-postgresql - به
flask-redis-postgresqlدایرکتوری پروژه بروید.console$ cd flask-redis-postgresql
- این دایرکتوری حاوی فایلی
compose.yamlبا محتوای زیر است.console$ cat compose.ymlمانیفست Docker Compose زیر را مشاهده خواهید کرد:
yamlname: myproject services: redis: image: "redis:alpine" restart: always ports: - ۶۳۷۹:۶۳۷۹ volumes: - redis:/data postgresql: image: "postgres:16-alpine" ports: - "۵۴۳۲:۵۴۳۲" volumes: - pgdata:/var/lib/postgresql/data environment: POSTGRES_USER: ${DATABASE_USER} POSTGRES_PASSWORD: ${DATABASE_PASSWORD} POSTGRES_DB: ${DATABASE_NAME} flask: build: . restart: always env_file: - ".env" depends_on: - redis - postgresql ports: - "۸۰۰۰:۵۰۰۰" volumes: - ./:/code volumes: redis: driver: "local" pgdata: driver: "local"
در این فایل،
name: نام پروژه را روی تنظیم میکندmyproject.services: کانتینرهای منفردی را که برنامه شما را تشکیل میدهند، تعریف میکند.redisسرویس را با این جزئیات تعریف کنید :image: سرویس را از رویredis:alpineتصویر ایجاد میکند.restart: always: سیاستی را تنظیم میکند که در صورت توقف، این کانتینر همیشه مجدداً راهاندازی شود.portsپورت۶۳۷۹روی میزبان را به پورت۶۳۷۹داخل کانتینر نگاشت میکند.volumes: برای دادههای ماندگار، والیوم نامگذاری شده راredisبه/dataدایرکتوری داخل کانتینر متصل میکند.
postgresqlسرویس را با موارد زیر تعریف کنید :image: سرویس را از رویpostgres:16-alpineتصویر ایجاد میکند.portsپورت۵۴۳۲روی میزبان را به پورت۵۴۳۲داخل کانتینر نگاشت میکند.volumes: برای دادههای ماندگار، والیوم نامگذاری شده راpgdataدر دایرکتوری نصب میکند./var/lib/postgresql/dataenvironmentمتغیرهای محیطی داخل کانتینر را تنظیم میکند. مقادیر مربوط به${DATABASE_USER}،${DATABASE_PASSWORD}، و${DATABASE_NAME}از محیط پوسته شما جایگزین میشوند (که اغلب از یک.envفایل بارگذاری میشود).
- سرویس برنامه را
flaskبا موارد زیر تعریف کنید:build: .: یک تصویر داکر در دایرکتوری فعلی از فایلDockerfile. میسازد.restart: always: سیاستی را تنظیم میکند که در صورت توقف، این کانتینر همیشه مجدداً راهاندازی شود.env_fileمتغیرهای محیطی سرویس را مستقیماً از یک.envفایل بارگذاری میکند.depends_on: ترتیب راهاندازی را کنترل میکند.flaskسرویس فقط پس از شروع سرویسهایredisو شروع میشود.postgresqlportsپورت۸۰۰۰روی میزبان را به پورت۵۰۰۰داخل کانتینر نگاشت میکند.volumes: دایرکتوری پروژه فعلی روی میزبان را به/codeدایرکتوری داخل کانتینر متصل میکند.
volumes: دو volume نامگذاری شده تعریف میکند،redisوpgdata، با استفاده ازlocalدرایور. اینها توسط Docker مدیریت شده و در دستگاه میزبان ذخیره میشوند.
- یک فایل ایجاد کنید
.env.console$ nano .envمتغیرهای محیطی زیر را برای اعتبارنامههای PostgreSQL اضافه کنید. میتوانید جزئیات زیر را با اعتبارنامههای خود جایگزین کنید.
iniDATABASE_USER=app_user DATABASE_PASSWORD=app_password DATABASE_NAME=appdb DATABASE_HOST=postgresql DATABASE_PORT=۵۴۳۲
فایل را ذخیره کرده و از آن خارج شوید.
- خدمات خود را بسازید و شروع کنید.console
$ docker compose up -dاین گزینه
-dبه شما امکان میدهد کانتینرها را در پسزمینه اجرا کنید. - دستور زیر را اجرا کنید تا کانتینرها یا سرویسهای در حال اجرا را بررسی کنید.console
$ docker compose psخروجی:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS myproject_flask-1 myproject_flask "flask run --debug" flask About a minute ago Up About a minute 0.0.0.0:8000->5000/tcp, [::]:8000->5000/tcp myproject_postgresql-1 postgres:16-alpine "docker-entrypoint.s…" postgresql About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp myproject_redis-1 redis:alpine "docker-entrypoint.s…" redis About a minute ago Up 32 seconds 0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcpتوضیح خروجی:
flaskسرویس روی پورت۸۰۰۰روی دستگاه میزبان اجرا میشود که بر اساس تصویر داکر استmyproject_flask.postgresql۵۴۳۲سرویسی که بر اساس تصویر داکر روی پورت اجرا میشودpostgres:16-alpine.redis۶۳۷۹سرویس بر اساس تصویر داکر روی پورت اجرا میشودredis:alpine.
- لیست تصاویری که توسط سرویسهای شما استفاده میشوند را بررسی کنید.کنسول
$ docker compose imagesخروجی:
CONTAINER REPOSITORY TAG IMAGE ID SIZE myproject_flask-1 myproject_flask latest 1c3d151b6276 254MB myproject_postgresql-1 postgres 16-alpine b56133b65cd3 275MB myproject_redis-1 redis alpine d470ca4bc10c 60.5MB - یک مرورگر وب باز کنید و
http://<SERVER-IP>:8000/برای تأیید اجرای برنامه خود، به این آدرس مراجعه کنید.
مدیریت Docker Compose #
جدول زیر docker composeدستورات رایج برای مدیریت پشته برنامه شما را شرح میدهد.
| فرمان | توضیحات | مثال |
|---|---|---|
build | ساخت یا بازسازی کانتینرها | docker compose build |
up | ایجاد و شروع کانتینرها | docker compose up -d |
down | ظروف را متوقف کرده و بردارید | docker compose down |
start | شروع کانتینرهای موجود | docker compose start app |
stop | ظروف را متوقف کنید | docker compose stop app |
kill | ظروف توقف اجباری | docker compose kill app |
ps | بررسی کانتینرهای در حال اجرا | docker compose ps |
logs | لاگها را برای کانتینرها بررسی کنید | docker compose logs app |
exec | اجرای دستور در کانتینر | docker compose exec app bash |
images | فهرست کردن تصاویر استفاده شده توسط کانتینرها | docker compose images |
rm | ظروف متوقف شده را بردارید | docker compose rm |
استفاده از پروفایلهای Docker Compose #
پروفایلها به برنامهها یا سرویسهای انتخابی اجازه میدهند تا بر اساس محیط یا موارد استفاده، مانند توسعه و تولید، اجرا شوند.
- فایل را ویرایش کنید
compose.yml.console$ nano compose.yml - پیکربندی زیر را در زیر
flaskسرویس اضافه کنید.yamladminer: image: adminer restart: always depends_on: [postgresql] profiles: [dev] ports: - ۸۰۸۰:۸۰۸۰ redis-insight: image: redis/redisinsight:latest restart: always profiles: [dev] depends_on: [redis] ports: - "۸۰۰۱:۸۰۰۱"
فایل را ذخیره کنید و ببندید.
در این پیکربندی:
adminer: سرویسی با نام را تعریف میکندadminerکه ازadminerتصویر داکر استفاده میکند.restart: always: سیاستی را تنظیم میکند که در صورت توقف، کانتینر همیشه مجدداً راهاندازی شود.depends_on: تضمین میکند کهadminerسرویس فقط پس ازpostgresqlشروع سرویس، شروع به کار کند.profiles:devنمایه را به سرویس اختصاص میدهد.portsپورت۸۰۸۰روی میزبان را به پورت۸۰۸۰داخل کانتینر نگاشت میکند.
redis-insight: سرویسی با نام را تعریف میکندredis-insightکه ازredis/redisinsight:latestتصویر داکر استفاده میکند.restart: always: سیاستی را تنظیم میکند که در صورت توقف، کانتینر همیشه مجدداً راهاندازی شود.depends_on: تضمین میکند کهredis-insightسرویس فقط پس ازredisشروع سرویس، شروع به کار کند.profiles:devنمایه را به سرویس اختصاص میدهد.portsپورت۸۰۰۱روی میزبان را به پورت۸۰۰۱داخل کانتینر نگاشت میکند.
- سرویس را شروع کنید
adminer.console$ docker compose --profile dev up -dاز این
--profile devگزینه برای فعالسازی و شروع سرویسهای اختصاص داده شده بهdevپروفایل استفاده کنید. این به Docker Compose میگوید کهadminerسرویس را که به طور پیشفرض نادیده گرفته میشود، لحاظ کند. - با دستور زیر کانتینر در حال اجرا را بررسی کنید.console
$ docker compose psخواهید دید که
adminerسرویس در حال اجرا است.NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS myproject-adminer-1 adminer "entrypoint.sh docke…" adminer 2 seconds ago Up 1 second 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp myproject-flask-1 myproject-flask "flask run --debug" flask 2 seconds ago Up 1 second 0.0.0.0:8000->5000/tcp, [::]:8000->5000/tcp myproject-postgresql-1 postgres:16-alpine "docker-entrypoint.s…" postgresql 3 seconds ago Up 2 seconds 0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp myproject-redis-1 redis:alpine "docker-entrypoint.s…" redis 3 seconds ago Up 2 seconds 0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp myproject-redis-insight-1 redis/redisinsight:latest "./docker-entry.sh n…" redis-insight 3 seconds ago Up 1 second 5540/tcp, 0.0.0.0:8001->8001/tcp, [::]:8001->8001/tcp - برای متوقف کردن یک سرویس، به عنوان مثال
adminer، ازکنسول$ docker compose stop adminer - سرویس متوقف شده را حذف کنید
adminer.console$ docker compose rm adminer - تمام سرویسها (از جمله
devپروفایل) را از بین ببرید.console$ docker compose --profile dev down
نتیجه گیری #
در این مقاله، نحوه استفاده از Docker Compose برای مدیریت پشتههای کانتینر را بررسی کردید. یاد گرفتید که چگونه کانتینرها را با استفاده از docker composeدستور شروع، متوقف، راهاندازی مجدد و از بین ببرید، چگونه فایل را برای پشته برنامه خود ایجاد کنید compose.yamlو کاربرد اولیه پروفایلهای Docker Compose را برای اجرای انتخابی کانتینرها بسته به محیط خود بررسی کردید. برای اطلاعات بیشتر، مستندات Docker Compose را بررسی کنید .