Svakih nekoliko godina, industrija razvoja softvera prolazi kroz promjenu paradigme. Jedan od ovih fenomena može se prepoznati kao rastuće interesovanje za koncept mikroservisa. Iako mikroservis nije najnovija tehnologija, tek nedavno je njena popularnost bukvalno porasla.
Velike monolitne usluge sada se zamjenjuju nezavisnim, autonomnim mikroservisima. 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 servis.
Danas je teško zamisliti razvoj novog softverskog sistema bez korištenja mikroservisa. A ova situacija nas, zauzvrat, vodi do Docker platforme.
doker
Platforma
Docker Compose
tehnologija
Kada radite s Docker Compose, YAML datoteka se koristi za konfiguriranje servisa aplikacije i organiziranje njihove međusobne interakcije. Docker Compose je stoga alat za opisivanje i pokretanje Docker aplikacija sa više kontejnera.
Dva kontejnera rade na host sistemu
GNU Make
Program make
, je u suštini alat za automatizaciju izgradnje programa i biblioteka iz izvornog koda. Generalno, možemo to reći make
primjenjuje 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, komande docker-compose
će se transformisati u apstraktne ciljeve (
Da kažem programu make
o tome šta želimo od toga, potreban nam je fajl Makefile
.
U našem Makefile
sadržaće redovne komande docker
и docker-compose
, koji su dizajnirani za rješavanje mnogih problema. Naime, govorimo o sastavljanju kontejnera, o njegovom pokretanju, zaustavljanju, ponovnom pokretanju, o organiziranju prijavljivanja korisnika na kontejner, o radu s logovima 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 kontejner, ne radi ništa posebno).
Ova aplikacija će trebati 3 Docker kontejnera i fajl docker-compose
, koji sadrži upute za upravljanje ovim kontejnerima. Svaki kontejner će imati različite dodirne tačke. Na primjer, sa kontejnerom timescale
biće moguće raditi otprilike na isti način kao što rade sa bazama podataka. Naime, omogućava vam da izvršite sljedeće radnje:
- Prijavljivanje u Postgres shell.
- Uvoz i izvoz tabela.
- stvaranje
pg_dump
tabele ili baze podataka.
Express.js kontejner aplikacije, expressjs
, može imati sljedeće mogućnosti:
- Pružanje svježih podataka iz sistemskog dnevnika.
- Prijavite se na shell da biste izvršili određene naredbe.
Interakcija sa kontejnerima
Nakon što smo postavili komunikaciju između kontejnera koristeći Docker Compose, vrijeme je da komuniciramo s tim kontejnerima. Unutar Docker Compose sistema postoji komanda docker-compose
, opcija podrške -f
, koji vam omogućava da prenesete datoteku na sistem docker-compose.yml
.
Koristeći mogućnosti ove opcije, možete ograničiti interakciju sa sistemom samo na one kontejnere koji su spomenuti u datoteci docker-compose.yml
.
Hajde da pogledamo kako izgledaju interakcije sa kontejnerima kada se koriste komande docker-compose
. Ako zamislimo da se trebamo prijaviti u ljusku psql
, tada bi odgovarajuće komande mogle izgledati ovako:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Ista naredba koja se ne koristi za izvršavanje 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 poželjno koristiti naredbu docker
, i naredbu docker-compose
, jer to eliminira potrebu za pamćenjem imena kontejnera.
Obje gore navedene naredbe nisu tako teške. Ali ako bismo koristili "omotač" u formi Makefile
, koji bi nam dao sučelje u obliku jednostavnih naredbi i sam bi pozivao slične duge komande, onda bi se isti rezultati mogli postići ovako:
make db-shell
Sasvim je očigledno da upotreba Makefile
znatno olakšava rad sa kontejnerima!
Radni primjer
Na osnovu gornjeg dijagrama projekta kreirać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 opisuje, kreirat ć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 primjenjuje se na sve kontejnere, ali koristeći opciju c=
omogućava vam da ograničite opseg naredbe na jedan kontejner.
Posle Makefile
spreman, možete ga koristiti ovako:
make help
— izdavanje liste svih dostupnih komandi zamake
.
Pomoć za dostupne komande
make build
- sastavljanje slike izDockerfile
. U našem primjeru koristili smo postojeće sliketimescale
иping
. Ali slikaapi
želimo prikupiti lokalno. Upravo to će biti učinjeno nakon izvršenja ove naredbe.
Izgradnja Docker kontejnera
make start
— pokretanje svih kontejnera. Da biste pokrenuli samo jedan kontejner, možete koristiti naredbu poputmake start c=timescale
.
Pokretanje kontejnera vremenske skale
Pokretanje ping kontejnera
make login-timescale
— prijavite se na bash sesiju kontejneratimescale
.
Pokretanje bash-a u kontejneru vremenske skale
make db-shell
- ulaz upsql
u kontejnerutimescale
za izvršavanje SQL upita prema bazi podataka.
Pokretanje psql-a u timescaledb kontejneru
make stop
— zaustavljanje kontejnera.
Zaustavljanje kontejnera vremenske skale
make down
— zaustavljanje i uklanjanje kontejnera. Da biste uklonili određeni kontejner, možete koristiti ovu naredbu koja navodi željeni kontejner. Na primjer -make down c=timescale
ilimake down c=api
.
Zaustavljanje i brisanje svih kontejnera
Ishodi
Iako nam Docker Compose daje bogat skup naredbi za upravljanje kontejnerima, ponekad ove naredbe mogu postati dugačke i teško ih je zapamtiti.
Način upotrebe Makefile
pomogla nam je da uspostavimo brzu i jednostavnu interakciju sa kontejnerima iz datoteke docker-compose.yml
. Naime, govorimo o sledećem:
- Programer komunicira samo sa projektnim kontejnerima opisanim u
docker-compose.yml
, rad ne ometaju drugi tekući kontejneri. - U slučaju da je određena naredba zaboravljena, možete je izvršiti
make help
i dobiti pomoć za dostupne komande. - Ne morate da pamtite dugačke liste argumenata da biste izvršili radnje kao što su dobijanje najnovijih unosa u dnevnik ili prijavljivanje u sistem. Na primjer, naredba poput
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
pretvara umake db-shell
. - fajl
Makefile
Možete mu se fleksibilno prilagoditi kako projekt raste. Na primjer, lako je dodati naredbu za kreiranje sigurnosne kopije baze podataka ili izvođenje bilo koje druge radnje. - Ako veliki tim programera koristi isto
Makefile
, ovo pojednostavljuje saradnju i smanjuje greške.
PS U našem
Dragi čitaoci! Kako automatizujete Docker Compose?
izvor: www.habr.com