Vsakih nekaj let se industrija razvoja programske opreme spremeni. Enega od teh pojavov lahko prepoznamo kot naraščajoče zanimanje za koncept mikrostoritev. Čeprav mikrostoritve niso najnovejša tehnologija, je šele v zadnjem času njihova priljubljenost dobesedno poskočila.
Velike monolitne storitve zdaj nadomeščajo neodvisne, avtonomne mikrostoritve. Mikrostoritev si lahko predstavljamo kot aplikacijo, ki služi enemu samemu in zelo specifičnemu namenu. Lahko je na primer relacijska DBMS, aplikacija Express, storitev Solr.
Te dni si je težko predstavljati razvoj novega programskega sistema brez uporabe mikrostoritev. In ta situacija nas posledično pripelje do platforme Docker.
Lučki delavec
platforma
Docker Compose
Технология
Pri delu z Docker Compose se datoteka YAML uporablja za konfiguracijo aplikacijskih storitev in organiziranje njihove medsebojne interakcije. Docker Compose je torej orodje za opisovanje in izvajanje aplikacij Docker z več vsebniki.
Dva vsebnika, ki se izvajata v gostiteljskem sistemu
Ustvari GNU
Program make
, je v bistvu orodje za avtomatizacijo gradnje programov in knjižnic iz izvorne kode. Na splošno lahko rečemo, da make
velja za vsak postopek, ki vključuje izvajanje poljubnih ukazov za pretvorbo nekaterih vhodnih materialov v neko izhodno obliko za določen namen. V našem primeru ukazi docker-compose
bodo preoblikovani v abstraktne cilje (
Povedati programu make
o tem, kaj želimo od tega, potrebujemo datoteko Makefile
.
V našem Makefile
bo vseboval običajne ukaze docker
и docker-compose
, ki so namenjeni reševanju številnih težav. Govorimo namreč o sestavljanju kontejnerja, o njegovem zagonu, zaustavitvi, ponovnem zagonu, o organizaciji prijave uporabnikov v kontejner, o delu s kontejnerskimi dnevniki in o reševanju drugih podobnih problemov.
Tipični primeri uporabe za Docker Compose
Predstavljajmo si običajno spletno aplikacijo, ki ima naslednje komponente:
- Baza podatkov TimescaleDB (Postgres).
- Aplikacija Express.js.
- Ping (samo vsebnik, ne dela nič posebnega).
Ta aplikacija potrebuje 3 vsebnike Docker in datoteko docker-compose
, ki vsebuje navodila za upravljanje teh zabojnikov. Vsak vsebnik bo imel različne stične točke. Na primer s posodo timescale
bo mogoče delati približno tako, kot delajo z bazami podatkov. Omogoča vam namreč izvajanje naslednjih dejanj:
- Prijava v lupino Postgres.
- Uvoz in izvoz tabel.
- ustvarjanje
pg_dump
tabel ali baz podatkov.
Vsebnik aplikacij Express.js, expressjs
, ima lahko naslednje zmožnosti:
- Zagotavljanje svežih podatkov iz sistemskega dnevnika.
- Za izvajanje določenih ukazov se prijavite v lupino.
Interakcija z vsebniki
Ko smo vzpostavili komunikacijo med vsebniki z uporabo Docker Compose, je čas za komunikacijo s temi vsebniki. V sistemu Docker Compose obstaja ukaz docker-compose
, podporna možnost -f
, ki omogoča prenos datoteke v sistem docker-compose.yml
.
Z zmožnostmi te možnosti lahko omejite interakcijo s sistemom samo na tiste vsebnike, ki so omenjeni v datoteki docker-compose.yml
.
Oglejmo si, kako so videti interakcije z vsebniki pri uporabi ukazov docker-compose
. Če si predstavljamo, da se moramo prijaviti v lupino psql
, bi lahko ustrezni ukazi izgledali takole:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Isti ukaz, ki se ne uporablja za izvedbo docker-compose
In docker
, lahko izgleda takole:
docker exec -it edp_timescale_1 psql -Upostgres
Upoštevajte, da je v takih primerih vedno bolje uporabiti ukaz docker
, in ekipa docker-compose
, saj s tem ni več potrebe po zapomnitvi imen vsebnikov.
Oba zgornja ukaza nista tako težka. Če pa smo v obrazcu uporabili »ovitek«. Makefile
, ki bi nam dal vmesnik v obliki preprostih ukazov in bi sam klical podobne dolge ukaze, potem bi lahko enake rezultate dosegli takole:
make db-shell
Povsem očitno je, da uporaba Makefile
olajša delo s kontejnerji!
Delovni primer
Na podlagi zgornjega projektnega diagrama 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 konfiguracije Docker Compose in interakcijo z vsebniki, 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 velja za vse vsebnike, vendar z uporabo možnosti c=
omogoča omejitev obsega ukaza na en vsebnik.
Po Makefile
pripravljen, lahko ga uporabite takole:
make help
— izdaja seznama vseh ukazov, ki so na voljo zamake
.
Pomoč pri razpoložljivih ukazih
make build
- sestavljanje slike izDockerfile
. V našem primeru smo uporabili obstoječe sliketimescale
иping
. Ampak slikaapi
želimo zbirati lokalno. Točno to bo storjeno po izvedbi tega ukaza.
Gradnja vsebnika Docker
make start
— izstrelitev vseh kontejnerjev. Če želite zagnati samo en vsebnik, lahko uporabite ukaz, kot jemake start c=timescale
.
Izvajanje vsebnika časovne lestvice
Izvajanje vsebnika ping
make login-timescale
— prijava v bash sejo vsebnikatimescale
.
Izvajanje bash v vsebniku časovne lestvice
make db-shell
- vhod vpsql
v posoditimescale
za izvajanje poizvedb SQL proti bazi podatkov.
Izvajanje psql v vsebniku timescaledb
make stop
— ustavljanje kontejnerjev.
Zaustavitev vsebnika časovne lestvice
make down
— ustavljanje in odstranjevanje zabojnikov. Če želite odstraniti določen vsebnik, lahko uporabite ta ukaz, ki določa želeni vsebnik. Na primer -make down c=timescale
alimake down c=api
.
Zaustavitev in brisanje vseh vsebnikov
Rezultati
Čeprav nam Docker Compose ponuja bogat nabor ukazov za upravljanje vsebnikov, lahko ti ukazi včasih postanejo dolgi in si jih je težko zapomniti.
Način uporabe Makefile
nam je pomagal vzpostaviti hitro in enostavno interakcijo z vsebniki iz datoteke docker-compose.yml
. Govorimo namreč o naslednjem:
- Razvijalec komunicira samo s projektnimi vsebniki, opisanimi v
docker-compose.yml
, dela ne motijo drugi tekoči kontejnerji. - V primeru, da je določen ukaz pozabljen, lahko ukaz izvedete
make help
in poiščite pomoč pri razpoložljivih ukazih. - Za izvajanje dejanj, kot je pridobivanje najnovejših vnosov v dnevnik ali prijava v sistem, si ni treba zapomniti dolgih seznamov argumentov. Na primer, ukaz kot je
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
spremeni vmake db-shell
. - datoteka
Makefile
Lahko se mu prilagodljivo prilagajate, ko projekt raste. Enostavno je na primer dodati ukaz za ustvarjanje varnostne kopije baze podatkov ali izvedbo katerega koli drugega dejanja. - Če velika ekipa razvijalcev uporablja isto
Makefile
, to poenostavi sodelovanje in zmanjša število napak.
PS V našem
Drage bralke in bralci! Kako avtomatizirate Docker Compose?
Vir: www.habr.com