Docker Compose: simplificarea muncii cu ajutorul Makefile

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.

Docker Compose: simplificarea muncii cu ajutorul Makefile

Î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 Docker, î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 Docker Compose 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.

Docker Compose: simplificarea muncii cu ajutorul Makefile
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 (Obiective fantomă).

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_dump tabele 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 pentru make.

Docker Compose: simplificarea muncii cu ajutorul Makefile
Ajutor pentru comenzile disponibile

  • make build — pentru a construi imaginea din Dockerfile. În exemplul nostru, am folosit imagini existente timescale și ping. Dar imaginea api pe care dorim să o construim local. Exact asta se va întâmpla după ce executăm această comandă.

Docker Compose: simplificarea muncii cu ajutorul Makefile
Construirea containerului Docker

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

Docker Compose: simplificarea muncii cu ajutorul Makefile
Pornirea containerului timescale

Docker Compose: simplificarea muncii cu ajutorul Makefile
Pornirea containerului ping

  • make login-timescale — conectare la sesiunea bash a containerului timescale.

Docker Compose: simplificarea muncii cu ajutorul Makefile
Conectare la bash în containerul timescale

  • make db-shell — conectare la psql în container timescale pentru a efectua interogări SQL la baza de date.

Docker Compose: simplificarea muncii cu ajutorul Makefile
Pornirea psql în containerul timescaledb

  • make stop — oprirea containerelor.

Docker Compose: simplificarea muncii cu ajutorul Makefile
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=timescale sau make down c=api.

Docker Compose: simplificarea muncii cu ajutorul Makefile
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 -Upostgres devine make db-shell.
  • Fișier Makefile poate 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 pe marketplace există o imagine Docker, care se instalează cu un singur clic. Puteți verifica funcționarea containerelor pe VPS. Toți clienții noi beneficiază de 3 zile gratuite pentru testare.

Stimați cititori! Cum automatizați lucrul cu Docker Compose?

Docker Compose: simplificarea muncii cu ajutorul Makefile

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster