Docker Compose: thjeshtimi i punës me përdorimin e Makefile

Çdo disa vjet, në industrinë e zhvillimit të softuerit ndodhin ndryshime paradigme. Një nga këto fenomene mund të pranohet si rritja e interesit për konceptin e mikroshërbimeve. Megjithëse mikroshërbimet janë një teknologji e njohur, vetëm së fundmi popullariteti i saj shpërtheu.

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

Docker Compose: thjeshtimi i punës me përdorimin e Makefile

Sot është e vështirë të imagjinohet zhvillimi i një sistemi të ri softujor pa përdorimin e mikroshërbimeve. Kjo situatë, nga ana e saj, na çon te platforma Docker.

Docker

Platforma Docker, në zhvillimin dhe shpërndarjen e mikroshërbimeve, është bërë standard industrial. Në faqen e projektit mund të mësohet se Docker është platforma e vetme e pavarur e konteinerizimit që lejon organizatat të krijojnë pa shumë vështirësi aplikacione dhe t'i shpërndajnë dhe ekzekutojnë ato në çdo mjedis — nga reja hibride deri te sistemet në kufi.

Docker Compose

Shkenca Docker Compose është e destinuar për konfigurimin e aplikacioneve me shumë konteinerë. Në një projekt Docker Compose mund të përfshihen aq konteinerë 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 të ndërsjellë, përdoret një skedari YAML. Docker Compose, kështu, është një mjet për përshkrimin dhe nisjen e aplikacioneve Docker me shumë konteinerë.

Docker Compose: thjeshtimi i punës me përdorimin e Makefile
Dy konteinerë që punojnë në sistemin host

GNU Make

Programi make, në esencë, paraqet një mjet për automatizimin e ndërtimit të programeve dhe bibliotekave nga kodet burimorë. Në përgjithësi, mund të flasim se make është e aplikueshme në çdo proces që përfshin ekzekutimin e komandave të rastit për të transformuar disa materiale fillestare në një formë përfundimtare, në një qëllim. Në rastin tonë, komandat docker-compose do të kthehen në qëllime abstrakte (Qëllimet Phony).

Për të komunikuar me programin make për atë që ne duam prej tij, na nevojitet një skedar Makefile.

Në tonin Makefile që do të përmbajë komandat e zakonshme docker dhe docker-compose, të cilat janë të destinuara për të zgjidhur një sërë problemesh. Këtu flasim për ndërtimin e një kontejneri, nisjen, ndalimin, ripërkujtimin e tij, organizimin e hyrjes së përdoruesit në kontejner, punën me log-et e kontejnerit dhe zgjidhjen e problemeve të tjera të ngjashme.

Varianca tipike të përdorimit të Docker Compose

Imagjinoni një aplikacion tipik web, i cili ka këto komponentë:

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

Ky aplikacion do të kërkojë 3 kontejnerë Docker dhe një skedë docker-compose, që përmban udhëzime për menaxhimin e këtyre konteinerëve. Çdo një nga kontejnerët do të ketë pika të ndryshme interaksioni. Për shembull, me kontejnerin timescale mund të punojmë pak a shumë si me bazat e të dhënave. Këtu janë disa veprime që mund të kryhen:

  • Hyrja në shell-in e Postgres.
  • Importimi dhe eksportimi i tabelave.
  • Krijimi pg_dump tabelat ose bazat e të dhënave.

Konteineri i aplikacionit Express.js, expressjs, mund të ketë këto mundësi:

  • Nxjerrja e të dhënave të freskëta nga jurnal sistemi.
  • Hyrja në shell për të kryer disa komanda.

Interaksioni me kontejnerët

Pasi kemi rregulluar lidhjen midis kontejnerëve duke përdorur Docker Compose, është koha për të krijuar interaksionin me këto kontejnerë. Në sistemin Docker Compose ka një komandë docker-compose, që mbështet opsionin --follow, i cili lejon kalimin e skedës docker-compose.yml.

Duke përdorur mundësitë e këtij opsioni, mund të kufizojmë interaksionin me sistemin vetëm me ato kontejnerë që përmenden në skedë. docker-compose.yml.

Shikoni se si duket interaksioni me kontejnerët kur përdoren komandat docker-compose. Nëse supozojmë se na nevojitet të hyjmë në shell-in psql, komandat përkatëse mund të duken kështu:

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

E njëjta komandë, për të cilën përdoret jo docker-compose, ndërsa docker, mund të duket kështu:

docker exec -it edp_timescale_1 psql -Upostgres

Kujtoni se në këto raste është gjithmonë e preferueshme të përdoret komandë docker, sesa komanda docker-compose, sepse kjo lejon të heqim nevojën për të mbajtur mend emrat e kontejnerëve.

Të dyja komandat e sipërpërmendura nuk janë aq të komplikuara. Por nëse do të kishim përdorur një "mbështjellës" në formën e Makefile, e cila do të na jepte një ndërfaqe të thjeshtë komandash dhe do të thërriste vetë komandat e gjata, mund të arrihen të njëjtat rezultate kështu:

bëni db-shell

Është krejtësisht e qartë se përdorimi Makefile ndihmon ndjeshëm në thjeshtimin e punës me kontejnerët!

Shembulli funksional

Duke u mbështetur në skemën e shqyrtuar më sipër, do të krijojmë këtë skedar të ardhshëm docker-compose.yml:

version: '3.3'
shërbimet:
    api:
        ndërtimi: .
        imazhi: mywebimage:0.0.1
        portet:
            - 8080:8080
        vëllimet:
            - \/app\/node_modules\/
        varet nga:
            - timescale
        komandë: npm run dev
        rrjetet:
            - webappnetwork
    timescale:
        imazhi: timescale\/timescaledb-postgis:latest-pg11
        ambienti:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        komandë: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
        vëllimet:
          - .\/create_schema.sql:\/docker-entrypoint-initdb.d\/create_schema.sql
        rrjetet:
           - webappnetwork
    ping:
       imazhi: willfarrell\/ping
       ambienti:
           HOSTNAME: "localhost"
           TIMEOUT: 300
rrjetet:
   webappnetwork:
       drejtues: bridge

Për menaxhimin e konfigurimit të Docker Compose dhe për komunikimin me kontejnerët që ajo përshkruan, do të krijojmë këtë skedar të ardhshëm Makefile:

THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: ndihmë ndërtim ngritje fillim poshtë shkathtësim ndal revitalizim loge loge-api ps login-timescale login-api db-shell
ndihmë:
        bëni -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 '^$@$$'
ndërtim:
        docker-compose -f docker-compose.yml ndërtim $(c)
ngritje:
        docker-compose -f docker-compose.yml lartë -d $(c)
fillim:
        docker-compose -f docker-compose.yml fillim $(c)
poshtë:
        docker-compose -f docker-compose.yml poshtë $(c)
shkathtësim:
        docker-compose -f docker-compose.yml poshtë -v $(c)
dal:
        docker-compose -f docker-compose.yml ndal $(c)
revitalizim:
        docker-compose -f docker-compose.yml ndal $(c)
        docker-compose -f docker-compose.yml lartë -d $(c)
loge:
        docker-compose -f docker-compose.yml loge --tail=100 -f $(c)
loge-api:
        docker-compose -f docker-compose.yml loge --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 kufizimin e fushës së veprimit të komandës në një kontejner të vetëm.

Pasi është Makefile gati, mund ta përdorim kështu:

  • bëni ndihmën — jep një listë të të gjitha komandave që janë të disponueshme për make.

Docker Compose: thjeshtimi i punës me përdorimin e Makefile
Ndihma në lidhje me komandat e disponueshme

  • bëni ndërtim — ndërtimi i imazhit nga Dockerfile. Në shembullin tonë, ne përdorëm imazhe ekzistuese timescale dhe ping. Por imazhi api që duam ta krijojmë në mënyrë lokale. Këtë do ta bëjmë pas ekzekutimit të këtij komandimi.

Docker Compose: thjeshtimi i punës me përdorimin e 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ërdorni komandën e tipit make start c=timescale.

Docker Compose: thjeshtimi i punës me përdorimin e Makefile
Nisja e kontejnerit timescale

Docker Compose: thjeshtimi i punës me përdorimin e Makefile
Nisja e kontejnerit ping

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

Docker Compose: thjeshtimi i punës me përdorimin e Makefile
Nisja e bash në kontejnerin timescale

  • bëni db-shell — hyrja në psql në kontejner timescale për të ekzekutuar pyetje SQL në bazën e të dhënave.

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

  • make stop — ndalimi i kontejnerëve.

Docker Compose: thjeshtimi i punës me përdorimin e Makefile
Ndalimi i kontejnerit timescale

  • make down — ndalimi dhe heqja e kontejnerëve. Për të hequr një kontejner të caktuar, mund të përdorni 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 me përdorimin e Makefile
Ndalimi dhe heqja e të gjithë kontejnerëve

Përfundime

Megjithatë, edhe pse sistemi Docker Compose ofron një gamë të gjerë komandash për menaxhimin e kontejnerëve, herë pas here këto komanda bëhen të gjata dhe ndonjëherë është e vështirë të mbahen 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. Saktësisht, bëhet fjalë për këtë:

  • Zhvilluesi ndërvepron vetëm me kontejnerët e projektit, të përshkruar në docker-compose.yml, ndërkohë që kontejnerët e tjerë të nisur nuk pengojnë punën.
  • Në rast se ndonjë komandë është harruar, mund të ekzekutoni komandën bëni ndihmën dhe të merrni ndihmën mbi komandat e disponueshme.
  • Nuk ka nevojë të mbani mend lista të gjata argumentesh për të realizuar veprime të tilla si marrja e të dhënave të reja të logut apo hyrja në sistem. Për shembull, një komandë e tipit docker-compose -f docker-compose.yml exec timescale psql -Upostgres shndërrohet në bëni db-shell.
  • Skeda Makefile mund të rregullohet fleksibilisht me rritjen e projektit. Për shembull, nuk është e vështirë të shtoni një komandë për krijimin e një kopje rezervë të bazës së të dhënave apo për të realizuar çdo veprim tjetër.
  • Nëse një ekip i madh zhvilluesish përdor të njëjtin Makefile, kjo rregullon bashkëpunimin dhe redukton numrin e gabimeve.

P.S. Në tonin marketin tonë ka një imazh Docker, i cili instalohet me një klik. Ju mund të kontrolloni funksionimin e kontejnerëve në VPS. Të gjithë klientët e rinj u ofrohen falas 3 ditë për provë.

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

Docker Compose: thjeshtimi i punës me përdorimin e Makefile

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster