Každých několik let se v oblasti vývoje software objevuje změna paradigmatu. Jedním z takových jevů je nárůst zájmu o koncept mikroslužeb. Přestože mikroslužby nejsou zcela novou technologií, jejich popularita v poslední době doslova vzrostla do nebe.
Velké monolitické služby v dnešní době nahrazují nezávislé autonomní mikroslužby. Mikroslužba může být považována za aplikaci, která slouží jednomu konkrétnímu a velmi specifickému účelu. Například to může být relační databázový systém, aplikace Express nebo služba Solr.
Dnes je těžké si představit vývoj nového softwarového systému bez použití mikroslužeb. Tato situace nás zase vede k platformě Docker.
Docker
Platforma , v oblasti vývoje a nasazení mikroslužeb, se stala prakticky průmyslovým standardem. Na stránkách projektu se lze dozvědět, že Docker je jediná nezávislá platforma pro kontejnerizaci, která organizacím umožňuje bez větší námahy vytvářet jakékoliv aplikace a také je distribuovat a spouštět v jakýchkoliv prostředích – od hybridních cloudů až po okrajové systémy.
Docker Compose
Technologie slouží k konfiguraci vícetekutních aplikací. V projektu Docker Compose může být zahrnuto tolik kontejnerů Docker, kolik potřebuje tvůrce tohoto projektu.
Při práci s Docker Compose se pro nastavení služeb aplikace a organizaci jejich spolupráce používá YAML soubor. Docker Compose je tedy nástroj pro popis a spuštění vícetekutních aplikací Docker.

Dva kontejnery běžící na hostitelském systému
GNU Make
Program make, v podstatě představuje nástroj pro automatizaci sestavování programů a knihoven ze zdrojového kódu. Obecně lze říci, že make se vztahuje na jakýkoliv proces, který zahrnuje vykonávání libovolných příkazů za účelem transformace určitých vstupních materiálů do určitého výsledného stavu, k určitému cíli. V našem případě příkazy docker-compose budou transformovány na abstraktní cíle ().
Abychom programu make sdělili, co od něj chceme, budeme potřebovat soubor Makefile.
V našem Makefile obsahující běžné příkazy docker a docker-compose, které jsou určeny k řešení mnoha úloh. Konkrétně jde o sestavení kontejneru, jeho spuštění, zastavení, restartování, organizaci přístupu uživatele do kontejneru, práci s logy kontejneru a řešení dalších podobných úloh.
Typické možnosti použití Docker Compose
Představme si běžnou webovou aplikaci, která obsahuje následující komponenty:
- Databáze TimescaleDB (Postgres).
- Aplikace Express.js.
- Ping (obecký kontejner, který nic zvláštního nedělá).
Této aplikaci budou potřeba 3 kontejnery Docker a soubor docker-compose, který obsahuje pokyny pro řízení těchto kontejnerů. Každý z kontejnerů bude mít různé interakční body. Například s kontejnerem timescale se bude pracovat zhruba tak, jak se pracuje s databázemi. To zahrnuje následující akce:
- Přístup do shellu Postgres.
- Import a export tabulek.
- Tvorba
pg_dumptabulky nebo databáze.
Kontejner aplikace Express.js, expressjs, může mít následující funkce:
- Poskytování aktuálních dat z systémového logu.
- Přístup do shellu pro vykonávání příkazů.
Interakce s kontejnery
Jakmile jsme nastavili propojení mezi kontejnery pomocí Docker Compose, je čas nastavit interakci s těmito kontejnery. V rámci systému Docker Compose existuje příkaz docker-compose, který podporuje volbu -f, která umožňuje systému předat soubor docker-compose.yml.
Pomocí této volby můžeme omezit interakci se systémem pouze na ty kontejnery, které jsou uvedeny v souboru docker-compose.yml.
Podívejme se, jak vypadají interakce s kontejnery při použití příkazů docker-compose. Pokud předpokládáme, že potřebujeme vstoupit do shellu psql, odpovídající příkazy mohou vypadat takto:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres Tentýž příkaz, pro jehož provedení se používá pouze docker-compose, a docker, může vypadat takto:
docker exec -it edp_timescale_1 psql -Upostgres Všimněte si, že v takových případech je vždy lepší použít příkaz docker, než příkaz docker-compose, protože to eliminuje potřebu pamatovat si jména kontejnerů.
Obě výše uvedené příkazy nejsou příliš složité. Ale kdybychom využili "obal" v podobě Makefile, který by nám poskytoval rozhraní ve formě jednoduchých příkazů a sám by volal podobné dlouhé příkazy, by bylo možné dosáhnout stejných výsledků takto:
make db-shell Je zcela zřejmé, že použití Makefile výrazně zjednodušuje práci s kontejnery!
Ukázkový příklad
Na základě výše uvedeného schématu projektu vytvoříme následující soubor 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 Pro řízení konfigurace Docker Compose a pro interakci s kontejnery, které popisuje, vytvoříme následující soubor 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ětšina zde popsaných příkazů se vztahuje na všechny kontejnery, ale použití volby c= umožňuje omezit účinnost příkazu na jeden kontejner.
Jakmile je Makefile hotový, lze ho použít takto:
make help— výpis seznamu všech příkazů dostupných promake.

Nápověda k dostupným příkazům
make build— vytvoření obrazu zeDockerfile. V našem příkladu jsme použili existující obrazytimescaleaping. Ale obrazapikterý chceme sestavit lokálně. Toho dosáhneme po provedení tohoto příkazu.

Sestavení kontejneru Docker
make start— spuštění všech kontejnerů. Pro spuštění pouze jednoho kontejneru lze použít příkaz typumake start c=timescale.

Spuštění kontejneru timescale

Spuštění kontejneru ping
make login-timescale— přihlášení do bash sezení kontejnerutimescale.

Spuštění bash v kontejneru timescale
make db-shell— přihlášení dopsqlv kontejnerutimescalepro vykonávání SQL dotazů na databázi.

Spuštění psql v kontejneru timescaledb
make stop— zastavení kontejnerů.
![]()
Zastavení kontejneru timescale
make down— zastavení a odstranění kontejnerů. Pro odstranění konkrétního kontejneru lze použít tento příkaz se specifikací požadovaného kontejneru. Například —make down c=timescalenebomake down c=api.

Zastavení a odstranění všech kontejnerů
Závěry
I když systém Docker Compose poskytuje rozsáhlou sadu příkazů určených pro správu kontejnerů, někdy se tyto příkazy stávají dlouhými, což ztěžuje jejich zapamatování.
Metoda použití Makefile nám pomohla nastavit rychlou a jednoduchou interakci s kontejnery z souboru docker-compose.yml. A to konkrétně znamená:
- Vývojář interaguje pouze s kontejnery projektu popsanými v
docker-compose.yml, práce nejsou rušena dalšími spuštěnými kontejnery. - V případě, že je nějaký příkaz zapomenut, lze vykonat příkaz
make helpa získat pomoc s dostupnými příkazy. - Není třeba si zapamatovat dlouhé seznamy argumentů pro provádění takových akcí, jako je získání čerstvých záznamů protokolu nebo přihlášení do systému. Například příkaz typu
docker-compose -f docker-compose.yml exec timescale psql -Upostgresse mění namake db-shell. - Soubor
Makefilese dá při růstu projektu flexibilně přizpůsobovat. Například je snadné přidat příkaz pro vytvoření zálohy databáze nebo pro provedení jakéhokoli jiného kroku. - Pokud velký tým vývojářů používá stejný
Makefile, to usnadňuje spolupráci a snižuje počet chyb.
P.S. V našem existuje obraz , který se instaluje jedním kliknutím. Můžete zkontrolovat funkčnost kontejnerů na . Všem novým klientům se poskytují 3 dny testování zdarma.
Vážení čtenáři! Jak automatizujete práci s Docker Compose?
Zdroj: habr.com
