Docker Compose: zjednodušenie práce s využitím Makefile

Každých pár rokov sa v priemysle vývoja softvéru mení paradigma. Jedným z takýchto javov je rastúci záujem o koncept mikroservisov. Hoci mikroservisy nie sú úplne nová technológia, ich popularita v poslednej dobe doslova vystúpila do výšin.

Veľké monolitické služby dnes nahrádzajú nezávislé autonómne mikroservisy. Mikroservis možno považovať za aplikáciu, ktorá slúži jedinému a veľmi špecifickému účelu. Napríklad — to môže byť relačná databázová sústava, aplikácia Express, služba Solr.

Docker Compose: zjednodušenie práce s využitím Makefile

V dnešnej dobe si ťažko predstaviť vývoj nového softvérového systému bez použitia mikroservisov. A táto situácia nás, na druhej strane, vedie k platforme Docker.

Docker

Platforma Docker, pri vývoji a nasadzovaní mikroservisov, sa stala prakticky priemyselným štandardom. Na stránke projektu sa môžete dozvedieť, že Docker je jediná nezávislá platforma kontajnerizácie, ktorá organizáciám umožňuje bez väčších ťažkostí vytvárať akékoľvek aplikácie, ako aj ich distribuovať a spúšťať v akýchkoľvek prostrediach — od hybridných cloudov po hraničné systémy.

Docker Compose

Technológia Docker Compose je určená na konfiguráciu viackontajnerových aplikácií. V projektoch Docker Compose môže byť zahrnutých toľko kontajnerov Docker, koľko je potrebné tvorcovi tohto projektu.

Pri práci s Docker Compose na nastavenie služieb aplikácie a organizovanie ich vzájomného prepojenia sa používa YAML súbor. Docker Compose je tak nástroj na popis a spúšťanie viackontajnerových aplikácií Docker.

Docker Compose: zjednodušenie práce s využitím Makefile
Dva kontajnery, ktoré bežia na hostiteľskom systéme

GNU Make

Program make, v podstate predstavuje nástroj na automatizáciu zostavovania programov a knižníc zo zdrojového kódu. Vo všeobecnosti môžeme povedať, že make je aplikovateľná na akýkoľvek proces, ktorý zahŕňa vykonávanie ľubovoľných príkazov na transformáciu určitých zdrojových materiálov na určitý výsledný tvar, na určitý cieľ. V našom prípade príkazy docker-compose budú transformované na abstraktné ciele (Falošné ciele).

Aby sme programu make povedali, čo od neho chceme, potrebujeme súbor Makefile.

V našom Makefile budú obsiahnuté bežné príkazy docker a docker-compose, ktoré sú určené na riešenie rôznych úloh. Hovoríme o zostavení kontajnera, jeho spustení, zastavení, reštarte, organizácii prístupu používateľa do kontajnera, práci s logmi kontajnera a riešení iných podobných úloh.

Typické príklady použitia Docker Compose

Predstavme si bežnú webovú aplikáciu, ktorá má nasledujúce komponenty:

  • Databáza TimescaleDB (Postgres).
  • Aplikácia Express.js.
  • Ping (len kontajner, ktorý nič zvláštne nerobí).

Táto aplikácia bude potrebovať 3 kontajnery Docker a súbor docker-compose, ktorý obsahuje pokyny na riadenie týchto kontajnerov. Každý z kontajnerov bude mať rôzne body interakcie. Napríklad s kontajnerom timescale sa bude môcť pracovať podobne ako s databázami. A to znamená, že umožňuje vykonávať nasledujúce činnosti:

  • Prístup do shellu Postgres.
  • Import a export tabuliek.
  • Vytvorenie pg_dump tabuliek alebo databáz.

Kontajner aplikácie Express.js, expressjs, môže mať nasledujúce možnosti:

  • Poskytovanie čerstvých údajov zo systémového denníka.
  • Prístup do shellu na vykonávanie určitých príkazov.

Interakcia s kontajnermi

Po nastavení spojenia medzi kontajnermi pomocou Docker Compose je čas na zriadenie interakcie s týmito kontajnermi. V rámci systému Docker Compose existuje príkaz docker-compose, ktorý podporuje možnosť -f, ktorá umožňuje systému odovzdať súbor docker-compose.yml.

Využitím možností tejto voľby môžeme obmedziť interakciu so systémom len na tie kontajnery, ktoré sú uvedené v súbore. docker-compose.yml.

Pozrime sa, ako vyzerajú interakcie s kontajnermi pri používaní príkazov docker-compose. Ak si predstavíme, že potrebujeme vstúpiť do shellu psql, potom môžu príslušné príkazy vyzerať takto:

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

Ten istý príkaz, pre ktorý sa nepoužíva docker-compose, a docker, môže vyzerať takto:

docker exec -it edp_timescale_1 psql -Upostgres

Upozorňujeme, že v týchto prípadoch je vždy lepšie použiť príkaz docker, a nie príkaz docker-compose, pretože to eliminuje potrebu pamätať si mená kontajnerov.

Obe uvedené príkazy nie sú až tak zložité. Ale keby sme použili 'obal' vo forme Makefile, ktorá by nám poskytovala rozhranie vo forme jednoduchých príkazov a sama by volala podobné dlhé príkazy, takto by bolo možné dosiahnuť tie isté výsledky:

make db-shell

Je úplne jasné, že použitie Makefile výrazne zjednodušuje prácu s kontajnermi!

Pracovný príklad

Na základe vyššie uvedeného schémy projektu vytvoríme nasledujúci súbor 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

Na správu konfigurácie Docker Compose a na interakciu s kontajnermi, ktoré opisuje, vytvoríme nasledujúci súbor 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

Väčšina tu popísaných príkazov sa uplatňuje na všetky kontajnery, ale použitie možnosti c= umožňuje obmedziť rozsah príkazu na jeden kontajner.

Po tom, čo Makefile je pripravené, môže sa používať takto:

  • make help — výstup zoznamu všetkých príkazov dostupných pre make.

Docker Compose: zjednodušenie práce s využitím Makefile
Pomoc k dostupným príkazom

  • make build — zostavovanie obrazu z Dockerfile. V našom príklade sme použili existujúce obrazy timescale a ping. Ale obraz api chceme zostaviť lokálne. Presne to sa bude robiť po vykonaní tejto príkazu.

Docker Compose: zjednodušenie práce s využitím Makefile
Zostavenie kontajnera Docker

  • make start — spustenie všetkých kontajnerov. Na spustenie len jedného kontajnera môžeme použiť príkaz vo forme make start c=timescale.

Docker Compose: zjednodušenie práce s využitím Makefile
Spustenie kontajnera timescale

Docker Compose: zjednodušenie práce s využitím Makefile
Spustenie kontajnera ping

  • make login-timescale — prihlásenie do bash relácie kontajnera timescale.

Docker Compose: zjednodušenie práce s využitím Makefile
Spustenie bash v kontajneri timescale

  • make db-shell — prihlásenie do psql kontajnera timescale na vykonávanie SQL dopytov na databáze.

Docker Compose: zjednodušenie práce s využitím Makefile
Spustenie psql v kontajneri timescaledb

  • make stop — zastavenie kontajnerov.

Docker Compose: zjednodušenie práce s využitím Makefile
Zastavenie kontajnera timescale

  • make down — zastavenie a odstránenie kontajnerov. Na odstránenie konkrétneho kontajnera môžeme použiť tento príkaz s uvedením požadovaného kontajnera. Napríklad — make down c=timescale alebo make down c=api.

Docker Compose: zjednodušenie práce s využitím Makefile
Zastavenie a odstránenie všetkých kontajnerov

Zhrnutie

Napriek tomu, že systém Docker Compose nám poskytuje rozsiahly súbor príkazov na správu kontajnerov, niekedy sa tieto príkazy stávajú dlhými, čo sťažuje ich zapamätanie.

Metodika použitia Makefile nám pomohla zabezpečiť rýchlu a jednoduchú interakciu s kontajnermi zo súboru docker-compose.yml. A konkrétne ide o nasledujúce:

  • Vývojár interaguje iba s kontajnermi projektu, opísanými v docker-compose.yml, ostatné spustené kontajnery mu neprekážajú.
  • V prípade, že si nejaký príkaz zabudneme, môžeme vykonať príkaz make help a získať pomoc k dostupným príkazom.
  • Nie je potrebné zapamätať si dlhé zoznamy argumentov na vykonávanie takých činností, ako je získavanie nových záznamov v logoch alebo prihlasovanie do systému. Napríklad príkaz vo forme docker-compose -f docker-compose.yml exec timescale psql -Upostgres sa transformuje na make db-shell.
  • Súbor Makefile sa môže, ako projekt rastie, flexibilne prispôsobovať. Napríklad, nie je ťažké pridať príkaz na zálohovanie databázy alebo vykonávanie inej operácie.
  • Ak veľká skupina vývojárov používa ten istý Makefile, usporadúva to spoluprácu a znižuje množstvo chýb.

P.S. V našom trhu existuje obraz Docker, ktorý sa inštaluje jedným kliknutím. Môžete skontrolovať fungovanie kontajnerov na VPS. Všetkým novým klientom sú bezplatne poskytnuté 3 dni na testovanie.

Vážení čitatelia! Ako automatizujete prácu s Docker Compose?

Docker Compose: zjednodušenie práce s využitím Makefile

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster