- PVSM.RU - https://www.pvsm.ru -
Каждые несколько лет в индустрии разработки ПО происходит смена парадигмы. Одним из таких явлений можно признать рост интереса к концепции микросервисов. Хотя микросервисы — это технология не самая новая, лишь в последнее время её популярность буквально взлетела до небес.
Большие монолитные сервисы в наши дни заменяют независимыми автономными микросервисами. Микросервис можно рассматривать как приложение, которое служит единственной и очень специфической цели. Например — это может быть реляционная СУБД, Express-приложение, Solr-сервис.
В наши дни сложно представить себе разработку новой программной системы без применения микросервисов. А эта ситуация, в свою очередь, ведёт нас к платформе Docker.
Платформа Docker [2], в деле разработки и развёртывания микросервисов, стала практически индустриальным стандартом. На сайте проекта можно узнать о том, что Docker — это единственная независимая платформа контейнеризации, которая позволяет организациям без особых усилий создавать любые приложения, а также распространять и запускать их в любых средах — от гибридных облаков, до пограничных систем.
Технология Docker Compose [3] предназначена для конфигурирования многоконтейнерных приложений. В Docker Compose-проект может входить столько контейнеров Docker, сколько нужно создателю этого проекта.
При работе с Docker Compose для настройки сервисов приложения и организации их взаимодействия друг с другом используется YAML-файл. Docker Compose, таким образом, это инструмент для описания и запуска многоконтейнерных приложений Docker.

Два контейнера, работающие на хост-системе
Программа make, по существу, представляет собой инструмент для автоматизации сборки программ и библиотек из исходного кода. В целом, можно говорить о том, что make применима к любому процессу, который включает в себя выполнение произвольных команд для преобразования неких исходных материалов к некоему результирующему виду, к некоей цели. В нашем случае команды docker-compose будут преобразовываться в абстрактные цели (Phony targets [4]).
Для того чтобы сообщить программе make о том, чего мы от неё хотим, нам понадобится файл Makefile.
В нашем Makefile будут содержаться обычные команды docker и docker-compose, которые предназначены для решения множества задач. А именно, речь идёт о сборке контейнера, о его запуске, остановке, перезапуске, об организации входа пользователя в контейнер, о работе с логами контейнера и о решении других подобных задач.
Представим себе обычное веб-приложение, в котором имеются следующие компоненты:
Этому приложению понадобится 3 контейнера Docker и файл docker-compose, содержащий инструкции по управлению этими контейнерами. Каждый из контейнеров будет обладать разными точками взаимодействия. Например, с контейнером timescale можно будет работать примерно так, как работают с базами данных. А именно, он позволяет выполнять следующие действия:
pg_dump таблицы или базы данных.
Контейнер Express.js-приложения, expressjs, может обладать следующими возможностями:
После того, как мы настроили связь между контейнерами с использованием Docker Compose, пришло время налаживания взаимодействия с этими контейнерами. В рамках системы Docker Compose имеется команда docker-compose, поддерживающая опцию -f, которая позволяет передавать системе файл docker-compose.yml.
Используя возможности этой опции, можно ограничить взаимодействие с системой только теми контейнерами, которые упомянуты в файле docker-compose.yml.
Взглянем на то, как выглядят взаимодействия с контейнерами при использовании команд docker-compose. Если представить, что нам нужно войти в оболочку psql, то соответствующие команды могут выглядеть так:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Та же команда, для выполнения которой используется не docker-compose, а docker, может выглядеть так:
docker exec -it edp_timescale_1 psql -Upostgres
Обратите внимание на то, что в подобных случаях всегда предпочтительнее использовать не команду docker, а команду docker-compose, так как это позволяет избавиться от необходимости помнить имена контейнеров.
Обе приведённых выше команды не так уж и сложны. Но если бы мы воспользовались «обёрткой» в виде Makefile, которая давала бы нам интерфейс в виде простых команд и сама бы вызывала подобные длинные команды, то тех же результатов можно было бы добиться так:
make db-shell
Совершенно очевидно то, что использование Makefile значительно упрощает работу с контейнерами!
На основе вышерассмотренной схемы проекта создадим следующий файл docker-compose.yml:
version: '3.3'
services:
api:
build: .
image: mywebimage:0.0.1
ports:
- 8080:8080
volumes:
- /app/node_modules/
depends_on:
- timescale
command: npm run dev
networks:
- webappnetwork
timescale:
image: timescale/timescaledb-postgis:latest-pg11
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
volumes:
- ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
networks:
- webappnetwork
ping:
image: willfarrell/ping
environment:
HOSTNAME: "localhost"
TIMEOUT: 300
networks:
webappnetwork:
driver: bridge
Для управления конфигурацией Docker Compose и для взаимодействия с контейнерами, которые она описывает, создадим следующий файл Makefile:
THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
make -pRrq -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
docker-compose -f docker-compose.yml build $(c)
up:
docker-compose -f docker-compose.yml up -d $(c)
start:
docker-compose -f docker-compose.yml start $(c)
down:
docker-compose -f docker-compose.yml down $(c)
destroy:
docker-compose -f docker-compose.yml down -v $(c)
stop:
docker-compose -f docker-compose.yml stop $(c)
restart:
docker-compose -f docker-compose.yml stop $(c)
docker-compose -f docker-compose.yml up -d $(c)
logs:
docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
docker-compose -f docker-compose.yml ps
login-timescale:
docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Большинство описанных здесь команд применяются ко всем контейнерам, но использование опции c= позволяет ограничить область действия команды до одного контейнера.
После того, как Makefile готов, пользоваться им можно так:
make help — выдача перечня всех команд, доступных для make.
Справка по доступным командам
make build — сборка образа из Dockerfile. В нашем примере мы использовали существующие образы timescale и ping. Но образ api мы хотим собрать локально. Именно это и будет сделано после выполнения данной команды.
Сборка контейнера Docker
make start — запуск всех контейнеров. Для запуска лишь одного контейнера можно воспользоваться командой вида make start c=timescale.
Запуск контейнера timescale

Запуск контейнера ping
make login-timescale — вход в bash-сессию контейнера timescale.
Запуск bash в контейнере timescale
make db-shell — вход в psql в контейнере timescale для выполнения SQL-запросов к базе данных.
Запуск psql в контейнере timescaledb
make stop — остановка контейнеров.
Остановка контейнера timescale
make down — остановка и удаление контейнеров. Для удаления конкретного контейнера можно использовать эту команду с указанием нужного контейнера. Например — make down c=timescale или make down c=api.
Остановка и удаление всех контейнеров
Несмотря на то, что система Docker Compose даёт в наше распоряжение обширный набор команд, предназначенных для управления контейнерами, иногда эти команды становятся длинными, в результате их бывает сложно запомнить.
Методика использования Makefile помогла нам наладить быстрое и простое взаимодействие с контейнерами из файла docker-compose.yml. А именно, речь идёт о следующем:
docker-compose.yml, работе не мешают другие запущенные контейнеры.make help и получить справку по доступным командам.docker-compose -f docker-compose.yml exec timescale psql -Upostgres превращается в make db-shell.Makefile можно, по мере роста проекта, гибко под него подстраивать. Например, в него несложно добавить команду для создания резервной копии базы данных или для выполнения любого другого действия.Makefile, это упорядочивает совместную работу и снижает количество ошибок.P.S. В нашем маркетплейсе [5] имеется образ Docker [6], который устанавливается в один клик. Вы можете проверить работу контейнеров на VPS [7]. Всем новым клиентам бесплатно предоставляются 3 дня для тестирования.
Уважаемые читатели! Как вы автоматизируете работу с Docker Compose?
Автор: ru_vds
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/345438
Ссылки в тексте:
[1] Image: https://habr.com/ru/company/ruvds/blog/486682/
[2] Docker: https://www.docker.com/
[3] Docker Compose: https://docs.docker.com/compose/
[4] Phony targets: https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html
[5] маркетплейсе: https://ruvds.com/ru-rub/marketplace#order
[6] Docker: https://ruvds.com/ru-rub/marketplace/docker#advantages
[7] VPS: https://ruvds.com/
[8] Image: https://ruvds.com/ru-rub/#order
[9] Источник: https://habr.com/ru/post/486682/?utm_source=habrahabr&utm_medium=rss&utm_campaign=486682
Нажмите здесь для печати.