نویسنده مقاله که ترجمه آن را امروز منتشر می کنیم می گوید که برای توسعه دهندگانی در نظر گرفته شده است که می خواهند Docker Compose را یاد بگیرند و به سمت ایجاد اولین برنامه مشتری-سرور خود با استفاده از Docker حرکت می کنند. فرض بر این است که خواننده این مطالب با اصول Docker آشنا است. اگر اینطور نیست، می توانید نگاهی به آن بیندازید
Docker Compose چیست؟
Docker Compose ابزاری است که در Docker گنجانده شده است. برای حل مشکلات مربوط به استقرار پروژه طراحی شده است.
در حین یادگیری اصول Docker، ممکن است با ایجاد برنامههای کاربردی سادهای مواجه شده باشید که به طور مستقل کار میکنند و به عنوان مثال، به منابع داده خارجی یا خدمات خاصی وابسته نیستند. در عمل، چنین برنامه هایی نادر هستند. پروژه های واقعی معمولا شامل مجموعه کاملی از برنامه های کاربردی است که با هم کار می کنند.
چگونه متوجه می شوید که در هنگام استقرار یک پروژه نیاز به استفاده از Docker Compose دارید؟ در واقع بسیار ساده است. اگر از چندین سرویس برای اجرای این پروژه استفاده می کنید، Docker Compose ممکن است مفید باشد. به عنوان مثال، در شرایطی که آنها یک وب سایت ایجاد می کنند که برای احراز هویت کاربران باید به یک پایگاه داده متصل شود. چنین پروژه ای ممکن است از دو سرویس تشکیل شده باشد - یکی که عملکرد سایت را تضمین می کند و دیگری که مسئول نگهداری پایگاه داده است.
فناوری Docker Compose، برای توصیف آن به روشی ساده، به شما امکان می دهد خدمات زیادی را با یک فرمان راه اندازی کنید.
تفاوت بین Docker و Docker Compose
Docker برای مدیریت کانتینرها (خدمات) فردی که یک برنامه کاربردی را تشکیل می دهند استفاده می شود.
Docker Compose برای مدیریت همزمان چندین کانتینر که یک برنامه کاربردی را تشکیل می دهند استفاده می شود. این ابزار همان قابلیت های Docker را ارائه می دهد، اما به شما امکان می دهد با برنامه های پیچیده تری کار کنید.
Docker (تک ظرف) و Docker Compose (چندین کانتینر)
مورد استفاده معمولی برای Docker Compose
Docker Compose ابزار بسیار قدرتمندی است که به شما امکان می دهد برنامه های کاربردی با معماری های پیچیده را به سرعت اجرا کنید. اکنون نمونه ای از استفاده عملی از Docker Compose را بررسی می کنیم که تجزیه و تحلیل آن به شما امکان می دهد مزایایی را که استفاده از Docker Compose به شما می دهد ارزیابی کنید.
تصور کنید که توسعه دهنده یک پروژه وب هستید. این پروژه شامل دو وب سایت می باشد. اولین مورد به افراد تجاری اجازه می دهد تا تنها با چند کلیک فروشگاه های آنلاین ایجاد کنند. هدف دوم پشتیبانی از مشتری است. این دو سایت با یک پایگاه داده تعامل دارند.
پروژه شما روز به روز محبوب تر می شود و معلوم می شود که قدرت سروری که روی آن اجرا می شود دیگر کافی نیست. در نتیجه تصمیم می گیرید کل پروژه را به ماشین دیگری منتقل کنید.
متأسفانه از چیزی مانند Docker Compose استفاده نکردید. بنابراین، شما باید خدمات را یکی یکی انتقال و پیکربندی مجدد کنید، به این امید که در این فرآیند چیزی را فراموش نکنید.
اگر از Docker Compose استفاده می کنید، انتقال پروژه خود به یک سرور جدید موضوعی است که با اجرای چند دستور قابل حل است. برای تکمیل انتقال پروژه به یک مکان جدید، فقط باید تنظیماتی را انجام دهید و یک نسخه پشتیبان از پایگاه داده در سرور جدید آپلود کنید.
توسعه یک برنامه مشتری-سرور با استفاده از Docker Compose
اکنون که می دانید برای چه چیزی از Docker Compose استفاده می کنیم، زمان آن رسیده است که اولین برنامه سرویس گیرنده-سرور خود را با استفاده از این ابزار ایجاد کنید. یعنی، ما در مورد توسعه یک وب سایت کوچک (سرور) در پایتون صحبت می کنیم که می تواند یک فایل را با قطعه ای از متن خروجی دهد. این فایل توسط یک برنامه (کلینت) که به زبان پایتون نیز نوشته شده است از سرور درخواست می شود. پس از دریافت فایل از سرور، برنامه متن ذخیره شده در آن را روی صفحه نمایش می دهد.
لطفاً توجه داشته باشید که ما فرض میکنیم که شما درک اولیه از Docker دارید و پلتفرم Docker را قبلاً نصب کردهاید.
بیایید کار روی پروژه را شروع کنیم.
▍1. ایجاد یک پروژه
برای ساختن اولین برنامه مشتری-سرور خود، پیشنهاد می کنم با ایجاد یک پوشه پروژه شروع کنید. باید حاوی فایل ها و پوشه های زیر باشد:
- پرونده
docker-compose.yml
. این یک فایل Docker Compose است که حاوی دستورالعملهای لازم برای شروع و پیکربندی سرویسها است. - پوشه
server
. این شامل فایل های لازم برای فعال نگه داشتن سرور است. - پوشه
client
. فایل های برنامه مشتری در اینجا قرار خواهند گرفت.
در نتیجه، محتویات پوشه اصلی پروژه شما باید به شکل زیر باشد:
.
├── client/
├── docker-compose.yml
└── server/
2 directories, 1 file
▍2. ایجاد سرور
در اینجا، در فرآیند ایجاد یک سرور، به موارد اساسی در مورد Docker خواهیم پرداخت.
2a. ایجاد فایل
به پوشه بروید server
و فایل های زیر را در آن ایجاد کنید:
- پرونده
server.py
. حاوی کد سرور خواهد بود. - پرونده
index.html
. این فایل حاوی یک تکه متن است که برنامه مشتری باید خروجی بگیرد. - پرونده
Dockerfile
. این یک فایل Docker است که حاوی دستورالعمل های مورد نیاز برای ایجاد محیط سرور است.
محتویات پوشه شما باید به این شکل باشد server/
:
.
├── Dockerfile
├── index.html
└── server.py
0 directories, 3 files
2b. ویرایش فایل پایتون
به فایل اضافه کنید server.py
کد زیر:
#!/usr/bin/env python3
# Импорт системных библиотек python.
# Эти библиотеки будут использоваться для создания веб-сервера.
# Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python.
import http.server
import socketserver
# Эта переменная нужна для обработки запросов клиента к серверу.
handler = http.server.SimpleHTTPRequestHandler
# Тут мы указываем, что сервер мы хотим запустить на порте 1234.
# Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose.
with socketserver.TCPServer(("", 1234), handler) as httpd:
# Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента.
httpd.serve_forever()
این کد به شما امکان می دهد یک وب سرور ساده ایجاد کنید. او پرونده را به مشتریان می دهد index.html
، که مطالب آن بعداً در صفحه وب نمایش داده می شود.
2c. ویرایش یک فایل HTML
برای تشکیل پرونده index.html
متن زیر را اضافه کنید:
Docker-Compose is magic!
این متن برای مشتری ارسال می شود.
2d. ویرایش Dockerfile
حالا یک فایل ساده ایجاد می کنیم Dockerfile
، که مسئول سازماندهی محیط زمان اجرا برای سرور پایتون خواهد بود. به عنوان مبنایی برای تصویر ایجاد شده، از آن استفاده خواهیم کرد
# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа.
# Для этого используется ключевое слово 'FROM'.
# Здесь нам нужно импортировать образ python (с DockerHub).
# В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'.
FROM python:latest
# Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'.
# Для того чтобы это сделать, мы используем ключевое слово 'ADD'.
# Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере.
# Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе.
# Здесь мы помещаем файл в папку образа '/server/'.
ADD server.py /server/
ADD index.html /server/
# Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас.
# Она позволяет изменить рабочую директорию образа.
# В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'.
WORKDIR /server/
حالا بیایید کار روی مشتری را شروع کنیم.
▍3. ایجاد مشتری
هنگام ایجاد سمت مشتری پروژه خود، برخی از اصول اولیه Docker را در طول مسیر به یاد خواهیم آورد.
3a. ایجاد فایل
به پوشه پروژه خود بروید client
و فایل های زیر را در آن ایجاد کنید:
- پرونده
client.py
. کد مشتری در اینجا قرار خواهد گرفت. - پرونده
Dockerfile
. این فایل همان نقش یک فایل مشابه در پوشه سرور را ایفا می کند. یعنی حاوی دستورالعمل هایی است که نحوه ایجاد محیطی برای اجرای کد مشتری را توضیح می دهد.
در نتیجه پوشه شما client/
در این مرحله از کار باید به شکل زیر باشد:
.
├── client.py
└── Dockerfile
0 directories, 2 files
3b. ویرایش فایل پایتون
به فایل اضافه کنید client.py
کد زیر:
#!/usr/bin/env python3
# Импортируем системную библиотеку Python.
# Она используется для загрузки файла 'index.html' с сервера.
# Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python.
import urllib.request
# Эта переменная содержит запрос к 'http://localhost:1234/'.
# Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'.
# localhost указывает на то, что программа работает с локальным сервером.
# 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода.
fp = urllib.request.urlopen("http://localhost:1234/")
# 'encodedContent' соответствует закодированному ответу сервера ('index.html').
# 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран).
encodedContent = fp.read()
decodedContent = encodedContent.decode("utf8")
# Выводим содержимое файла, полученного с сервера ('index.html').
print(decodedContent)
# Закрываем соединение с сервером.
fp.close()
با این کد اپلیکیشن کلاینت می تواند داده ها را از سرور دانلود کرده و روی صفحه نمایش دهد.
3c. ویرایش Dockerfile
همانطور که در مورد سرور، ما یک ساده ایجاد می کنیم Dockerfile
، مسئول ایجاد محیطی است که برنامه کلاینت پایتون در آن اجرا می شود. در اینجا کد مشتری است Dockerfile
:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/
▍4. Docker Compose
همانطور که ممکن است متوجه شده باشید، ما دو پروژه مختلف ایجاد کردیم: یک سرور و یک مشتری. هر کدام از آنها فایل مخصوص به خود را دارند Dockerfile
. تا اینجای کار هر اتفاقی که افتاده فراتر از اصول اولیه کار با داکر نبوده است. اکنون با Docker Compose شروع می کنیم. برای این کار به سراغ فایل می رویم docker-compose.yml
، در پوشه ریشه پروژه قرار دارد.
لطفاً توجه داشته باشید که در اینجا ما سعی نمی کنیم کاملاً تمام دستوراتی را که می توان در آنها استفاده کرد پوشش دهیم docker-compose.yml
. هدف اصلی ما ارائه یک مثال عملی است که دانش اولیه Docker Compose را به شما می دهد.
این کدی است که باید در فایل قرار دهید docker-compose.yml
:
# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.
version: "3"
# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть клиент, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'.
services:
# Как уже было сказано, мы собираемся создать клиентское и серверное приложения.
# Это означает, что нам нужно два сервиса.
# Первый сервис (контейнер): сервер.
# Назвать его можно так, как нужно разработчику.
# Понятное название сервиса помогает определить его роль.
# Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'.
server:
# Ключевое слово "build" позволяет задать
# путь к файлу Dockerfile, который нужно использовать для создания образа,
# который позволит запустить сервис.
# Здесь 'server/' соответствует пути к папке сервера,
# которая содержит соответствующий Dockerfile.
build: server/
# Команда, которую нужно запустить после создания образа.
# Следующая команда означает запуск "python ./server.py".
command: python ./server.py
# Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234.
# Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
# мы должны организовать перенаправление этого порта на порт компьютера.
# Сделать это нам поможет ключевое слово 'ports'.
# При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
# В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом
# 1234 контейнера (так как именно на этот порт сервер
# ожидает поступления запросов).
ports:
- 1234:1234
# Второй сервис (контейнер): клиент.
# Этот сервис назван 'client'.
client:
# Здесь 'client/ соответствует пути к папке, которая содержит
# файл Dockerfile для клиентской части системы.
build: client/
# Команда, которую нужно запустить после создания образа.
# Следующая команда означает запуск "python ./client.py".
command: python ./client.py
# Ключевое слово 'network_mode' используется для описания типа сети.
# Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера.
network_mode: host
# Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,
# прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.
# Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.
depends_on:
- server
▍5. ساخت پروژه
بعد از در docker-compose.yml
تمام دستورالعمل های لازم وارد شده است، پروژه باید مونتاژ شود. این مرحله از کار ما شبیه به استفاده از دستور است docker build
، اما دستور مربوطه مربوط به چندین سرویس است:
$ docker-compose build
▍6. راه اندازی پروژه
اکنون که پروژه مونتاژ شده است، زمان راه اندازی آن است. این مرحله از کار ما مربوط به مرحله ای است که در آن هنگام کار با کانتینرهای جداگانه، دستور اجرا می شود docker run
:
$ docker-compose up
پس از اجرای این دستور، متن دانلود شده توسط مشتری از سرور باید در ترمینال ظاهر شود: Docker-Compose is magic!
.
همانطور که قبلا ذکر شد، سرور از پورت کامپیوتر استفاده می کند 1234
برای خدمات رسانی به درخواست های مشتری بنابراین، اگر به آدرس موجود در مرورگر خود بروید Docker-Compose is magic!
.
دستورات مفید
بیایید به برخی از دستورات نگاه کنیم که ممکن است هنگام کار با Docker Compose برای شما مفید باشد.
این دستور به شما امکان می دهد کانتینرها و سایر منابع ایجاد شده توسط دستور را متوقف و حذف کنید docker-compose up
:
$ docker-compose down
این دستور گزارش های سرویس را چاپ می کند:
$ docker-compose logs -f [service name]
به عنوان مثال، در پروژه ما می توان از آن به این شکل استفاده کرد: $ docker-compose logs -f [service name]
.
با استفاده از این دستور می توانید لیستی از کانتینرها را نمایش دهید:
$ docker-compose ps
این دستور به شما امکان می دهد یک دستور را در یک کانتینر در حال اجرا اجرا کنید:
$ docker-compose exec [service name] [command]
به عنوان مثال، ممکن است به شکل زیر باشد: docker-compose exec server ls
.
این دستور به شما امکان می دهد لیستی از تصاویر را نمایش دهید:
$ docker-compose images
نمایش نتایج: از
ما اصول کار با فناوری Docker Compose را بررسی کردهایم که دانش آن به شما امکان میدهد از این فناوری استفاده کنید و در صورت تمایل، شروع به مطالعه عمیقتر کنید.
خوانندگان عزیز! آیا از Docker Compose در پروژه های خود استفاده می کنید؟
منبع: www.habr.com