Кожныя некалькі гадоў у індустрыі распрацоўкі ПЗ адбываецца змена парадыгмы. Адной з такіх з'яў можна прызнаць рост цікавасці да канцэпцыі мікрасэрвісаў. Хоць мікрасэрвісы – гэта тэхналогія не самая новая, толькі ў апошні час яе папулярнасць літаральна ўзляцела да нябёсаў.
Вялікія маналітныя сэрвісы ў нашы дні замяняюць незалежнымі аўтаномнымі мікрасэрвісамі. Мікрасэрвіс можна разглядаць як дадатак, якое служыць адзінай і вельмі спецыфічнай мэты. Напрыклад - гэта можа быць рэляцыйная СКБД, Express-дадатак, Solr-сэрвіс.
У нашы дні складана ўявіць сабе распрацоўку новай праграмнай сістэмы без ужывання мікрасэрвісаў. А гэтая сітуацыя, у сваю чаргу, вядзе нас да платформы Docker.
Докер
Платформа , у справе распрацоўкі і разгортвання мікрасэрвісаў, стала практычна індустрыяльным стандартам. На сайце праекта можна даведацца аб тым, што Docker - гэта адзіная незалежная платформа кантэйнерызацыі, якая дазваляе арганізацыям без асаблівых намаганняў ствараць любыя прыкладанні, а таксама распаўсюджваць і запускаць іх у любых асяроддзях - ад гібрыдных аблокаў, да памежных сістэм.
Docker Compose
Тэхналогія прызначана для канфігуравання шматкантэйнерных прыкладанняў. У Docker Compose-праект можа ўваходзіць гэтулькі кантэйнераў Docker, колькі трэба стваральніку гэтага праекту.
Пры працы з Docker Compose для налады сэрвісаў прыкладання і арганізацыі іх узаемадзеяння сябар з сябрам выкарыстоўваецца YAML-файл. Docker Compose, такім чынам, гэта прылада для апісання і запуску шматкантэйнерных прыкладанняў Docker.

Два кантэйнера, якія працуюць на хост-сістэме
Зрабіць GNU
Праграма make, па сутнасці, уяўляе сабой інструмент для аўтаматызацыі зборкі праграм і бібліятэк з зыходнага кода. У цэлым, можна казаць аб тым, што make дастасавальная да любога працэсу, які складаецца з выкананне адвольных каманд для пераўтварэння некаторых зыходных матэрыялаў да нейкага выніковага выгляду, да нейкай мэты. У нашым выпадку каманды docker-compose будуць пераўтварацца ў абстрактныя мэты ().
Для таго каб паведаміць праграме make пра тое, чаго мы ад яе жадаем, нам спатрэбіцца файл Makefile.
У нашым Makefile будуць утрымлівацца звычайныя каманды docker и docker-compose, якія прызначаны для вырашэння мноства задач. У прыватнасці, гаворка ідзе аб зборцы кантэйнера, аб яго запуску, прыпынку, перазапуску, аб арганізацыі ўваходу карыстальніка ў кантэйнер, аб працы з логамі кантэйнера і аб рашэнні іншых падобных задач.
Тыповыя варыянты выкарыстання Docker Compose
Уявім сабе звычайны вэб-дадатак, у якім маюцца наступныя кампаненты:
- База даных TimescaleDB (Postgres).
- Express.js-дадатак.
- Ping (проста кантэйнер, нічога асаблівага не які робіць).
Гэтаму з дадаткам спатрэбіцца 3 кантэйнера Docker і файл docker-compose, які змяшчае інструкцыі па кіраванні гэтымі кантэйнерамі. Кожны з кантэйнераў будзе валодаць рознымі кропкамі ўзаемадзеяння. Напрыклад, з кантэйнерам timescale можна будзе працаваць прыкладна так, як працуюць з базамі даных. У прыватнасці, ён дазваляе выконваць наступныя дзеянні:
- Уваход у абалонку Postgres.
- Імпарт і экспарт табліц.
- стварэнне
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, гэта парадкуе сумесную працу і зніжае колькасць памылак.
PS У нашым маецца вобраз , Які ўстанаўліваецца ў адзін клік. Вы можаце праверыць працу кантэйнераў на . Усім новым кліентам бясплатна прадастаўляюцца 3 дні для тэсціравання.
Паважаныя чытачы! Як вы аўтаматызуеце працу з Docker Compose?
Крыніца: habr.com
