Každých pár rokov sa v priemysle vývoja softvéru mení paradigma. Jedným z takýchto javov je rastúci záujem o koncept mikroservisov. Hoci mikroservisy nie sú úplne nová technológia, ich popularita v poslednej dobe doslova vystúpila do výšin.
Veľké monolitické služby dnes nahrádzajú nezávislé autonómne mikroservisy. Mikroservis možno považovať za aplikáciu, ktorá slúži jedinému a veľmi špecifickému účelu. Napríklad — to môže byť relačná databázová sústava, aplikácia Express, služba Solr.
V dnešnej dobe si ťažko predstaviť vývoj nového softvérového systému bez použitia mikroservisov. A táto situácia nás, na druhej strane, vedie k platforme Docker.
Docker
Platforma , pri vývoji a nasadzovaní mikroservisov, sa stala prakticky priemyselným štandardom. Na stránke projektu sa môžete dozvedieť, že Docker je jediná nezávislá platforma kontajnerizácie, ktorá organizáciám umožňuje bez väčších ťažkostí vytvárať akékoľvek aplikácie, ako aj ich distribuovať a spúšťať v akýchkoľvek prostrediach — od hybridných cloudov po hraničné systémy.
Docker Compose
Technológia je určená na konfiguráciu viackontajnerových aplikácií. V projektoch Docker Compose môže byť zahrnutých toľko kontajnerov Docker, koľko je potrebné tvorcovi tohto projektu.
Pri práci s Docker Compose na nastavenie služieb aplikácie a organizovanie ich vzájomného prepojenia sa používa YAML súbor. Docker Compose je tak nástroj na popis a spúšťanie viackontajnerových aplikácií Docker.

Dva kontajnery, ktoré bežia na hostiteľskom systéme
GNU Make
Program make, v podstate predstavuje nástroj na automatizáciu zostavovania programov a knižníc zo zdrojového kódu. Vo všeobecnosti môžeme povedať, že make je aplikovateľná na akýkoľvek proces, ktorý zahŕňa vykonávanie ľubovoľných príkazov na transformáciu určitých zdrojových materiálov na určitý výsledný tvar, na určitý cieľ. V našom prípade príkazy docker-compose budú transformované na abstraktné ciele ().
Aby sme programu make povedali, čo od neho chceme, potrebujeme súbor Makefile.
V našom Makefile budú obsiahnuté bežné príkazy docker a docker-compose, ktoré sú určené na riešenie rôznych úloh. Hovoríme o zostavení kontajnera, jeho spustení, zastavení, reštarte, organizácii prístupu používateľa do kontajnera, práci s logmi kontajnera a riešení iných podobných úloh.
Typické príklady použitia Docker Compose
Predstavme si bežnú webovú aplikáciu, ktorá má nasledujúce komponenty:
- Databáza TimescaleDB (Postgres).
- Aplikácia Express.js.
- Ping (len kontajner, ktorý nič zvláštne nerobí).
Táto aplikácia bude potrebovať 3 kontajnery Docker a súbor docker-compose, ktorý obsahuje pokyny na riadenie týchto kontajnerov. Každý z kontajnerov bude mať rôzne body interakcie. Napríklad s kontajnerom timescale sa bude môcť pracovať podobne ako s databázami. A to znamená, že umožňuje vykonávať nasledujúce činnosti:
- Prístup do shellu Postgres.
- Import a export tabuliek.
- Vytvorenie
pg_dumptabuliek alebo databáz.
Kontajner aplikácie Express.js, expressjs, môže mať nasledujúce možnosti:
- Poskytovanie čerstvých údajov zo systémového denníka.
- Prístup do shellu na vykonávanie určitých príkazov.
Interakcia s kontajnermi
Po nastavení spojenia medzi kontajnermi pomocou Docker Compose je čas na zriadenie interakcie s týmito kontajnermi. V rámci systému Docker Compose existuje príkaz docker-compose, ktorý podporuje možnosť -f, ktorá umožňuje systému odovzdať súbor docker-compose.yml.
Využitím možností tejto voľby môžeme obmedziť interakciu so systémom len na tie kontajnery, ktoré sú uvedené v súbore. docker-compose.yml.
Pozrime sa, ako vyzerajú interakcie s kontajnermi pri používaní príkazov docker-compose. Ak si predstavíme, že potrebujeme vstúpiť do shellu psql, potom môžu príslušné príkazy vyzerať takto:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres Ten istý príkaz, pre ktorý sa nepoužíva docker-compose, a docker, môže vyzerať takto:
docker exec -it edp_timescale_1 psql -Upostgres Upozorňujeme, že v týchto prípadoch je vždy lepšie použiť príkaz docker, a nie príkaz docker-compose, pretože to eliminuje potrebu pamätať si mená kontajnerov.
Obe uvedené príkazy nie sú až tak zložité. Ale keby sme použili 'obal' vo forme Makefile, ktorá by nám poskytovala rozhranie vo forme jednoduchých príkazov a sama by volala podobné dlhé príkazy, takto by bolo možné dosiahnuť tie isté výsledky:
make db-shell Je úplne jasné, že použitie Makefile výrazne zjednodušuje prácu s kontajnermi!
Pracovný príklad
Na základe vyššie uvedeného schémy projektu vytvoríme nasledujúci súbor 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 Na správu konfigurácie Docker Compose a na interakciu s kontajnermi, ktoré opisuje, vytvoríme nasledujúci súbor 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 Väčšina tu popísaných príkazov sa uplatňuje na všetky kontajnery, ale použitie možnosti c= umožňuje obmedziť rozsah príkazu na jeden kontajner.
Po tom, čo Makefile je pripravené, môže sa používať takto:
make help— výstup zoznamu všetkých príkazov dostupných premake.

Pomoc k dostupným príkazom
make build— zostavovanie obrazu zDockerfile. V našom príklade sme použili existujúce obrazytimescaleaping. Ale obrazapichceme zostaviť lokálne. Presne to sa bude robiť po vykonaní tejto príkazu.

Zostavenie kontajnera Docker
make start— spustenie všetkých kontajnerov. Na spustenie len jedného kontajnera môžeme použiť príkaz vo formemake start c=timescale.

Spustenie kontajnera timescale

Spustenie kontajnera ping
make login-timescale— prihlásenie do bash relácie kontajneratimescale.

Spustenie bash v kontajneri timescale
make db-shell— prihlásenie dopsqlkontajneratimescalena vykonávanie SQL dopytov na databáze.

Spustenie psql v kontajneri timescaledb
make stop— zastavenie kontajnerov.
![]()
Zastavenie kontajnera timescale
make down— zastavenie a odstránenie kontajnerov. Na odstránenie konkrétneho kontajnera môžeme použiť tento príkaz s uvedením požadovaného kontajnera. Napríklad —make down c=timescalealebomake down c=api.

Zastavenie a odstránenie všetkých kontajnerov
Zhrnutie
Napriek tomu, že systém Docker Compose nám poskytuje rozsiahly súbor príkazov na správu kontajnerov, niekedy sa tieto príkazy stávajú dlhými, čo sťažuje ich zapamätanie.
Metodika použitia Makefile nám pomohla zabezpečiť rýchlu a jednoduchú interakciu s kontajnermi zo súboru docker-compose.yml. A konkrétne ide o nasledujúce:
- Vývojár interaguje iba s kontajnermi projektu, opísanými v
docker-compose.yml, ostatné spustené kontajnery mu neprekážajú. - V prípade, že si nejaký príkaz zabudneme, môžeme vykonať príkaz
make helpa získať pomoc k dostupným príkazom. - Nie je potrebné zapamätať si dlhé zoznamy argumentov na vykonávanie takých činností, ako je získavanie nových záznamov v logoch alebo prihlasovanie do systému. Napríklad príkaz vo forme
docker-compose -f docker-compose.yml exec timescale psql -Upostgressa transformuje namake db-shell. - Súbor
Makefilesa môže, ako projekt rastie, flexibilne prispôsobovať. Napríklad, nie je ťažké pridať príkaz na zálohovanie databázy alebo vykonávanie inej operácie. - Ak veľká skupina vývojárov používa ten istý
Makefile, usporadúva to spoluprácu a znižuje množstvo chýb.
P.S. V našom existuje obraz , ktorý sa inštaluje jedným kliknutím. Môžete skontrolovať fungovanie kontajnerov na . Všetkým novým klientom sú bezplatne poskytnuté 3 dni na testovanie.
Vážení čitatelia! Ako automatizujete prácu s Docker Compose?
Zdroj: habr.com
