La fiecare câțiva ani, industria dezvoltării software trece printr-o schimbare de paradigmă. Unul dintre aceste fenomene poate fi recunoscut ca interesul tot mai mare pentru conceptul de microservicii. Deși microserviciile nu sunt cea mai nouă tehnologie, doar recent popularitatea sa a crescut vertiginos.
Serviciile monolitice mari sunt acum înlocuite cu microservicii independente, autonome. Un microserviciu poate fi gândit ca o aplicație care servește un scop unic și foarte specific. De exemplu, ar putea fi un SGBD relațional, o aplicație Express, un serviciu Solr.
În zilele noastre, este greu de imaginat dezvoltarea unui nou sistem software fără a utiliza microservicii. Și această situație, la rândul ei, ne duce la platforma Docker.
Docher
Platformă
Docker Compune
Технология
Când lucrați cu Docker Compose, un fișier YAML este utilizat pentru a configura serviciile de aplicații și pentru a organiza interacțiunea acestora între ele. Docker Compose este, prin urmare, un instrument pentru descrierea și rularea aplicațiilor Docker cu mai multe containere.
Două containere care rulează pe un sistem gazdă
GNU Make
Program make
, este în esență un instrument pentru automatizarea construirii de programe și biblioteci din codul sursă. În general, putem spune că make
se aplică oricărui proces care implică executarea de comenzi arbitrare pentru a transforma unele materiale de intrare într-o formă de ieșire, într-un anumit scop. În cazul nostru, comenzile docker-compose
vor fi transformate în scopuri abstracte (
Pentru a spune programul make
despre ce vrem de la el, avem nevoie de un fișier Makefile
.
În nostru Makefile
va conține comenzi obișnuite docker
и docker-compose
, care sunt concepute pentru a rezolva multe probleme. Și anume, vorbim despre asamblarea unui container, despre pornirea lui, oprirea lui, repornirea lui, despre organizarea logării utilizatorilor la container, despre lucrul cu jurnalele containerului și despre rezolvarea altor probleme similare.
Cazuri de utilizare tipice pentru 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, 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 container va avea puncte de contact diferite. De exemplu, cu un container timescale
va fi posibil să se lucreze aproximativ în același mod în care se lucrează cu bazele de date. Și anume, vă permite să efectuați următoarele acțiuni:
- Conectarea la shell-ul Postgres.
- Import și export de tabele.
- creație
pg_dump
tabele sau baze de date.
containerul de aplicații Express.js, expressjs
, poate avea următoarele capacități:
- Furnizarea de date proaspete din jurnalul de sistem.
- Conectați-vă la shell pentru a executa anumite comenzi.
Interacțiunea cu containerele
După ce am configurat comunicarea între containere folosind Docker Compose, este timpul să comunicăm cu acele containere. În sistemul Docker Compose există o comandă docker-compose
, opțiune de sprijin -f
, care vă permite să transferați un fișier în sistem docker-compose.yml
.
Folosind capacitățile acestei opțiuni, puteți limita interacțiunea cu sistemul numai la acele containere care sunt menționate în fișier docker-compose.yml
.
Să aruncăm o privire la cum arată interacțiunile cu containerele atunci când folosiți comenzi docker-compose
. Dacă ne imaginăm că trebuie să ne logăm în shell psql
, atunci comenzile corespunzătoare ar putea arăta astfel:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Aceeași comandă care nu este folosită pentru executare docker-compose
Și docker
, ar putea arăta astfel:
docker exec -it edp_timescale_1 psql -Upostgres
Vă rugăm să rețineți că în astfel de cazuri este întotdeauna de preferat să utilizați comanda docker
, și comanda docker-compose
, deoarece acest lucru elimină nevoia de a reține numele containerelor.
Ambele comenzi de mai sus nu sunt atât de dificile. Dar dacă am folosit un „înveliș” în formă Makefile
, care ne-ar oferi o interfață sub formă de comenzi simple și ar numi ea însăși comenzi lungi similare, atunci aceleași rezultate ar putea fi obținute astfel:
make db-shell
Este destul de evident că utilizarea Makefile
ușurează mult lucrul cu containerele!
Exemplu de lucru
Pe baza diagramei proiectului de mai sus, 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 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 utilizând opțiunea c=
vă permite să limitați domeniul de aplicare al unei comenzi la un singur container.
După Makefile
gata, îl puteți folosi astfel:
make help
— emiterea unei liste cu toate comenzile disponibile pentrumake
.
Ajutor pentru comenzile disponibile
make build
- asamblarea unei imagini dinDockerfile
. În exemplul nostru am folosit imagini existentetimescale
иping
. Dar imagineaapi
vrem să colectăm local. Acesta este exact ceea ce se va face după executarea acestei comenzi.
Construirea unui container Docker
make start
— lansarea tuturor containerelor. Pentru a lansa un singur container, puteți folosi o comandă camake start c=timescale
.
Rularea containerului de timp
Rularea unui container ping
make login-timescale
— conectați-vă la sesiunea bash a containeruluitimescale
.
Rularea bash într-un container de timp
make db-shell
- intrarea lapsql
într-un recipienttimescale
pentru a executa interogări SQL în baza de date.
Rularea psql într-un container timescaledb
make stop
— oprirea containerelor.
Oprirea unui container pe scară temporală
make down
— oprirea și îndepărtarea containerelor. Pentru a elimina un anumit container, puteți utiliza această comandă specificând containerul dorit. De exemplu -make down c=timescale
saumake down c=api
.
Oprirea și ștergerea tuturor containerelor
Rezultatele
Deși Docker Compose ne oferă un set bogat de comenzi pentru gestionarea containerelor, uneori aceste comenzi pot deveni lungi și dificil de reținut.
Mod de utilizare Makefile
ne-a ajutat să stabilim o interacțiune rapidă și ușoară cu containerele dintr-un fișier docker-compose.yml
. Și anume, vorbim despre următoarele:
- Dezvoltatorul interacționează numai cu containerele de proiect descrise în
docker-compose.yml
, munca nu este interferată de alte containere care rulează. - În cazul în care o anumită comandă este uitată, puteți executa comanda
make help
și obțineți ajutor pentru comenzile disponibile. - Nu trebuie să vă amintiți liste lungi de argumente pentru a efectua acțiuni precum obținerea celor mai recente intrări de jurnal sau conectarea la un sistem. De exemplu, o comandă ca
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
se transformă înmake db-shell
. - fișier
Makefile
Vă puteți adapta în mod flexibil pe măsură ce proiectul crește. De exemplu, este ușor să adăugați o comandă pentru a crea o copie de rezervă a bazei de date sau pentru a efectua orice altă acțiune. - Dacă o echipă mare de dezvoltatori folosește același lucru
Makefile
, aceasta eficientizează colaborarea și reduce erorile.
PS În nostru
Dragi cititori! Cum automatizezi Docker Compose?
Sursa: www.habr.com