Svakih nekoliko godina industrija razvoja softvera prolazi kroz promjenu paradigme. Jedan od tih fenomena može se prepoznati kao sve veći interes za koncept mikrousluga. Iako mikroservisi nisu najnovija tehnologija, tek u posljednje vrijeme njihova je popularnost doslovno skočila u nebo.
Velike monolitne usluge sada se zamjenjuju nezavisnim, autonomnim mikrouslugama. Mikroservis se može smatrati aplikacijom koja služi jednoj i vrlo specifičnoj svrsi. Na primjer, to može biti relacijski DBMS, Express aplikacija, Solr usluga.
Danas je teško zamisliti razvoj novog softverskog sustava bez korištenja mikroservisa. A ova situacija nas pak vodi do Docker platforme.
Lučki radnik
platforma
Docker Sastaviti
Технология
Kada radite s Docker Compose, YAML datoteka se koristi za konfiguriranje aplikacijskih usluga i organiziranje njihove međusobne interakcije. Docker Compose je stoga alat za opisivanje i pokretanje Docker aplikacija s više spremnika.
Dva spremnika koji rade na glavnom sustavu
GNU Make
Program make
, u biti je alat za automatizaciju izgradnje programa i biblioteka iz izvornog koda. Općenito, možemo to reći make
odnosi se na bilo koji proces koji uključuje izvršavanje proizvoljnih naredbi za transformaciju nekih ulaznih materijala u neki izlazni oblik, u neki cilj. U našem slučaju, naredbe docker-compose
će se transformirati u apstraktne ciljeve (
Da kažem program make
o tome što želimo od toga, trebamo datoteku Makefile
.
U našem Makefile
sadržavat će redovite naredbe docker
и docker-compose
, koji su dizajnirani za rješavanje mnogih problema. Naime, govorimo o sastavljanju kontejnera, njegovom pokretanju, zaustavljanju, ponovnom pokretanju, organizaciji prijave korisnika na kontejner, radu sa zapisnicima kontejnera i rješavanju drugih sličnih problema.
Tipični slučajevi upotrebe za Docker Compose
Zamislimo običnu web aplikaciju koja ima sljedeće komponente:
- TimescaleDB baza podataka (Postgres).
- Express.js aplikacija.
- Ping (samo spremnik, ne radi ništa posebno).
Ova aplikacija će trebati 3 Docker spremnika i datoteku docker-compose
, koji sadrži upute za upravljanje ovim spremnicima. Svaki će spremnik imati različite dodirne točke. Na primjer, s kontejnerom timescale
moći će se raditi približno na isti način kao što rade s bazama podataka. Naime, omogućuje vam izvođenje sljedećih radnji:
- Prijava u Postgres shell.
- Uvoz i izvoz tablica.
- stvaranje
pg_dump
tablice ili baze podataka.
Spremnik aplikacije Express.js, expressjs
, može imati sljedeće mogućnosti:
- Pružanje svježih podataka iz dnevnika sustava.
- Prijavite se u ljusku kako biste izvršili određene naredbe.
Interakcija sa spremnicima
Nakon što smo postavili komunikaciju između spremnika pomoću Docker Composea, vrijeme je za komunikaciju s tim spremnicima. Unutar Docker Compose sustava postoji naredba docker-compose
, opcija podrške -f
, koji vam omogućuje prijenos datoteke u sustav docker-compose.yml
.
Koristeći mogućnosti ove opcije, možete ograničiti interakciju sa sustavom samo na one spremnike koji su spomenuti u datoteci docker-compose.yml
.
Pogledajmo kako izgledaju interakcije sa spremnicima kada se koriste naredbe docker-compose
. Ako zamislimo da se trebamo prijaviti u ljusku psql
, onda bi odgovarajuće naredbe mogle izgledati ovako:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Ista naredba koja se ne koristi za izvršenje docker-compose
I docker
, može izgledati ovako:
docker exec -it edp_timescale_1 psql -Upostgres
Imajte na umu da je u takvim slučajevima uvijek bolje koristiti naredbu docker
, i tim docker-compose
, budući da to eliminira potrebu za pamćenjem naziva spremnika.
Obje gore navedene naredbe nisu tako teške. Ali ako smo koristili "omot" u obrascu Makefile
, koji bi nam dao sučelje u obliku jednostavnih naredbi i sam bi pozivao slične duge naredbe, onda bi se isti rezultati mogli postići ovako:
make db-shell
Sasvim je očito da korištenje Makefile
znatno olakšava rad s kontejnerima!
Radni primjer
Na temelju gornjeg dijagrama projekta izradit ćemo sljedeću datoteku 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 konfiguracijom Docker Compose i interakciju sa spremnicima koje ona opisuje, izradit ćemo sljedeću datoteku 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 ovdje opisanih naredbi odnosi se na sve spremnike, ali uz korištenje opcije c=
omogućuje vam da ograničite opseg naredbe na jedan spremnik.
Nakon Makefile
spreman, možete ga koristiti ovako:
make help
— izdavanje popisa svih dostupnih naredbi zamake
.
Pomoć o dostupnim naredbama
make build
- sklapanje slike izDockerfile
. U našem smo primjeru koristili postojeće sliketimescale
иping
. Ali slikaapi
želimo prikupljati lokalno. To je upravo ono što će biti učinjeno nakon izvršenja ove naredbe.
Izgradnja Docker spremnika
make start
— porinuće svih kontejnera. Za pokretanje samo jednog spremnika, možete koristiti naredbu poputmake start c=timescale
.
Pokretanje spremnika vremenske skale
Pokretanje ping spremnika
make login-timescale
— prijavite se na bash sesiju spremnikatimescale
.
Pokretanje basha u spremniku vremenske skale
make db-shell
- ulaz upsql
u kontejnerutimescale
za izvršavanje SQL upita prema bazi podataka.
Pokretanje psql-a u spremniku timescaledb
make stop
— zaustavljanje kontejnera.
Zaustavljanje spremnika vremenske skale
make down
— zaustavljanje i uklanjanje spremnika. Za uklanjanje određenog spremnika, možete koristiti ovu naredbu specificirajući željeni spremnik. Na primjer -make down c=timescale
ilimake down c=api
.
Zaustavljanje i brisanje svih spremnika
Rezultati
Iako nam Docker Compose daje bogat skup naredbi za upravljanje spremnicima, ponekad te naredbe mogu postati duge i teške za pamćenje.
Način upotrebe Makefile
pomogao nam je uspostaviti brzu i jednostavnu interakciju sa spremnicima iz datoteke docker-compose.yml
. Naime, riječ je o sljedećem:
- Programer komunicira samo s projektnim spremnicima opisanim u
docker-compose.yml
, rad ne ometaju drugi pokretni kontejneri. - U slučaju da je određena naredba zaboravljena, možete je izvršiti
make help
i dobiti pomoć za dostupne naredbe. - Ne morate pamtiti dugačke popise argumenata da biste izvršili radnje kao što su dobivanje najnovijih unosa u dnevnik ili prijava u sustav. Na primjer, naredba poput
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
pretvara umake db-shell
. - datoteka
Makefile
Možete mu se fleksibilno prilagoditi kako projekt raste. Na primjer, lako je dodati naredbu za izradu sigurnosne kopije baze podataka ili izvođenje bilo koje druge radnje. - Ako veliki tim programera koristi isti
Makefile
, to pojednostavljuje suradnju i smanjuje pogreške.
PS U našem
Dragi čitatelji! Kako automatizirati Docker Compose?
Izvor: www.habr.com