Docker ابزاری است که مدیریت فرآیندهای اپلیکیشنها را در کانتینرها آسان میکند. با اینکه کانتینرها تا حد زیادی شبیه به ماشینهای مجازی هستند، اما بسیار سبکوزنتر و سازگارتر با منابع هستند. این ویژگی به توسعهدهندگان کمک میکند تا بتوانند یک محیط را به چند سرویس مستقل تقسیم کنند.
در این راهنما، شیوهی نصب در سرور اوبونتو 20.04 و شروع استفاده از این ابزار را بررسی خواهیم کرد.
پیشنیازها
برای دنبال کردن این مقاله، به موارد زیر نیاز دارید:
-
دسترسی به یک سرور با سیستمعامل Ubuntu 20.04 با یک کاربر غیر root با دسترسی sudo
-
نصب بودن 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 میتوانید از