La fiecare câțiva ani, industriile de dezvoltare software trec prin schimbări de paradigmă. Unul dintre aceste fenomene ar putea fi recunoașterea crescută a conceptului de microservicii. Deși microserviciile nu sunt o tehnologie nouă, popularitatea lor a crescut exponențial în ultima vreme.
Serviciile mari și monolitice sunt înlocuite astăzi cu microservicii autonome și independente. Un microserviciu poate fi considerat o aplicație care servește un scop specific și foarte bine definit. De exemplu, acesta poate fi o bază de date relațională, o aplicație Express sau un serviciu Solr.
În zilele noastre, este greu de imaginat dezvoltarea unei noi sisteme software fără utilizarea microserviciilor. Această situație ne conduce, la rândul său, către platforma Docker.
Docker
Platforma , în dezvoltarea și implementarea microserviciilor, a devenit practic un standard industrial. Pe site-ul proiectului, putem afla că Docker este singura platformă de containere autonomă care permite organizațiilor să creeze fără dificultăți aplicații de orice tip, precum și să le distribuie și să le ruleze în orice mediu – de la clouduri hibride până la sisteme de edge.
Docker Compose
Tehnologie este destinat configurării aplicațiilor cu mai multe containere. Într-un proiect Docker Compose pot fi incluse atât de multe containere Docker cât este nevoie de către creatorul acestuia.
Când lucrăm cu Docker Compose pentru a configura serviciile unei aplicații și a organiza interacțiunea lor, se folosește un fișier YAML. Așadar, Docker Compose este un instrument pentru descrierea și rularea aplicațiilor Docker cu mai multe containere.

Două containere care rulează pe un sistem gazdă
GNU Make
Programul make, în esență, reprezintă un instrument pentru automatizarea construirii programelor și bibliotecilor din codul sursă. În general, se poate spune că make se aplică oricărui proces care implică executarea de comenzi arbitrare pentru a transforma anumite materiale inițiale într-o formă rezultantă, într-un anumit scop. În cazul nostru, comenzile docker-compose vor fi transformate în obiective abstracte ().
Pentru a-i comunica programului make ce anume dorim de la el, avem nevoie de un fișier Makefile.
În materialul nostru Makefile care va conține comenzi obișnuite docker și docker-compose, care sunt destinate rezolvării multor sarcini. Mai exact, ne referim la construirea unui container, la lansarea, oprirea, repornirea acestuia, organizarea accesului utilizatorului în container, lucrul cu jurnalele containerului și rezolvarea altor sarcini similare.
Cazuri tipice de utilizare a Docker Compose
Să ne imaginăm o aplicație web obișnuită, care are următoarele componente:
- Baza de date TimescaleDB (Postgres).
- Aplicația Express.js.
- Ping (doar un container, care nu face nimic special).
Această aplicație va avea nevoie de 3 containere Docker și un fișier docker-compose, care conține instrucțiuni pentru gestionarea acestor containere. Fiecare dintre containere va avea puncte diferite de interacțiune. De exemplu, cu containerul timescale se va putea lucra aproximativ așa cum se lucrează cu bazele de date. Mai exact, permite efectuarea următoarelor acțiuni:
- Accesarea shell-ului Postgres.
- Importarea și exportarea tabelelor.
- Crearea
pg_dumptabele sau baze de date.
Containerul aplicației Express.js, expressjs, poate avea următoarele capacități:
- Oferirea de date proaspete din jurnalul de sistem.
- Accesarea shell-ului pentru executarea unor comenzi.
Interacțiunea cu containerele
După ce am configurat conexiunea între containere utilizând Docker Compose, este timpul să stabilim interacțiunea cu aceste containere. În cadrul sistemului Docker Compose există o comandă docker-compose, care suportă opțiunea -f, ce permite transmiterea către sistem a fișierului docker-compose.yml.
Folosind capacitățile acestei opțiuni, se poate limita interacțiunea cu sistemul doar la containerele menționate în fișier. docker-compose.yml.
Să ne uităm la modul în care arată interacțiunile cu containerele utilizând comenzile docker-compose. Dacă ne imaginăm că trebuie să accesăm shell-ul psql, atunci comenzile corespunzătoare pot arăta astfel:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres Aceeași comandă, pentru care se folosește nu docker-compose, iar docker, poate arăta astfel:
docker exec -it edp_timescale_1 psql -Upostgres Observați că, în asemenea cazuri, este întotdeauna preferabil să folosiți comanda docker, nu comanda docker-compose, deoarece aceasta vă permite să scăpați de necesitatea de a memora numele containerelor.
Ambele comenzi menționate mai sus nu sunt foarte complicate. Dar dacă am folosi o «înfășurare» sub formă de Makefile, care ar oferi o interfață sub formă de comenzi simple și ar apela automat comenzi mai lungi, rezultate similare s-ar putea obține astfel:
make db-shell Este absolut evident că utilizarea Makefile simplifică semnificativ munca cu containere!
Exemplu de lucru
Pe baza schemei de proiect discutate anterior, vom crea următorul fișier 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 Pentru a gestiona configurația Docker Compose și pentru a interacționa cu containerele pe care le descrie, vom crea următorul fișier 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 Majoritatea comenzilor descrise aici se aplică tuturor containerelor, dar utilizarea opțiunii c= permite restricționarea domeniului de aplicare al comenzii la un singur container.
După ce Makefile este gata, îl poți utiliza astfel:
make help— pentru a obține o listă cu toate comenzile disponibile pentrumake.

Ajutor pentru comenzile disponibile
make build— pentru a construi imaginea dinDockerfile. În exemplul nostru, am folosit imagini existentetimescaleșiping. Dar imagineaapipe care dorim să o construim local. Exact asta se va întâmpla după ce executăm această comandă.

Construirea containerului Docker
make start— pornește toate containerele. Pentru a porni doar un singur container, se poate folosi o comandă de formamake start c=timescale.

Pornirea containerului timescale

Pornirea containerului ping
make login-timescale— conectare la sesiunea bash a containeruluitimescale.

Conectare la bash în containerul timescale
make db-shell— conectare lapsqlîn containertimescalepentru a efectua interogări SQL la baza de date.

Pornirea psql în containerul timescaledb
make stop— oprirea containerelor.
![]()
Oprirea containerului timescale
make down— oprirea și ștergerea containerelor. Pentru a șterge un anumit container, se poate folosi această comandă specificând containerul dorit. De exemplu —make down c=timescalesaumake down c=api.

Oprirea și ștergerea tuturor containerelor
Concluzii
Deși sistemul Docker Compose ne oferă un set extins de comenzi concepute pentru a gestiona containerele, uneori aceste comenzi devin lungi, ceea ce le face greu de memorat.
Metodologia utilizării Makefile ne-a ajutat să stabilim o interacțiune rapidă și simplă cu containerele din fișier docker-compose.yml. Mai precis, este vorba despre următoarele:
- Dezvoltatorul interacționează doar cu containerele proiectului, descrise în
docker-compose.yml, fără a fi deranjat de alte containere rulate. - În cazul în care o anumită comandă a fost uitată, se poate executa comanda
make helpși obține ajutor cu privire la comenzile disponibile. - Nu este necesar să memorezi liste lungi de argumente pentru a efectua acțiuni precum obținerea celor mai recente înregistrări din jurnal sau conectarea la sistem. De exemplu, comanda de forma
docker-compose -f docker-compose.yml exec timescale psql -Upostgresdevinemake db-shell. - Fișier
Makefilepoate fi adaptată flexibil pe măsură ce proiectul evoluează. De exemplu, poate fi ușor să adăugăm o comandă pentru a realiza o copie de siguranță a bazei de date sau pentru a efectua orice altă acțiune. - Dacă o echipă mare de dezvoltatori folosește același
Makefile, aceasta ordonează colaborarea și reduce numărul de erori.
P.S. În materialul nostru există o imagine , care se instalează cu un singur clic. Puteți verifica funcționarea containerelor pe . Toți clienții noi beneficiază de 3 zile gratuite pentru testare.
Stimați cititori! Cum automatizați lucrul cu Docker Compose?
Sursa: habr.com
