Çdo disa vjet, industria e zhvillimit të softuerit pëson një ndryshim paradigme. Një nga këto dukuri mund të njihet si interesi në rritje për konceptin e mikroshërbimeve. Edhe pse mikroshërbimet nuk janë teknologjia më e re, vetëm kohët e fundit popullariteti i saj fjalë për fjalë është rritur në qiell.
Shërbimet e mëdha monolitike tani po zëvendësohen nga mikroshërbime të pavarura, autonome. Një mikroshërbim mund të konsiderohet si një aplikacion që i shërben një qëllimi të vetëm dhe shumë specifik. Për shembull, mund të jetë një DBMS relacionale, një aplikacion Express, një shërbim Solr.
Këto ditë, është e vështirë të imagjinohet zhvillimi i një sistemi të ri softuerësh pa përdorur mikroshërbime. Dhe kjo situatë, nga ana tjetër, na çon në platformën Docker.
prerës
Platformë
Shkruaj Docker
Технология
Kur punoni me Docker Compose, një skedar YAML përdoret për të konfiguruar shërbimet e aplikacionit dhe për të organizuar ndërveprimin e tyre me njëri-tjetrin. Prandaj, Docker Compose është një mjet për përshkrimin dhe ekzekutimin e aplikacioneve Docker me shumë kontejnerë.
Dy kontejnerë që funksionojnë në një sistem pritës
Bëni GNU
Program make
, është në thelb një mjet për automatizimin e ndërtimit të programeve dhe bibliotekave nga kodi burimor. Në përgjithësi, mund të themi se make
zbatohet për çdo proces që përfshin ekzekutimin e komandave arbitrare për të transformuar disa materiale hyrëse në një formë dalëse për ndonjë qëllim. Në rastin tonë, komandat docker-compose
do të shndërrohet në qëllime abstrakte (
Për të treguar programin make
për atë që duam prej tij, na duhet një skedar Makefile
.
Në tonë Makefile
do të përmbajë komanda të rregullta docker
и docker-compose
, të cilat janë krijuar për të zgjidhur shumë probleme. Domethënë, ne po flasim për montimin e një kontejneri, për fillimin e tij, ndalimin e tij, rinisjen e tij, për organizimin e hyrjes së përdoruesit në kontejner, për punën me regjistrat e kontejnerëve dhe për zgjidhjen e problemeve të tjera të ngjashme.
Rastet tipike të përdorimit për Docker Compose
Le të imagjinojmë një aplikacion të rregullt në internet që ka komponentët e mëposhtëm:
- Baza e të dhënave TimescaleDB (Postgres).
- Aplikacioni Express.js.
- Ping (vetëm një enë, nuk bën asgjë të veçantë).
Ky aplikacion do të ketë nevojë për 3 kontejnerë Docker dhe një skedar docker-compose
, i cili përmban udhëzime për menaxhimin e këtyre kontejnerëve. Çdo kontejner do të ketë pika kontakti të ndryshme. Për shembull, me një enë timescale
do të jetë e mundur të punohet përafërsisht në të njëjtën mënyrë siç punojnë me bazat e të dhënave. Përkatësisht, ju lejon të kryeni veprimet e mëposhtme:
- Hyrja në guaskën Postgres.
- Importi dhe eksporti i tavolinave.
- krijim
pg_dump
tabelat ose bazat e të dhënave.
Kontejneri i aplikacionit Express.js, expressjs
, mund të ketë aftësitë e mëposhtme:
- Sigurimi i të dhënave të freskëta nga regjistri i sistemit.
- Hyni në shell për të ekzekutuar komanda të caktuara.
Ndërveprimi me kontejnerët
Pasi të kemi vendosur komunikimin midis kontejnerëve duke përdorur Docker Compose, është koha për të komunikuar me ato kontejnerë. Brenda sistemit Docker Compose ekziston një komandë docker-compose
, opsion mbështetës -f
, i cili ju lejon të transferoni një skedar në sistem docker-compose.yml
.
Duke përdorur aftësitë e këtij opsioni, ju mund të kufizoni ndërveprimin me sistemin vetëm në ato kontejnerë që janë përmendur në skedar docker-compose.yml
.
Le të hedhim një vështrim se si duken ndërveprimet me kontejnerët kur përdorni komanda docker-compose
. Nëse imagjinojmë se duhet të hyjmë në shell psql
, atëherë komandat përkatëse mund të duken kështu:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
E njëjta komandë që nuk përdoret për të ekzekutuar docker-compose
Dhe docker
, mund të duket kështu:
docker exec -it edp_timescale_1 psql -Upostgres
Ju lutemi vini re se në raste të tilla është gjithmonë e preferueshme të përdoret komanda docker
, dhe komanda docker-compose
, pasi kjo eliminon nevojën për të mbajtur mend emrat e kontejnerëve.
Të dyja komandat e mësipërme nuk janë aq të vështira. Por nëse do të përdornim një "mbështjellës" në formë Makefile
, e cila do të na jepte një ndërfaqe në formën e komandave të thjeshta dhe do të quhej vetë komanda të ngjashme të gjata, atëherë të njëjtat rezultate mund të arriheshin si kjo:
make db-shell
Është mjaft e qartë se përdorimi Makefile
e bën shumë më të lehtë punën me kontejnerë!
Shembull pune
Bazuar në diagramin e mësipërm të projektit, ne do të krijojmë skedarin e mëposhtëm 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
Për të menaxhuar konfigurimin e Docker Compose dhe për të bashkëvepruar me kontejnerët që ai përshkruan, ne do të krijojmë skedarin e mëposhtëm 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
Shumica e komandave të përshkruara këtu zbatohen për të gjithë kontejnerët, por duke përdorur opsionin c=
ju lejon të kufizoni shtrirjen e një komande në një kontejner.
Pas Makefile
gati, mund ta përdorni si kjo:
make help
— lëshimi i një liste të të gjitha komandave të disponueshme përmake
.
Ndihmë për komandat e disponueshme
make build
- montimi i një imazhi ngaDockerfile
. Në shembullin tonë kemi përdorur imazhe ekzistuesetimescale
иping
. Por imazhiapi
ne duam të mbledhim në vend. Kjo është pikërisht ajo që do të bëhet pas ekzekutimit të kësaj komande.
Ndërtimi i një kontejneri Docker
make start
— nisja e të gjithë kontejnerëve. Për të nisur vetëm një kontejner, mund të përdorni një komandë simake start c=timescale
.
Drejtimi i kontejnerit të shkallës kohore
Drejtimi i një kontejneri ping
make login-timescale
— hyni në sesionin bash të kontejnerittimescale
.
Running bash në një enë me kohë
make db-shell
- hyrje nëpsql
në një enëtimescale
për të ekzekutuar pyetje SQL kundër bazës së të dhënave.
Ekzekutimi i psql në një enë timescaledb
make stop
— kontejnerët e ndalimit.
Ndalimi i një kontejneri të shkallës kohore
make down
— ndalimi dhe heqja e kontejnerëve. Për të hequr një enë specifike, mund të përdorni këtë komandë duke specifikuar kontejnerin e dëshiruar. Për shembull -make down c=timescale
osemake down c=api
.
Ndalimi dhe fshirja e të gjithë kontejnerëve
Rezultatet e
Megjithëse Docker Compose na jep një grup të pasur komandash për menaxhimin e kontejnerëve, ndonjëherë këto komanda mund të bëhen të gjata dhe të vështira për t'u mbajtur mend.
Mënyra e përdorimit Makefile
na ndihmoi të krijojmë ndërveprim të shpejtë dhe të lehtë me kontejnerët nga një skedar docker-compose.yml
. Përkatësisht, ne po flasim për sa vijon:
- Zhvilluesi ndërvepron vetëm me kontejnerët e projektit të përshkruar në
docker-compose.yml
, puna nuk ndërhyhet nga kontejnerë të tjerë që funksionojnë. - Në rast se një komandë e caktuar harrohet, mund ta ekzekutoni komandën
make help
dhe merrni ndihmë për komandat e disponueshme. - Nuk është e nevojshme të mbani mend lista të gjata argumentesh për të kryer veprime të tilla si marrja e shënimeve më të fundit të regjistrit ose hyrja në një sistem. Për shembull, një komandë si
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
kthehet nëmake db-shell
. - skedar
Makefile
Ju mund të përshtateni në mënyrë fleksibël me të ndërsa projekti rritet. Për shembull, është e lehtë të shtoni një komandë për të krijuar një kopje rezervë të bazës së të dhënave ose për të kryer ndonjë veprim tjetër. - Nëse një ekip i madh zhvilluesish përdor të njëjtën gjë
Makefile
, kjo thjeshton bashkëpunimin dhe redukton gabimet.
PS Në tonë
Të nderuar lexues! Si e automatizoni Docker Compose?
Burimi: www.habr.com