Docker Compose: poenostavitev dela z uporabo Makefile

Vsakih nekaj let v industriji razvoja programske opreme pride do spremembe paradigme. Ena izmed takih pojavov je lahko rast zanimanja za koncept mikrostoritev. Čeprav mikrostoritve niso povsem nova tehnologija, je njihova priljubljenost v zadnjem času dobesedno eksplodirala.

Velike monolitne storitve v današnjem času nadomeščajo neodvisne avtonomne mikrostoritve. Mikrostoritev lahko obravnavamo kot aplikacijo, ki služi eni sami in zelo specifični funkciji. Na primer, to je lahko relacijska baza podatkov, aplikacija Express, storitev Solr.

Docker Compose: poenostavitev dela z uporabo Makefile

Danes je težko si predstavljati razvoj nove programske rešitve brez uporabe mikrostoritev. Ta situacija nas vodi do platforme Docker.

Docker

Platforma Docker, pri razvoju in uvajanju mikrostoritev, je postalo skoraj industrijski standard. Na spletni strani projekta lahko izveste, da je Docker edina neodvisna platforma za kontejnerizacijo, ki omogoča organizacijam, da brez velikih težav ustvarjajo kakršne koli aplikacije in jih distribuirajo ter izvajajo v različnih okoljih – od hibridnih oblakov do obrobnih sistemov.

Docker Compose

Tehnologija Docker Compose je namenjena konfiguraciji večkontejnerskih aplikacij. V projekt Docker Compose lahko vključimo toliko Docker kontejnerjev, kolikor jih potrebuje ustvarjalec tega projekta.

Pri delu z Docker Compose za nastavitev storitev aplikacije in organizacijo njihove medsebojne interakcije se uporablja datoteka YAML. Docker Compose je torej orodje za opisovanje in zagon večkontejnerskih aplikacij Docker.

Docker Compose: poenostavitev dela z uporabo Makefile
Dva kontejnerja, ki delujeta na gostiteljski sistem

GNU Make

Program make, je v osnovi orodje za avtomatizacijo gradnje programov in knjižnic iz izvorne kode. Na splošno lahko rečemo, da make se uporablja za vsak proces, ki vključuje izvajanje poljubnih ukazov za pretvorbo določenih izvornih materialov v določen končni izgled, z določenim ciljem. V našem primeru se bodo ukazi docker-compose pretvarjali v abstraktne cilje (Phony targets).

Da sporočimo programu make kaj pričakujemo od njega, potrebujemo datoteko Makefile.

V našem Makefile bodo vsebovane običajne ukaze docker in docker-compose, ki so namenjene reševanju številnih nalog. Natančneje, govorimo o sestavljanju kontejnerja, njegovem zagonu, ustavitvi, ponovnem zagonu, organizaciji prijave uporabnika v kontejner, delu z logi kontejnerja in reševanju drugih podobnih nalog.

Tipični scenariji uporabe Docker Compose

Predstavljajmo si običajno spletno aplikacijo, ki ima naslednje komponente:

  • Baza podatkov TimescaleDB (Postgres).
  • Express.js aplikacija.
  • Ping (samo kontejner, ki ne počne nič posebnega).

Ta aplikacija bo potrebovala 3 Docker kontejnerje in datoteko docker-compose, ki vsebuje navodila za upravljanje s tema kontejnerjema. Vsak od kontejnerjev bo imel različne točke interakcije. Na primer, s kontejnerjem timescale lahko delamo približno tako, kot delamo z bazami podatkov. Natančneje, omogoča izvajanje naslednjih dejanj:

  • Vstop v Postgres lupino.
  • Uvoz in izvoz tabel.
  • Ustvarjanje pg_dump tabele ali baz podatkov.

Kontejner Express.js aplikacije, expressjs, lahko ima naslednje možnosti:

  • Zagotavljanje svežih podatkov iz sistemskega dnevnika.
  • Vstop v lupino za izvajanje nekaterih ukazov.

Interakcija s kontejnami

Ko smo nastavili povezavo med kontejnerji z uporabo Docker Compose, je čas, da vzpostavimo interakcijo s temi kontejnerji. V okviru sistema Docker Compose je ukaz docker-compose, ki podpira možnost -f, ki omogoča, da sistemu predamo datoteko docker-compose.yml.

Z uporabo te možnosti lahko omejimo interakcijo z sistemom samo na tiste kontejnerje, ki so omenjeni v datoteki docker-compose.yml.

Oglejmo si, kako izgledajo interakcije s kontejnerji pri uporabi ukazov docker-compose. Če predpostavimo, da moramo vstopiti v lupino psql, bi lahko ustrezni ukazi izgledali takole:

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

Ista ukazna vrstica, za izvedbo katere ne uporabljamo docker-compose, a docker, bi lahko izgledala takole:

docker exec -it edp_timescale_1 psql -Upostgres

Upoštevajte, da je v takih primerih vedno bolje uporabiti ukaz docker, namesto ukaza docker-compose, saj to odpravlja potrebo po pomnjenju imen kontejnerjev.

Obe zgoraj navedeni ukazni vrstici nista pravzaprav tako zapleteni. Toda če bi uporabili 'ovitek' v obliki Makefile, ki bi nam dala vmesnik v obliki preprostih ukazov in sama klicala dolge ukaze, bi lahko dosegli podobne rezultate tako:

make db-shell

Očitno je, da uporaba Makefile znatno poenostavi delo z vsebniki!

Delovni primer

Na podlagi prej obravnavane sheme projekta bomo ustvarili naslednjo datoteko 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 z konfiguracijo Docker Compose in za interakcijo z vsebnikov, ki jih opisuje, bomo ustvarili naslednjo datoteko 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 tukaj opisanih ukazov se uporablja za vse vsebnike, vendar uporaba možnosti c= omogoča omejitev obsega ukaza na en sam vsebnik.

Po tem, ko Makefile pripravljen, uporabite ga lahko tako:

  • make help — prikaz vseh dostopnih ukazov za make.

Docker Compose: poenostavitev dela z uporabo Makefile
Pomoč o dostopnih ukazih

  • make build — gradnja slike iz Dockerfile. V našem příkladu jsme použili existující obrazy timescale in ping. Ale obraz api chceme sestavit lokálně. Toho bude dosaženo po provedení tohoto příkazu.

Docker Compose: poenostavitev dela z uporabo Makefile
Sestavení kontejneru Docker

  • make start — spuštění všech kontejnerů. Pro spuštění pouze jednoho kontejneru lze použít příkaz ve formátu make start c=timescale.

Docker Compose: poenostavitev dela z uporabo Makefile
Spuštění kontejneru timescale

Docker Compose: poenostavitev dela z uporabo Makefile
Spuštění kontejneru ping

  • make login-timescale — přihlášení do bash session kontejneru timescale.

Docker Compose: poenostavitev dela z uporabo Makefile
Spuštění bash v kontejneru timescale

  • make db-shell — přihlášení do psql v vsebniku timescale pro provádění SQL dotazů na databázi.

Docker Compose: poenostavitev dela z uporabo Makefile
Spuštění psql v kontejneru timescaledb

  • make stop — zastavení kontejnerů.

Docker Compose: poenostavitev dela z uporabo Makefile
Zastavení kontejneru timescale

  • make down — zastavení a odstranění kontejnerů. Pro odstranění konkrétního kontejneru lze použít tento příkaz s určením konkrétního kontejneru. Například — make down c=timescale ili make down c=api.

Docker Compose: poenostavitev dela z uporabo Makefile
Zastavení a odstranění všech kontejnerů

Zaključki

I když systém Docker Compose nabízí širokou škálu příkazů určených pro správu kontejnerů, někdy se tyto příkazy stávají dlouhými a obtížně zapamatovatelnými.

Metodika použití Makefile nám pomohla usnadnit rychlou a jednoduchou interakci s kontejnery z souboru docker-compose.yml. A to konkrétně znamená:

  • Vývojář interaguje pouze s kontejnerem projektu popsaným v docker-compose.yml, ostatní spuštěné kontejnery práci neruší.
  • Pokud si někdo zapamatuje určitý příkaz, může provést příkaz make help a získat nápovědu k dostupným příkazům.
  • Není třeba si zapamatovat dlouhé seznamy argumentů pro provedení takových akcí, jako je získání čerstvých záznamů protokolu nebo přihlášení do systému. Například příkaz ve formátu docker-compose -f docker-compose.yml exec timescale psql -Upostgres se mění na make db-shell.
  • unutar svakog kontejnera prema zadanim postavkama će izgledati ovako: Makefile lze flexibilně přizpůsobit, jakmile projekt roste. Například není obtížné přidat příkaz pro vytvoření zálohy databáze nebo pro provedení jakékoli jiné akce.
  • Pokud velký tým vývojářů používá stejný Makefile, to usnadňuje spolupráci a snižuje počet chyb.

P.S. V našem tržnem mestu existuje obraz Docker, který se instaluje jedním kliknutím. Můžete zkontrolovat fungování kontejnerů na VPS. Novým klientům je nabízena 3 dny testování zdarma.

Spoštovani bralci! Jak automatizujete práci s Docker Compose?

Docker Compose: poenostavitev dela z uporabo Makefile

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster