Docker ابزاری‌ است که مدیریت فرآیندهای اپلیکیشن‌ها را در کانتینرها آسان می‌‌کند. با این‌که کانتینرها تا حد زیادی شبیه به ماشین‌های مجازی هستند، اما بسیار سبک‌وزن‌تر و سازگارتر با منابع هستند. این ویژگی‌ به توسعه‌دهندگان کمک می‌کند تا بتوانند یک محیط را به چند سرویس مستقل تقسیم کنند.

در برنامه‌هایی که به چند سرویس بستگی دارند، هماهنگ کردن همه‌ی کانتینرها برای راه‌اندازی، برقراری ارتباط و خاموش شدن با هم می‌تواند سخت یا حتا ناممکن شود. Docker Compose ابزاری است که به شما این امکان را می‌دهد تا محیط‌های دارای چند کانتینر را بر اساس تعاریف تنظیم‌شده در یک فایل YAML اجرا کنید. داکر کامپوز از تعریف سرویس برای ساختن محیط‌های کاملن قابل تنظیم با کانتینرهای متعدد استفاده می‌‌کند که می‌‌توانند شبکه‌ها و والیوم‌ها را به اشتراک بگذارند.

در این راهنما، شیوه‌ی نصب Docker Compose در سرور اوبونتو 20.04 و شروع استفاده از این ابزار را بررسی خواهیم کرد.

پیش‌نیازها

برای دنبال کردن این مقاله، به موارد زیر نیاز دارید:

  • دسترسی به یک سرور با سیستم‌عامل Ubuntu 20.04 با یک کاربر غیر root با دسترسی sudo

  • نصب بودن Docker روی سرور؛ برای راهنمایی بیش‌تر می‌توانید از راهنمای نصب و استفاده از Docker کمک بگیرید.

نصب Docker Compose

برای اطمینان از دریافت نسخه‌ی به‌روز و پایدار Docker Compose، این نرم‌افزار را از مخزن رسمی‌ Github آن دانلود می‌کنیم.

دستور زیر نسخه‌ی 1.29.2 را دانلود کرده و فایل اجرایی را در usr/local/bin/docker-compose/ ذخیره می‌کند که باعث می‌شود این نرم‌افزار در سرور با عنوان docker-compose در دسترس باشد:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

با وارد کردن عبارت زیر، دستور docker-compose را قابل اجرا یا Executable کنید:

sudo chmod +x /usr/local/bin/docker-compose;

برای بررسی درستی فرآیند نصب می‌توانید دستور زیر را اجرا کنید:

docker-compose --version

خروجی باید مشابه زیر باشد:

docker-compose version 1.29.2, build 5becea4c

اکنون Docker Compose روی سرور شما نصب شده است. در بخش بعدی، شیوه‌ی راه‌اندازی فایل docker-compose.yml و یک محیط کانتینری را با این ابزار بررسی خواهیم کرد.

تنظیم یک فایل docker-compose.yml

برای آشنایی با شیوه‌ی تنظیم فایل docker-compose.yml و کار با Docker Compose، به‌کمک ایمیج رسمی‌ Nginx از Docker Hub، یک وب‌سرور ایجاد می‌کنیم. این محیط یک فایل HTML استاتیک را نمایش می‌دهد.

ابتدا یک دایرکتوری جدید بسازید و وارد آن شوید:

mkdir ~/compose-demo
cd ~/compose-demo

در این دایرکتوری، یک فولدر به نام app برای محیط Nginx بسازید:

mkdir app

با استفاده از ویرایش‌گر متن دلخواه خود، یک فایل index.html جدید در دایرکتوری app ایجاد کنید:

vi app/index.html

سپس محتوای زیر را در فایل قرار دهید:

<!doctype html>
<html lang="en">
<head>
   <meta charset="utf-8">
   <title>Docker Compose Demo</title>
   <link rel="stylesheet" href="https://lib.arvancloud.ir/pure/3.0.0/base-context-min.css">
</head>
<body>
​
   <h1>This is a Docker Compose Demo Page.</h1>
   <p>This content is being served by an Nginx container.</p>
​
</body>
</html>

فایل را ذخیره کرده و از آن خارج شوید.

حال باید فایل docker-compose.yml را بسازید:

Vi docker-compose.yml

محتوای زیر را در فایل قرار دهید:

version: '3.7'
services:
web:
  image: nginx:alpine
  ports:
    - "8000:80"
  volumes:
    - ./app:/usr/share/nginx/html

فایل را ذخیره کرده و ببندید.

فایل docker-compose.yml معمولن با تعریف ‍version یا نسخه شروع می‌شود. این خط برای Docker Compose مشخص می‌کند که از کدام نسخه‌ی پیکربندی استفاده می‌کنید.

سپس بلوک services نوشته می‌شود که در آن سرویس‌هایی را که بخشی از این محیط هستند تنظیم می‌کنید. در این نمونه، ما یک سرویس به نام web داریم. این سرویس از تصویر nginx:alpine استفاده می‌کند و یک ریدایرکت پورت را با عبارت ports تنظیم می‌کند. تمام درخواست‌های پورت 8000 میزبان (سیستمی‌که Docker Compose را از آن‌جا اجرا می‌کنید) به کانتینر web روی پورت 80 هدایت می‌شوند (جایی که Nginx در آن اجرا می‌شود).

عبارت volumes یک فضای مشترک بین میزبان و کانتینر ایجاد می‌کند. با این کار پوشه‌ی app با کانتینر به اشتراک گذاشته می‌شود و والیوم در مسیر usr/share/nginx/html/ داخل کانتینر قرار می‌گیرد.

اکنون شما یک صفحه‌ی آزمایشی و یک فایل docker-compose.yml راه اندازی کرده‌اید تا یک وب‌سرور کانتینری ایجاد کند. در مرحله‌ی بعد، این محیط را با Docker Compose اجرا می‌کنید.

اجرای Docker Compose

پس از ایجاد فایل docker-compose.yml می‌توانید داکر کامپوز را برای راه‌اندازی محیط‌تان اجرا کنید. به‌کمک دستور زیر، ایمیج‌های داکر دریافت شده،‌ یک کانتینر برای وب‌سرویس ساخته می‌شود و محیط کانتینری شروع به اجرا می‌کند:

docker-compose up -d

Docker Compose ابتدا ایمیج تعریف‌شده را در سرور شما جست‌وجو می‌کند و اگر نتواند آن را پیدا کند، ایمیج را از DockerHub دانلود می‌کند. خروجی را به این شکل خواهید دید:

Creating network "compose-demo_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
c829a9c40ab2: Pull complete
61d685417b2f: Pull complete
Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502
Status: Downloaded newer image for nginx:alpine
Creating compose-demo_web_1 ... done

محیط شما اکنون فعال است. برای بررسی فعال بودن کانتینر، می‌توانید کامند زیر را اجرا کنید:

docker-compose ps

این دستور اطلاعاتی در مورد کانتینرهای در حال اجرا و وضعیت آن‌ها و هم‌چنین هرگونه ریدایرکت پورت را نمایش می‌دهد:

       Name                     Command               State          Ports        
----------------------------------------------------------------------------------
compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8000->80/tcp

اکنون می‌توانید از طریق آدرس IP:8000 در مرورگر این سرویس را اجرا کنید.

دستورهای رایج Docker Compose

تا این‌جا با شیوه‌ی تنظیم یک فایل docker-compose.yml و اجرای محیط کانتینری‌تان آشنا شده‌اید. در این بخش با دستورهای بیش‌تری برای مدیریت این محیط به‌وسیله‌ی Docker Compose آشنا خواهید شد.

مشاهده‌ی لاگ

برای بررسی لاگ‌های کانتینر Nginx می‌توانید از دستور زیر استفاده کنید:

docker-compose logs

خروجی این دستور به‌شکل زیر است:

Attaching to compose-demo_web_1
web_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1  | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1  | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1  | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"

توقف/ازسرگیری محیط

اگر می‌خواهید محیط را بدون تغییر وضعیت فعلی کانتینرها متوقف کنید، می‌توانید دستور زیر را وارد کنید:

docker-compose pause

برای ازسرگیری مجدد دستور زیر را اجرا کنید:

docker-compose unpause

دستور stop به اجرای کانتینر خاتمه می‌دهد، اما هیچ داده‌ای را که مرتبط با کانتینرهاست حذف نمی‌کند:

stop docker-compose

حذف محیط کانتینری

اگر می‌خواهید کانتینرها، شبکه‌ها و والیوم‌های مرتبط با این محیط کانتینری را حذف کنید، از دستور down استفاده کنید:

docker-compose down

توجه داشته باشید که این دستور ایمیج پایه (Base Image) استفاده‌شده به‌وسیله‌ی Docker Compose (در این راهنما، nginx:alpine) را حذف نمی‌کند. بنابراین، هر زمان که دوباره محیط خود را با docker-compose up اجرا کنید، این فرآیند بسیار سریع‌تر خواهد بود.

اگر می‌خواهید ایمیج پایه را از سیستم خود حذف کنید، می‌توانید از دستور زیر استفاده کنید:

docker image rm nginx:alpine

برای آشنایی با جزییات بیش‌تر Docker Compose می‌توانید از راهنمای این ابزار کمک بگیرید.