Vsakih nekaj let v industriji razvoja programske opreme pride do spremembe paradigme. Ena izmed takih pojavov je lahko rast zanimanja za koncept mikrostoritev. Čeprav mikrostoritve niso povsem nova tehnologija, je njihova priljubljenost v zadnjem času dobesedno eksplodirala.
Velike monolitne storitve v današnjem času nadomeščajo neodvisne avtonomne mikrostoritve. Mikrostoritev lahko obravnavamo kot aplikacijo, ki služi eni sami in zelo specifični funkciji. Na primer, to je lahko relacijska baza podatkov, aplikacija Express, storitev Solr.
Danes je težko si predstavljati razvoj nove programske rešitve brez uporabe mikrostoritev. Ta situacija nas vodi do platforme Docker.
Docker
Platforma , pri razvoju in uvajanju mikrostoritev, je postalo skoraj industrijski standard. Na spletni strani projekta lahko izveste, da je Docker edina neodvisna platforma za kontejnerizacijo, ki omogoča organizacijam, da brez velikih težav ustvarjajo kakršne koli aplikacije in jih distribuirajo ter izvajajo v različnih okoljih – od hibridnih oblakov do obrobnih sistemov.
Docker Compose
Tehnologija je namenjena konfiguraciji večkontejnerskih aplikacij. V projekt Docker Compose lahko vključimo toliko Docker kontejnerjev, kolikor jih potrebuje ustvarjalec tega projekta.
Pri delu z Docker Compose za nastavitev storitev aplikacije in organizacijo njihove medsebojne interakcije se uporablja datoteka YAML. Docker Compose je torej orodje za opisovanje in zagon večkontejnerskih aplikacij Docker.

Dva kontejnerja, ki delujeta na gostiteljski sistem
GNU Make
Program make, je v osnovi orodje za avtomatizacijo gradnje programov in knjižnic iz izvorne kode. Na splošno lahko rečemo, da make se uporablja za vsak proces, ki vključuje izvajanje poljubnih ukazov za pretvorbo določenih izvornih materialov v določen končni izgled, z določenim ciljem. V našem primeru se bodo ukazi docker-compose pretvarjali v abstraktne cilje ().
Da sporočimo programu make kaj pričakujemo od njega, potrebujemo datoteko Makefile.
V našem Makefile bodo vsebovane običajne ukaze docker in docker-compose, ki so namenjene reševanju številnih nalog. Natančneje, govorimo o sestavljanju kontejnerja, njegovem zagonu, ustavitvi, ponovnem zagonu, organizaciji prijave uporabnika v kontejner, delu z logi kontejnerja in reševanju drugih podobnih nalog.
Tipični scenariji uporabe Docker Compose
Predstavljajmo si običajno spletno aplikacijo, ki ima naslednje komponente:
- Baza podatkov TimescaleDB (Postgres).
- Express.js aplikacija.
- Ping (samo kontejner, ki ne počne nič posebnega).
Ta aplikacija bo potrebovala 3 Docker kontejnerje in datoteko docker-compose, ki vsebuje navodila za upravljanje s tema kontejnerjema. Vsak od kontejnerjev bo imel različne točke interakcije. Na primer, s kontejnerjem timescale lahko delamo približno tako, kot delamo z bazami podatkov. Natančneje, omogoča izvajanje naslednjih dejanj:
- Vstop v Postgres lupino.
- Uvoz in izvoz tabel.
- Ustvarjanje
pg_dumptabele ali baz podatkov.
Kontejner Express.js aplikacije, expressjs, lahko ima naslednje možnosti:
- Zagotavljanje svežih podatkov iz sistemskega dnevnika.
- Vstop v lupino za izvajanje nekaterih ukazov.
Interakcija s kontejnami
Ko smo nastavili povezavo med kontejnerji z uporabo Docker Compose, je čas, da vzpostavimo interakcijo s temi kontejnerji. V okviru sistema Docker Compose je ukaz docker-compose, ki podpira možnost -f, ki omogoča, da sistemu predamo datoteko docker-compose.yml.
Z uporabo te možnosti lahko omejimo interakcijo z sistemom samo na tiste kontejnerje, ki so omenjeni v datoteki docker-compose.yml.
Oglejmo si, kako izgledajo interakcije s kontejnerji pri uporabi ukazov docker-compose. Če predpostavimo, da moramo vstopiti v lupino psql, bi lahko ustrezni ukazi izgledali takole:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres Ista ukazna vrstica, za izvedbo katere ne uporabljamo docker-compose, a docker, bi lahko izgledala takole:
docker exec -it edp_timescale_1 psql -Upostgres Upoštevajte, da je v takih primerih vedno bolje uporabiti ukaz docker, namesto ukaza docker-compose, saj to odpravlja potrebo po pomnjenju imen kontejnerjev.
Obe zgoraj navedeni ukazni vrstici nista pravzaprav tako zapleteni. Toda če bi uporabili 'ovitek' v obliki Makefile, ki bi nam dala vmesnik v obliki preprostih ukazov in sama klicala dolge ukaze, bi lahko dosegli podobne rezultate tako:
make db-shell Očitno je, da uporaba Makefile znatno poenostavi delo z vsebniki!
Delovni primer
Na podlagi prej obravnavane sheme projekta bomo ustvarili naslednjo datoteko 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 Za upravljanje z konfiguracijo Docker Compose in za interakcijo z vsebnikov, ki jih opisuje, bomo ustvarili naslednjo datoteko 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 Večina tukaj opisanih ukazov se uporablja za vse vsebnike, vendar uporaba možnosti c= omogoča omejitev obsega ukaza na en sam vsebnik.
Po tem, ko Makefile pripravljen, uporabite ga lahko tako:
make help— prikaz vseh dostopnih ukazov zamake.

Pomoč o dostopnih ukazih
make build— gradnja slike izDockerfile. V našem příkladu jsme použili existující obrazytimescaleinping. Ale obrazapichceme sestavit lokálně. Toho bude dosaženo 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 ve formátumake start c=timescale.

Spuštění kontejneru timescale

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

Spuštění bash v kontejneru timescale
make db-shell— přihlášení dopsqlv vsebnikutimescalepro provádě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 s určením konkrétního kontejneru. Například —make down c=timescaleilimake down c=api.

Zastavení a odstranění všech kontejnerů
Zaključki
I když systém Docker Compose nabízí širokou škálu příkazů určených pro správu kontejnerů, někdy se tyto příkazy stávají dlouhými a obtížně zapamatovatelnými.
Metodika použití Makefile nám pomohla usnadnit rychlou a jednoduchou interakci s kontejnery z souboru docker-compose.yml. A to konkrétně znamená:
- Vývojář interaguje pouze s kontejnerem projektu popsaným v
docker-compose.yml, ostatní spuštěné kontejnery práci neruší. - Pokud si někdo zapamatuje určitý příkaz, může provést příkaz
make helpa získat nápovědu k dostupným příkazům. - Není třeba si zapamatovat dlouhé seznamy argumentů pro provedení takových akcí, jako je získání čerstvých záznamů protokolu nebo přihlášení do systému. Například příkaz ve formátu
docker-compose -f docker-compose.yml exec timescale psql -Upostgresse mění namake db-shell. - unutar svakog kontejnera prema zadanim postavkama će izgledati ovako:
Makefilelze flexibilně přizpůsobit, jakmile projekt roste. Například není obtížné přidat příkaz pro vytvoření zálohy databáze nebo pro provedení jakékoli jiné akce. - 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 fungování kontejnerů na . Novým klientům je nabízena 3 dny testování zdarma.
Spoštovani bralci! Jak automatizujete práci s Docker Compose?
Izvor: habr.com
