Docker Compose: simplificarea muncii dvs. folosind Makefiles

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.

Docker Compose: simplificarea muncii dvs. folosind Makefiles

Î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ă Docher, în dezvoltarea și implementarea microserviciilor, a devenit aproape un standard în industrie. Pe site-ul web al proiectului puteți afla că Docker este singura platformă independentă de containerizare care permite organizațiilor să creeze fără efort orice aplicație, precum și să le distribuie și să le ruleze în orice mediu - de la cloud-uri hibride la sisteme edge.

Docker Compune

Технология Docker Compune conceput pentru configurarea aplicațiilor cu mai multe containere. Un proiect Docker Compose poate conține atâtea containere Docker cât are nevoie creatorul proiectului.

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.

Docker Compose: simplificarea muncii dvs. folosind Makefiles
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 (Telefon ținte).

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

Docker Compose: simplificarea muncii dvs. folosind Makefiles
Ajutor pentru comenzile disponibile

  • make build - asamblarea unei imagini din Dockerfile. În exemplul nostru am folosit imagini existente timescale и ping. Dar imaginea api vrem să colectăm local. Acesta este exact ceea ce se va face după executarea acestei comenzi.

Docker Compose: simplificarea muncii dvs. folosind Makefiles
Construirea unui container Docker

  • make start — lansarea tuturor containerelor. Pentru a lansa un singur container, puteți folosi o comandă ca make start c=timescale.

Docker Compose: simplificarea muncii dvs. folosind Makefiles
Rularea containerului de timp

Docker Compose: simplificarea muncii dvs. folosind Makefiles
Rularea unui container ping

  • make login-timescale — conectați-vă la sesiunea bash a containerului timescale.

Docker Compose: simplificarea muncii dvs. folosind Makefiles
Rularea bash într-un container de timp

  • make db-shell - intrarea la psql într-un recipient timescale pentru a executa interogări SQL în baza de date.

Docker Compose: simplificarea muncii dvs. folosind Makefiles
Rularea psql într-un container timescaledb

  • make stop — oprirea containerelor.

Docker Compose: simplificarea muncii dvs. folosind Makefiles
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 sau make down c=api.

Docker Compose: simplificarea muncii dvs. folosind Makefiles
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ă în make 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 piata de desfacere exista o imagine Docher, care poate fi instalat cu un singur clic. Puteți verifica funcționarea containerelor la VPS. Toți clienții noi li se oferă 3 zile de testare gratuit.

Dragi cititori! Cum automatizezi Docker Compose?

Docker Compose: simplificarea muncii dvs. folosind Makefiles

Sursa: www.habr.com

Adauga un comentariu