Кожныя некалькі гадоў у індустрыі распрацоўкі ПЗ адбываецца змена парадыгмы. Адной з такіх з'яў можна прызнаць рост цікавасці да канцэпцыі мікрасэрвісаў. Хоць мікрасэрвісы – гэта тэхналогія не самая новая, толькі ў апошні час яе папулярнасць літаральна ўзляцела да нябёсаў.
Вялікія маналітныя сэрвісы ў нашы дні замяняюць незалежнымі аўтаномнымі мікрасэрвісамі. Мікрасэрвіс можна разглядаць як дадатак, якое служыць адзінай і вельмі спецыфічнай мэты. Напрыклад - гэта можа быць рэляцыйная СКБД, Express-дадатак, Solr-сэрвіс.
У нашы дні складана ўявіць сабе распрацоўку новай праграмнай сістэмы без ужывання мікрасэрвісаў. А гэтая сітуацыя, у сваю чаргу, вядзе нас да платформы Docker.
Докер
Платформа
Docker Compose
Тэхналогія
Пры працы з 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 У нашым
Паважаныя чытачы! Як вы аўтаматызуеце працу з Docker Compose?
Крыніца: habr.com