Každých pár rokov prechádza priemysel vývoja softvéru zmenou paradigmy. Jedným z týchto fenoménov je rastúci záujem o koncept mikroslužieb. Hoci mikroslužby nie sú najnovšou technológiou, len v poslednom čase ich obľuba doslova raketovo stúpa.
Veľké monolitické služby sú teraz nahradené nezávislými, autonómnymi mikroslužbami. Mikroslužbu si možno predstaviť ako aplikáciu, ktorá slúži jedinému a veľmi špecifickému účelu. Môže to byť napríklad relačná DBMS, expresná aplikácia, služba Solr.
V súčasnosti je ťažké predstaviť si vývoj nového softvérového systému bez použitia mikroslužieb. A táto situácia nás zasa vedie k platforme Docker.
prístavný robotník
Platforma
Docker Compose
Технология
Pri práci s Docker Compose sa súbor YAML používa na konfiguráciu aplikačných služieb a organizovanie ich vzájomnej interakcie. Docker Compose je teda nástroj na popis a spustenie viackontajnerových aplikácií Docker.
Dva kontajnery bežiace na hostiteľskom systéme
Značka GNU
Program make
, je v podstate nástrojom na automatizáciu vytvárania programov a knižníc zo zdrojového kódu. Vo všeobecnosti to môžeme povedať make
sa vzťahuje na akýkoľvek proces, ktorý zahŕňa vykonávanie ľubovoľných príkazov na transformáciu niektorých vstupných materiálov do určitej výstupnej formy na nejaký účel. V našom prípade príkazy docker-compose
sa premení na abstraktné ciele (
Ak chcete povedať programu make
o tom, čo od toho chceme, potrebujeme súbor Makefile
.
V našom Makefile
bude obsahovať bežné príkazy docker
и docker-compose
, ktoré sú určené na riešenie mnohých problémov. Konkrétne hovoríme o zostavení kontajnera, o jeho spustení, zastavení, reštarte, o organizácii prihlásenia používateľa do kontajnera, o práci s protokolmi kontajnera a o riešení iných podobných problémov.
Typické prípady použitia pre 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, nerobí nič zvláštne).
Táto aplikácia bude potrebovať 3 kontajnery Docker a súbor docker-compose
, ktorý obsahuje pokyny na správu týchto kontajnerov. Každý kontajner bude mať iné kontaktné body. Napríklad s nádobou timescale
bude možné pracovať približne rovnako, ako pracujú s databázami. Konkrétne vám umožňuje vykonávať nasledujúce akcie:
- Prihlásenie do shellu Postgres.
- Import a export tabuliek.
- tvorba
pg_dump
tabuľky alebo databázy.
kontajner aplikácie Express.js, expressjs
, môže mať nasledujúce schopnosti:
- Poskytovanie čerstvých údajov zo systémového denníka.
- Ak chcete vykonať určité príkazy, prihláste sa do shellu.
Interakcia s kontajnermi
Keď sme nastavili komunikáciu medzi kontajnermi pomocou Docker Compose, je čas komunikovať s týmito kontajnermi. V rámci systému Docker Compose existuje príkaz docker-compose
, podporná možnosť -f
, ktorý umožňuje preniesť súbor do systému docker-compose.yml
.
Pomocou možností tejto voľby môžete 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 sa potrebujeme prihlásiť do shellu psql
, potom môžu zodpovedajúce príkazy vyzerať takto:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Rovnaký príkaz, ktorý sa nepoužíva na vykonanie docker-compose
A docker
, môže vyzerať takto:
docker exec -it edp_timescale_1 psql -Upostgres
Upozorňujeme, že v takýchto prípadoch je vždy vhodnejšie použiť príkaz docker
a príkaz docker-compose
, pretože to eliminuje potrebu pamätať si názvy kontajnerov.
Oba vyššie uvedené príkazy nie sú také ťažké. Ale ak by sme vo forme použili „obal“. Makefile
, ktorý by nám poskytol rozhranie vo forme jednoduchých príkazov a sám by volal podobné dlhé príkazy, potom by sa dali dosiahnuť rovnaké výsledky takto:
make db-shell
Je úplne zrejmé, že použitie Makefile
značne uľahčuje prácu s nádobami!
Pracovný príklad
Na základe vyššie uvedenej 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 spravovanie konfigurácie Docker Compose a interakciu s kontajnermi, ktoré popisuje, 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 vzťahuje na všetky kontajnery, ale s použitím voľby c=
umožňuje obmedziť rozsah príkazu na jeden kontajner.
potom, čo Makefile
pripravený, môžete ho použiť takto:
make help
— vydanie zoznamu všetkých dostupných príkazovmake
.
Pomoc s dostupnými príkazmi
make build
- zostavenie obrazu zDockerfile
. V našom príklade sme použili existujúce obrázkytimescale
иping
. Ale obrazapi
chceme zbierať lokálne. To je presne to, čo sa stane po vykonaní tohto príkazu.
Vytvorenie kontajnera Docker
make start
— spustenie všetkých kontajnerov. Ak chcete spustiť iba jeden kontajner, môžete použiť príkaz akomake start c=timescale
.
Spustenie kontajnera časovej mierky
Spustenie pingového kontajnera
make login-timescale
— prihláste sa do bash relácie kontajneratimescale
.
Spustený bash v časovom kontajneri
make db-shell
- vchod dopsql
v nádobetimescale
na vykonanie SQL dotazov proti databáze.
Spustenie psql v kontajneri timescaledb
make stop
— zastavenie nádob.
Zastavenie kontajnera časovej mierky
make down
— zastavovanie a odstraňovanie nádob. Ak chcete odstrániť konkrétny kontajner, môžete použiť tento príkaz špecifikujúci požadovaný kontajner. Napríklad -make down c=timescale
alebomake down c=api
.
Zastavenie a odstránenie všetkých kontajnerov
Výsledky
Hoci nám Docker Compose poskytuje bohatú sadu príkazov na správu kontajnerov, niekedy môžu byť tieto príkazy dlhé a ťažko zapamätateľné.
Spôsob použitia Makefile
nám pomohol vytvoriť rýchlu a jednoduchú interakciu s kontajnermi zo súboru docker-compose.yml
. Konkrétne hovoríme o nasledujúcom:
- Vývojár komunikuje iba s projektovými kontajnermi opísanými v
docker-compose.yml
, práci neprekážajú iné bežiace kontajnery. - V prípade zabudnutia určitého príkazu môžete príkaz vykonať
make help
a získajte pomoc s dostupnými príkazmi. - Nemusíte si pamätať dlhé zoznamy argumentov na vykonanie akcií, ako je získanie najnovších záznamov denníka alebo prihlásenie do systému. Napríklad príkaz ako
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
zákruty domake db-shell
. - súbor
Makefile
Môžete sa mu flexibilne prispôsobiť podľa toho, ako projekt rastie. Napríklad je jednoduché pridať príkaz na vytvorenie zálohy databázy alebo vykonať akúkoľvek inú akciu. - Ak to isté používa veľký tím vývojárov
Makefile
, to zefektívňuje spoluprácu a znižuje chyby.
PS V našom
Vážení čitatelia! Ako automatizujete Docker Compose?
Zdroj: hab.com