Авторът на статията, чийто превод публикуваме днес, казва, че тя е предназначена за разработчици, които искат да научат Docker Compose и бързо да създадат своето първо клиент-сървърно приложение с Docker. Предполага се, че читателят е запознат с основите на Docker. Ако не е така — можете да погледнете на серията статии на публикацията, в която основите на Docker са разгледани заедно с основите на Kubernetes, и на статия за начинаещи.
Какво е 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, е време да създадете вашето първо клиент-сървърно приложение с този инструмент. Става дума за разработване на малък уеб сайт (сървър) на Python, който може да предостави файл с фрагмент от текст. Този файл се запитва от програма (клиент), също написана на Python. След получаване на файла от сървъра, програмата извежда текста, съдържащ се в него, на екрана.
Обърнете внимание, че разчитаме на това, че владеете основите на Docker и че платформата Docker вече е инсталирана при вас.
Нека започнем работа по проекта.
▍1. Създаване на проекта
За да изградите вашето първо клиент-сървърно приложение, предлагам да започнете с създаването на папка за проекта. Тя трябва да съдържа следните файлове и папки:
- файл
docker-compose.ymlТова е Docker Compose файл, който ще съдържа инструкциите, необходими за стартиране и настройка на услугите. - Папка
сърверТя ще съдържа файловете, необходими за функционирането на сървъра. - Папка
clientТук ще се намират файловете на клиентското приложение.
В резултат, съдържанието на основната папка на проекта ви трябва да изглежда така:
.
├── client/
├── docker-compose.yml
└── server/
2 директории, 1 файл▍2. Създаване на сървър
Тук, в процеса на създаване на сървъра, ще засегнем някои основни неща, свързани с Docker.
2a. Създаване на файлове
Отидете в папката сървер и създайте в нея следните файлове:
- файл
server.py. В него ще се намира кодът на сървъра. - файл
index.html. В този файл ще има фрагмент от текста, който клиентското приложение трябва да изведе. - файл
Dockerfile. Това е Docker файл, който ще съдържа инструкциите, необходими за създаване на средата на сървъра.
Ето как трябва да изглежда съдържанието на вашата папка server/:
.
├── Dockerfile
├── index.html
└── server.py
0 директории, 3 файла2b. Редактиране на Python файла.
Нека добавим в файла 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 е магия!Текстът ще бъде предаден на клиента.
2d. Редактиране на файла Dockerfile
Сега ще създадем прост файл Dockerfile, който ще отговаря за организацията на средата за изпълнение на Python сървъра. За основа на създавания образ ще използваме , предназначен за изпълнение на програми, написани на Python. Ето съдържанието на 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 директории, 2 файла3b. Редактиране на Python файла
Нека добавим в файла 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, отговарящ за формирането на средата, в която ще работи клиентското Python приложение. Ето кода на клиента Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Както сте могли да забележите, създадохме два различни проекта: сървър и клиент. Всеки от тях има собствен файл Dockerfile. Досега всичко, което се случва, не излиза извън основите на работата с Docker. Сега обаче преминаваме към работа с 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 е магия!.
Както вече беше споменато, сървърът използва порта на компютъра 1234 за обслужване на клиентските заявки. Затова, ако отидете в браузъра на адрес , ще бъде показана страница с текст Docker-Compose е магия!.
Полезни команди
Нека разгледаме някои команди, които могат да ви бъдат полезни при работа с 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 в проектите си?
Източник: habr.com
