Docker Compose: thjeshtimi i punës duke përdorur Makefile

Çdo disa vjet, industria e zhvillimit tĂ« softuerit pĂ«rjeton njĂ« ndryshim paradigme. NjĂ« nga kĂ«to fenomene mund tĂ« pranohet si rritja e interesit pĂ«r konceptin e mikroshĂ«rbimeve. Edhe pse mikroshĂ«rbimet nuk janĂ« njĂ« teknologji e re, vetĂ«m kohĂ«t e fundit popullariteti i saj Ă«shtĂ« rritur ndjeshĂ«m.

Shërbimet e mëdha monolitike po zëvendësohen sot nga mikroshërbime të pavarura dhe autonome. Një mikroshërvim mund të përshkruhet si një aplikacion që shërben një qëllim të vetëm dhe shumë specifik. Për shembull, mund të jetë një DB relacional, një aplikacion Express, ose një shërbim Solr.

Docker Compose: thjeshtimi i punës duke përdorur Makefile

Sot është e vështirë të imagjinosh zhvillimin e një sistemi të ri softuerik pa përdorimin e mikroshërbimeve. Kjo situatë na çon në platformën Docker.

Docker

Platforma Docker, nĂ« zhvillimin dhe implementimin e mikroshĂ«rbimeve, Ă«shtĂ« bĂ«rĂ« praktikisht standard industrial. NĂ« faqen e projektit mund tĂ« mĂ«soni se Docker Ă«shtĂ« platforma e vetme e pavarur e kontejnerizimit qĂ« u lejon organizatave tĂ« krijojnĂ« çdo aplikacion pa shumĂ« mundime dhe ta shpĂ«rndajnĂ« atĂ« nĂ« çdo mjedis — nga nĂ« bulku deri nĂ« sisteme periferike.

Docker Compose

Teknologjia Docker Compose është e destinuar për konfigurimin e aplikacioneve me shumë kontejnerë. Në një projekt Docker Compose mund të përfshihen aq kontejnerë Docker sa dëshiron krijuesi i këtij projekti.

Kur punoni me Docker Compose, për të konfiguruar shërbimet e aplikacionit dhe për të organizuar ndërveprimin e tyre me njëri-tjetrin, përdoret një skedar YAML. Docker Compose, kështu, është një mjet për përshkrimin dhe ekzekutimin e aplikacioneve Docker me shumë kontejnerë.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Dy kontejnerë që punojnë në sistemin pritës

GNU Make

Programi make, në thelb, është një mjet për automatizimin e ndërtimit të programeve dhe librarive nga kodi burimor. Në përgjithësi, mund të thuhet se make është e aplikueshme në çdo proces që përfshin ekzekutimin e komandave të ndryshme për të transformuar disa materiale të caktuara në një formë përfundimtare, në një qëllim. Në rastin tonë, komandat docker-compose do të konvertohen në qëllime abstrakte (Shtypje të rreme).

Për t'i komunikuar programit make çfarë dëshirojmë prej tij, na nevojitet një skedar Makefile.

Në shërbimin tonë Makefile do të përmbajë komandat e zakonshme docker dhe docker-compose, të cilat janë të destinuara për zgjidhjen e shumë detyrave. Në veçanti, flasim për ndërtimin e kontejnerit, aktivizimin e tij, ndalimin, ri-aktivizimin, organizimin e hyrjes së përdoruesit në kontejner, punën me log-et e kontejnerit dhe zgjidhjen e problemeve të ngjashme.

Shembuj tipikë të përdorimit të Docker Compose

Imagjinoni një aplikacion të zakonshëm në web, që ka komponentët e mëposhtëm:

  • Baza e tĂ« dhĂ«nave TimescaleDB (Postgres).
  • Aplikacioni Express.js.
  • Ping (thjesht njĂ« kontejner, qĂ« nuk bĂ«n gjĂ« tĂ« veçantĂ«).

Ky aplikacion do tĂ« kĂ«rkojĂ« 3 kontejnerĂ« Docker dhe njĂ« skedar docker-compose, qĂ« pĂ«rmban udhĂ«zime pĂ«r menaxhimin e kĂ«tyre konteinerĂ«ve. Çdo kontejner do tĂ« ketĂ« pika tĂ« ndryshme ndĂ«rveprimi. PĂ«r shembull, me kontejnerin timescale mund tĂ« punohet si me bazat e tĂ« dhĂ«nave. NĂ« veçanti, ai lejon kryerjen e veprimeve tĂ« mĂ«poshtme:

  • Hyrje nĂ« shell-in Postgres.
  • Import dhe eksport tabelash.
  • Krijimi pg_dump tabelash ose bazash tĂ« dhĂ«nash.

Kontejneri i aplikacionit Express.js, expressjs, mund të ketë mundësitë e mëposhtme:

  • ShqipĂ«rimi i tĂ« dhĂ«nave tĂ« reja nga regjistri sistemor.
  • Hyrje nĂ« shell pĂ«r ekzekutimin e disa komandave.

Ndërveprimi me kontejnerët

Pas konfigurimit të lidhjeve midis kontejnerëve duke përdorur Docker Compose, është koha për të vendosur ndërveprimin me këta kontejnerë. Në sistemin Docker Compose ka një komandë docker-compose, që mbështet opsionin -f, i cili lejon kalimin e skedarit docker-compose.yml.

Duke përdorur mundësitë e këtij opsioni, mund të kufizohet ndërveprimi me sistemin në vetëm ato kontejnerë që përmenden në skedarin docker-compose.yml.

Le të shohim se si duken ndërveprimet me kontejnerët kur përdoren komandat docker-compose. Nëse imagjinoni se na nevojitet të hyjmë në shell psql, komandat përkatëse mund të duken kështu:

docker-compose -f docker-compose.yml exec timescale psql -Upostgres

I njëjti komandë, për të cilin përdoret jo docker-compose, dhe docker, mund të duket kështu:

docker exec -it edp_timescale_1 psql -Upostgres

Vini re se në raste të tilla është gjithmonë më e preferueshme të përdorni komandën docker, sesa komandën docker-compose, pasi kjo lejon evitimin e nevojës për të mbajtur mend emrat e kontejnerëve.

Të dy komandat e mësipërme nuk janë aq të ndërlikuara. Por, nëse do të përdornim një "ndërfaqe" në formën e Makefile, e cila do të na jepte një ndërfaqe me komandat e thjeshta dhe vetë do të thërriste këto komanda të gjata, atëherë të njëjtat rezultate do të mund të arriheshin kështu:

make db-shell

ËshtĂ« qartĂ« se pĂ«rdorimi i Makefile e bĂ«n punĂ«n me kontejnerĂ«t shumĂ« mĂ« tĂ« thjeshtĂ«!

Një shembull praktik

Duke bazuar në skemën e projektit të shqyrtuar më parë, do të krijojmë skedarin që vijon 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ëpunuar me kontejnerët që ajo përshkruan, do të krijojmë skedarin vijues 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 aplikohen për të gjithë kontejnerët, por përdorimi i opsionit c= lejon që fushën e veprimit të komandës ta kufizojmë në një kontejner.

Pas që Makefile gati, mund ta përdorim kështu:

  • make help — listimi i tĂ« gjitha komandave tĂ« disponueshme pĂ«r make.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Ndihma mbi komandat e disponueshme

  • make build — ndĂ«rtimi i imazhit nga Dockerfile. NĂ« shembullin tonĂ«, ne pĂ«rdorĂ«m imazhe ekzistuese timescale dhe ping. Por imazhi api qĂ« dĂ«shirojmĂ« ta ndĂ«rtojmĂ« nĂ« mĂ«nyrĂ« lokale. Kjo do tĂ« realizohet pas ekzekutimit tĂ« kĂ«saj komande.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Ndërtimi i kontejnerit Docker

  • make start — nisja e tĂ« gjithĂ« kontejnerĂ«ve. PĂ«r tĂ« nisur vetĂ«m njĂ« kontejner, mund tĂ« pĂ«rdoreni njĂ« komandĂ« si make start c=timescale.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Nisja e kontejnerit timescale

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Nisja e kontejnerit ping

  • make login-timescale — hyrja nĂ« sesionin bash tĂ« kontejnerit timescale.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Nisja e bash-it në kontejnerin timescale

  • make db-shell — hyrja nĂ« psql nĂ« kontejner timescale pĂ«r tĂ« ekzekutuar kĂ«rkesat SQL nĂ« bazĂ«n e tĂ« dhĂ«nave.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Nisja e psql në kontejnerin timescaledb

  • make stop — ndalimi i kontejnerĂ«ve.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Ndalimi i kontejnerit timescale

  • make down — ndalimi dhe heqja e kontejnerĂ«ve. PĂ«r tĂ« fshirĂ« njĂ« kontejner specifik, mund tĂ« pĂ«rdorim kĂ«tĂ« komandĂ« me pĂ«rcaktimin e kontejnerit tĂ« dĂ«shiruar. PĂ«r shembull — make down c=timescale ose make down c=api.

Docker Compose: thjeshtimi i punës duke përdorur Makefile
Ndalimi dhe heqja e të gjithë kontejnerëve

Përfundimet

Pavarësisht se sistemi Docker Compose na jep një gamë të gjerë komandash për menaxhimin e kontejnerëve, herë-other komandat bëhen të gjata, duke e bërë të vështirë që t'i mbajmë mend.

Metodologjia e përdorimit Makefile na ndihmoi të krijojmë një ndërveprim të shpejtë dhe të thjeshtë me kontejnerët nga skedari docker-compose.yml. Konkretisht, bëhet fjalë për këtë:

  • Programuesi ndĂ«rvepron vetĂ«m me kontejnerĂ«t e projektit, tĂ« pĂ«rshkruar nĂ« docker-compose.yml, punĂ«n nuk e pengojnĂ« kontejnerĂ«t e tjerĂ« nĂ« funksion.
  • NĂ« rast se ndonjĂ« komandĂ« harrohet, mund tĂ« ekzekutojmĂ« komandĂ«n make help dhe tĂ« marrim ndihmĂ« mbi komandat e disponueshme.
  • Nuk Ă«shtĂ« e nevojshme tĂ« mbani mend lista tĂ« gjata argumentesh pĂ«r tĂ« kryer veprime si fitimi i regjistrimeve tĂ« reja tĂ« logut ose hyrja nĂ« sistem. PĂ«r shembull, njĂ« komandĂ« si docker-compose -f docker-compose.yml exec timescale psql -Upostgres shndĂ«rrohet nĂ« make db-shell.
  • Skedari Makefile mund tĂ« pĂ«rshtatet me fleksibilitet ndĂ«rsa projekti rritet. PĂ«r shembull, nuk Ă«shtĂ« e vĂ«shtirĂ« tĂ« shtosh njĂ« komandĂ« pĂ«r krijimin e 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Ă«jtin Makefile, kjo rendit ndihmon nĂ« punĂ«n e pĂ«rbashkĂ«t dhe zvogĂ«lon numrin e gabimeve.

P.S. Në shërbimin tonë merkatplace-in tonë ka një imazh Docker, i cili instalohet me një klik. Mund të kontrolloni punën e kontejnerëve në VPS. Të gjithë klientët e rinj ofrohen falas 3 ditë për testim.

Të nderuar lexues! Si po e automatizoni punën me Docker Compose?

Docker Compose: thjeshtimi i punës duke përdorur Makefile

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster