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
سپس بلوک services
web
ports
web
عبارت volumes
app
اکنون شما یک صفحهی آزمایشی و یک فایل 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
مشاهدهی لاگ
برای بررسی لاگهای کانتینر 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 میتوانید از راهنمای این ابزار کمک بگیرید.