Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a

Svakih nekoliko godina, industrija razvoja softvera prolazi kroz promjenu paradigme. Jedan od ovih fenomena može se prepoznati kao rastuće interesovanje za koncept mikroservisa. Iako mikroservis nije najnovija tehnologija, tek nedavno je njena popularnost bukvalno porasla.

Velike monolitne usluge sada se zamjenjuju nezavisnim, autonomnim mikroservisima. Mikroservis se može smatrati aplikacijom koja služi jednoj i vrlo specifičnoj svrsi. Na primjer, to može biti relacijski DBMS, Express aplikacija, Solr servis.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a

Danas je teško zamisliti razvoj novog softverskog sistema bez korištenja mikroservisa. A ova situacija nas, zauzvrat, vodi do Docker platforme.

doker

Platforma doker, u razvoju i implementaciji mikroservisa, postao je gotovo industrijski standard. Na web stranici projekta možete saznati da je Docker jedina nezavisna platforma za kontejnerizaciju koja omogućava organizacijama da bez napora kreiraju bilo koju aplikaciju, kao i da ih distribuiraju i pokreću u bilo kojem okruženju - od hibridnih oblaka do rubnih sistema.

Docker Compose

tehnologija Docker Compose dizajniran za konfigurisanje aplikacija sa više kontejnera. Docker Compose projekat može sadržavati onoliko Docker kontejnera koliko je potrebno kreatoru projekta.

Kada radite s Docker Compose, YAML datoteka se koristi za konfiguriranje servisa aplikacije i organiziranje njihove međusobne interakcije. Docker Compose je stoga alat za opisivanje i pokretanje Docker aplikacija sa više kontejnera.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Dva kontejnera rade na host sistemu

GNU Make

Program make, je u suštini alat za automatizaciju izgradnje programa i biblioteka iz izvornog koda. Generalno, možemo to reći make primjenjuje se na bilo koji proces koji uključuje izvršavanje proizvoljnih naredbi za transformaciju nekih ulaznih materijala u neki izlazni oblik, u neki cilj. U našem slučaju, komande docker-compose će se transformisati u apstraktne ciljeve (Telefonske mete).

Da kažem programu make o tome šta želimo od toga, potreban nam je fajl Makefile.

U našem Makefile sadržaće redovne komande docker и docker-compose, koji su dizajnirani za rješavanje mnogih problema. Naime, govorimo o sastavljanju kontejnera, o njegovom pokretanju, zaustavljanju, ponovnom pokretanju, o organiziranju prijavljivanja korisnika na kontejner, o radu s logovima kontejnera i rješavanju drugih sličnih problema.

Tipični slučajevi upotrebe za Docker Compose

Zamislimo običnu web aplikaciju koja ima sljedeće komponente:

  • TimescaleDB baza podataka (Postgres).
  • Express.js aplikacija.
  • Ping (samo kontejner, ne radi ništa posebno).

Ova aplikacija će trebati 3 Docker kontejnera i fajl docker-compose, koji sadrži upute za upravljanje ovim kontejnerima. Svaki kontejner će imati različite dodirne tačke. Na primjer, sa kontejnerom timescale biće moguće raditi otprilike na isti način kao što rade sa bazama podataka. Naime, omogućava vam da izvršite sljedeće radnje:

  • Prijavljivanje u Postgres shell.
  • Uvoz i izvoz tabela.
  • stvaranje pg_dump tabele ili baze podataka.

Express.js kontejner aplikacije, expressjs, može imati sljedeće mogućnosti:

  • Pružanje svježih podataka iz sistemskog dnevnika.
  • Prijavite se na shell da biste izvršili određene naredbe.

Interakcija sa kontejnerima

Nakon što smo postavili komunikaciju između kontejnera koristeći Docker Compose, vrijeme je da komuniciramo s tim kontejnerima. Unutar Docker Compose sistema postoji komanda docker-compose, opcija podrške -f, koji vam omogućava da prenesete datoteku na sistem docker-compose.yml.

Koristeći mogućnosti ove opcije, možete ograničiti interakciju sa sistemom samo na one kontejnere koji su spomenuti u datoteci docker-compose.yml.

Hajde da pogledamo kako izgledaju interakcije sa kontejnerima kada se koriste komande docker-compose. Ako zamislimo da se trebamo prijaviti u ljusku psql, tada bi odgovarajuće komande mogle izgledati ovako:

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

Ista naredba koja se ne koristi za izvršavanje docker-composei docker, može izgledati ovako:

docker exec -it  edp_timescale_1 psql -Upostgres

Imajte na umu da je u takvim slučajevima uvijek poželjno koristiti naredbu docker, i naredbu docker-compose, jer to eliminira potrebu za pamćenjem imena kontejnera.

Obje gore navedene naredbe nisu tako teške. Ali ako bismo koristili "omotač" u formi Makefile, koji bi nam dao sučelje u obliku jednostavnih naredbi i sam bi pozivao slične duge komande, onda bi se isti rezultati mogli postići ovako:

make db-shell

Sasvim je očigledno da upotreba Makefile znatno olakšava rad sa kontejnerima!

Radni primjer

Na osnovu gornjeg dijagrama projekta kreiraćemo sljedeću datoteku 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

Za upravljanje konfiguracijom Docker Compose i interakciju sa spremnicima koje opisuje, kreirat ćemo sljedeću datoteku 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

Većina ovdje opisanih naredbi primjenjuje se na sve kontejnere, ali koristeći opciju c= omogućava vam da ograničite opseg naredbe na jedan kontejner.

Posle Makefile spreman, možete ga koristiti ovako:

  • make help — izdavanje liste svih dostupnih komandi za make.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Pomoć za dostupne komande

  • make build - sastavljanje slike iz Dockerfile. U našem primjeru koristili smo postojeće slike timescale и ping. Ali slika api želimo prikupiti lokalno. Upravo to će biti učinjeno nakon izvršenja ove naredbe.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Izgradnja Docker kontejnera

  • make start — pokretanje svih kontejnera. Da biste pokrenuli samo jedan kontejner, možete koristiti naredbu poput make start c=timescale.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Pokretanje kontejnera vremenske skale

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Pokretanje ping kontejnera

  • make login-timescale — prijavite se na bash sesiju kontejnera timescale.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Pokretanje bash-a u kontejneru vremenske skale

  • make db-shell - ulaz u psql u kontejneru timescale za izvršavanje SQL upita prema bazi podataka.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Pokretanje psql-a u timescaledb kontejneru

  • make stop — zaustavljanje kontejnera.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Zaustavljanje kontejnera vremenske skale

  • make down — zaustavljanje i uklanjanje kontejnera. Da biste uklonili određeni kontejner, možete koristiti ovu naredbu koja navodi željeni kontejner. Na primjer - make down c=timescale ili make down c=api.

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a
Zaustavljanje i brisanje svih kontejnera

Ishodi

Iako nam Docker Compose daje bogat skup naredbi za upravljanje kontejnerima, ponekad ove naredbe mogu postati dugačke i teško ih je zapamtiti.

Način upotrebe Makefile pomogla nam je da uspostavimo brzu i jednostavnu interakciju sa kontejnerima iz datoteke docker-compose.yml. Naime, govorimo o sledećem:

  • Programer komunicira samo sa projektnim kontejnerima opisanim u docker-compose.yml, rad ne ometaju drugi tekući kontejneri.
  • U slučaju da je određena naredba zaboravljena, možete je izvršiti make help i dobiti pomoć za dostupne komande.
  • Ne morate da pamtite dugačke liste argumenata da biste izvršili radnje kao što su dobijanje najnovijih unosa u dnevnik ili prijavljivanje u sistem. Na primjer, naredba poput docker-compose -f docker-compose.yml exec timescale psql -Upostgres pretvara u make db-shell.
  • fajl Makefile Možete mu se fleksibilno prilagoditi kako projekt raste. Na primjer, lako je dodati naredbu za kreiranje sigurnosne kopije baze podataka ili izvođenje bilo koje druge radnje.
  • Ako veliki tim programera koristi isto Makefile, ovo pojednostavljuje saradnju i smanjuje greške.

PS U našem marketplace postoji slika doker, koji se instalira jednim klikom. Možete provjeriti kako kontejneri rade VPS. Svim novim kupcima je omogućeno 3 dana testiranja besplatno.

Dragi čitaoci! Kako automatizujete Docker Compose?

Docker Compose: Pojednostavljivanje vašeg rada pomoću Makefiles-a

izvor: www.habr.com

Dodajte komentar