به نظر شما ویژگی مهم هر اپلیکیشن مبتنی بر وب چیست؟ ویژگیهای مهم زیادی وجود دارد، اما به نظر من، مهم ترین ویژگی آنها بهره وری بالا است و این کاری است که Docker انجام میدهد.
قبل از ورود به این مقوله، اجازه دهید توضیح دهیم که Docker وDocker Containers چه هستند.
Docker یک ابزار کانتینری پرکاربرد است که توسعهدهندگان و تیمهای عملیاتی از آن برای ایجاد و خودکارسازی اپلیکیشنها در کانتینرهای سبک وزن در ماشینهای مجازی استفاده میکنند. این کار برای اطمینان از کارآمد بودن برنامهها در محیطهای مختلف انجام می شود.
توجه: Containers یک بسته نرم افزاری است که با تمام وابستگیهای مورد نیاز، برای اجرای یک برنامه کار میکند.
حال، بیایید موردی را در نظر بگیریم که میخواهید از دو کانتینر در یک سرویس استفاده کنید؟ چه خواهید کرد؟ برای روشن شدن بیشتر این مسئله، اجازه دهید این سوال را با یک مثال درک کنیم.
فرض کنید بیش از یک کانتینر در Docker دارید. فرض کنید یک وب سرور و یک پایگاه داده در کانتینرهای جداگانه در حال اجرا هستند، که برای ساختار داده شما معمول است. ساختن، اجرا کردن و اتصال کانتینرها از فایلهای Docker جداگانه دشوار است و میتواند زمان زیادی را صرف کند. اینجاست که Docker Compose وارد میشود و چندین سرویس را به طور همزمان اجرا میکند
Docker Compose چیست؟
Docker Compose ابزاری است که به تعریف و به اشتراک گذاری برنامههای چند کانتینری کمک میکند. با استفاده از Compose، میتوانیم سرویسها را در یک فایل YAML تعریف کنیم و همچنین با یک دستور، آنها را spin up و tear down کنیم. (بالا و پایین بیاوریم).
برای درک بهتر، اجازه دهید به عنوان مثال به Myntra نگاه کنیم. Myntra یک وب سایت تجارت الکترونیک در زمینه مد و شبیه به آمازون است. شما از طریق مرورگر وب خود از وب سایت Myntra بازدید میکنید و فعالیتهای مختلفی انجام می دهید، مانند ورود به حساب کاربری خود، مرور یک کاتالوگ، چک کردن و غیره. پشت هر یک از این فعالیت ها یا خدمات، محصولات مختلفی مانند پایگاه داده حساب، پایگاه داده محصول، پایگاه داده سبد خرید و موارد دیگر وجود دارد که در پشت صحنه اجرا می شوند.

هر کدام از اینها را می توان به عنوان یک مایکروسرویس در نظر گرفت. هرچه مایکروسرویس های بیشتری در محیط خود ایجاد کنید، ارزش مقداری بیشتری برای داشتن هر یک از این سرویس ها در کانتینر خود دارد. اما به عنوان یک توسعه دهنده، باید بتوانید از یک ظرف به ظرف دیگر jump کنید. اینجاست که می توانید این مثال را با Docker مرتبط کنید، جایی که Docker می تواند کانتینرهای مختلف را به عنوان یک سرویس واحد به هم متصل کند.
فواید Docker Compose
این ابزار برای اجرای چندین کانتینر به عنوان یک سرویس واحد استفاده میشود. هر یک از کانتینرها در اینجا به صورت مجزا اجرا میشوند اما در صورت لزوم میتوانند با یکدیگر تعامل داشته باشند. نوشتن فایلهای Docker Compose در یک زبان برنامهنویسی به نام YAML بسیار آسان است. این زبان یک زبان مبتنی بر XML است که مخفف Yet Another Markup Language است. یکی دیگر از فواید Docker این است که کاربران میتوانند با استفاده از یک دستور، تمام سرویسها (کانتینرها) را فعال کنند.
برای مثال:
اگر برنامهای دارید که به سرور NGINX و پایگاه داده Redis نیاز دارد، میتوانید یک فایل Docker Compose ایجاد کنید که میتواند هر دو کانتینر را بهعنوان یک سرویس، بدون نیاز به راهاندازی جداگانه هر کدام از آنها، اجرا کند.

مزایای Docker Compose
- استقرار بر روی یک هاست – این بدان معنی است که شما میتوانید همه چیز را روی یک قطعه سخت افزار اجرا کنید.
- پیکربندی سریع و آسان – به دلیل وجود اسکریپت های YAML
- بهرهوری بالا – Docker Compose زمان انجام کارها را کاهش میدهد.
- امنیت – همه کانتینرها از یکدیگر جدا میشوند و بدین ترتیب چشم انداز تهدید را کاهش می دهند.
اکنون، ممکن است فکر کنید که Docker Compose کاملاً شبیه Docker Swarm است، اما اینطور نیست. در اینجا برخی از تفاوتهای این ابزار با Docker Swarm آورده شده است:

دستورات اساسی در Docker Compose
- شروع همه سرویسها: Docker Compose up
- توقف همه سرویسها: Docker Compose down
- نصب Docker Compose با استفاده ازpip : pip install -U Docker-compose
- چک کردن نسخهDocker Compose : Docker-compose-v
- اجرای فایل Docker Compose : Docker-compose up -d
- لیست کردن کل فرآیند : Docker ps
- Scale کردن یک سرویس – Docker Compose up -d -scale
- استفاده از فایلهای YAML برای پیکربندی سرویسهای برنامه – Docker Compose.yml
اینها برخی از دستورات اساسی هستند که می توانید در Docker استفاده کنید.
نصب Docker Compose
اجازه دهید نحوه نصب این ابزار را به ترتیب در ویندوز، لینوکس و macOS بررسی کنیم. قبل از ورود به فرآیند نصب، چند پیش نیاز وجود دارد که باید انجام شوند. اجازه دهید این پیش نیازها را بررسی کنیم.
پیش نیازها
برای اینکه بتوانیم Docker را نصب کنیم، باید Docker Engine را به صورت Remote یا محلی نصب کنیم.
اجازه دهید نگاهی به تنظیمات مورد نیاز برای Docker Engine بیاندازیم.
Docker Compose روی پلتفرمهای دسکتاپ مانند Docker Desktop برای Windows و Mac از پیش نصب شده است.
همانطور که در صفحه Get Docker در سیستمهای لینوکس نشان داده شده است، Docker Engine را برای سیستم عامل خود نصب کنید، سپس برای دستورالعملهای نصب Docker در سیستمهای لینوکس به اینجا برگردید.
نصب و راه اندازی
در زیر، مراحل نصب Docker را در macOS، Linux و Windows خلاصه میکنیم.
نصب Docker در macOS
برای استفاده از این ابزار در macOS، تنها باید Docker Desktop برای Mac را نصب کنیم و نیازی به نصب جداگانه آن نداریم.
نصب Docker روی لینوکس
برای اجرای Docker در لینوکس، باید باینری Docker Compose را با استفاده از صفحه انتشار مخزن Compose Github دانلود کنیم.
دستورالعملهای زیر را برای نصب موفقیت آمیز این ابزار دنبال کنید:
برای دانلود نسخه پایدار فعلی Docker ، دستور زیر را اجرا کنید:
sudo curl -L "https://github.com/docker/compose/releases/download//docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/ bin/docker-compose
در باینری، مجوزهای اجرایی زیر را درخواست کنید:
sudo chmod +x /usr/local/bin/docker-compose
سپس با اجرای دستور زیر به سراغ تست نصب بروید:
docker-compose --version
نصب Docker Compose روی ویندوز
برای استفاده از این ابزار در ویندوز، فقط باید Docker Desktop برای ویندوز را نصب کنیم و نیازی به نصب جداگانه آن نداریم.
- فایل Compose را ایجاد کنید
- مرحله بعدی ایجاد فایل Compose برای Docker Compose است. برای ایجاد این فایل مراحل زیر را دنبال کنید:
- فایلی به نام docker-compose.yml در روت پروژه ایجاد کنید.
- سپس با تعریف و ذکر نسخه schema ادامه می دهیم:
version: ""
برای اجرا به عنوان بخشی از اپلیکیشنمان، لیستی از کانتینرها یا سرویسها را تعریف میکنیم:
version: ""
services:
سپس به انتقال service one به به فایل Compose از پیشایجادشده خود ادامه میدهیم.
تعریف سرویسهای مختلف
برای تعریف کانتینر برنامه، از دستور زیر استفاده میکنیم:
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=\
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB= \
node:12-alpine \
sh -c "yarn install && yarn run dev"
In case we are using PowerShell, we may use the below command -
PS> docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
--network todo-app `
-e MYSQL_HOST= `
-e MYSQL_USER=root `
-e MYSQL_PASSWORD=secret `
-e MYSQL_DB= \
node:12-alpine `
sh -c "yarn install && yarn run dev"
اکنون، مراحل زیر را برای تعریف سرویسهای مختلف در Docker Compose دنبال کنید:
- باید ورودی image و service را برای کانتینر تعریف کنیم. ما باید یک نام دلخواه برای سرویس خود انتخاب کنیم، که نام مستعار شبکه ما خواهد شد و در تعریف سرویس MySQL مفید خواهد بود.
version: "4.2"
services:
app:
image: node:12-alpine
2. نزدیک تعریف image ، می توان دستور (command) را مشاهده کرد. اکنون، این را به فایل خود منتقل میکنیم.
توجه: نیازی به ترتیببندی نیست.
version: "4.2"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
- پورت هایی را برای سرویس تعریف می کنیم تا قسمت -p 3000:3000 از دستور را منتقل کند. به همین دلیل، در اینجا از یک syntax کوتاه استفاده خواهیم کرد.
version: "4.2"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
- اکنون، volume mapping (-v “$(pwd):/app”) و یک working directory (-w /app) را با استفاده از تعاریف volume و working_dir منتقل میکنیم. volumeها نیز دارای syntax کوتاه و بلند هستند.
نکته: مزیت تعاریف volume در Docker Compose این است که از دایرکتوری فعلی میتوانیم از مسیرهای مرتبط استفاده کنیم.
version: "4.2"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
- با استفاده از environment key ، باید تعاریف متغیر محیطی را انتقال دهیم:
version: "4.2"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB:
اجرای Application Stack
اکنون باید فایل compose را که ایجاد کرده بودیم راه اندازی کنیم.
- ابتدا مطمئن شوید که هیچ نسخه دیگری از برنامه در حال اجرا وجود ندارد (docker rm -f <ids> و docker ps).
- با استفاده از دستور docker-compose up، باید application stack را استارت بزنیم. برای اجرای همهچیز در پسزمینه، باید -d flag استفاده کنیم.
docker-compose up -d
خروجی:
Creating network "app_default" with the default driver
Creating volume "-mysql-data" with default driver
Creating app_app_1 ... done
Creating app_mysql_1 ... done
باید لاگها را با اجرای دستور docker-compose logs -f بررسی کنیم. هر یک از گزارشهای سرویسها در یک stream واحد ترکیب میشوند. اگر نیاز به نگرانیهای مربوط به زمانبندی احساس کردید، بدانید که این واقعا مفید است. -f flag log را «دنبال میکند»، بنابراین نتایج آنها را در زمان تولید دریافت خواهید کرد.
خروجی مشابه تصویر زیر خواهد بود :
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
mysql_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
app_1 | Connected to mysql db at host mysql
app_1 | Listening on port 3000
نکته: برای کمک به تشخیص پیام ها، نام سرویس در ابتدای خط چاپ می شود (معمولاً رنگی). نام سرویس را می توان در انتهای دستورات گزارش برای مشاهده گزارشهای مربوط به یک سرویس خاص (به عنوان مثال، برنامه docker-compose logs -f) درج کرد.
ما باید بتوانیم به برنامه خود دسترسی داشته باشیم و در این مرحله آن را در حال اجرا ببینیم. اکنون تنها یک دستور برای اجرا کردن باقی مانده است.
App Stack در Docker Dashboard
در Docker Dashboard ، گروهی به نام app پیدا می کنیم. این ” project name” Docker Compose است که برای سازماندهی کانتینرها با هم استفاده می شود. نام پروژه همان نام دایرکتوری است که docker-compose.yml به طور پیش فرض در آن یافت میشود.

اگر برنامه را پایین بچرخانیم، دو کانتینر را در فایل compose می بینیم. زیرا آنها از الگوی project-name> service-name> replica-number> پیروی میکنند و نامهای توصیفی بیشتری دارند. در نتیجه، شناسایی کانتینر پایگاه داده MySQL و کانتینر برنامه ما بسیار آسان است.

Leave feedback about this