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

Každých několik let se v oblasti vývoje software objevuje změna paradigmatu. Jedním z takových jevů je nárůst zájmu o koncept mikroslužeb. Přestože mikroslužby nejsou zcela novou technologií, jejich popularita v poslední době doslova vzrostla do nebe.

Velké monolitické služby v dnešní době nahrazují nezávislé autonomní mikroslužby. Mikroslužba může být považována za aplikaci, která slouží jednomu konkrétnímu a velmi specifickému účelu. Například to může být relační databázový systém, aplikace Express nebo služba Solr.

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

Dnes je těžké si představit vývoj nového softwarového systému bez použití mikroslužeb. Tato situace nás zase vede k platformě Docker.

Docker

Platforma Docker, v oblasti vývoje a nasazení mikroslužeb, se stala prakticky průmyslovým standardem. Na stránkách projektu se lze dozvědět, že Docker je jediná nezávislá platforma pro kontejnerizaci, která organizacím umožňuje bez větší námahy vytvářet jakékoliv aplikace a také je distribuovat a spouštět v jakýchkoliv prostředích – od hybridních cloudů až po okrajové systémy.

Docker Compose

Technologie Docker Compose slouží k konfiguraci vícetekutních aplikací. V projektu Docker Compose může být zahrnuto tolik kontejnerů Docker, kolik potřebuje tvůrce tohoto projektu.

Při práci s Docker Compose se pro nastavení služeb aplikace a organizaci jejich spolupráce používá YAML soubor. Docker Compose je tedy nástroj pro popis a spuštění vícetekutních aplikací Docker.

Docker Compose: zjednodušení práce s využitím Makefile
Dva kontejnery běžící na hostitelském systému

GNU Make

Program make, v podstatě představuje nástroj pro automatizaci sestavování programů a knihoven ze zdrojového kódu. Obecně lze říci, že make se vztahuje na jakýkoliv proces, který zahrnuje vykonávání libovolných příkazů za účelem transformace určitých vstupních materiálů do určitého výsledného stavu, k určitému cíli. V našem případě příkazy docker-compose budou transformovány na abstraktní cíle (Phony targets).

Abychom programu make sdělili, co od něj chceme, budeme potřebovat soubor Makefile.

V našem Makefile obsahující běžné příkazy docker a docker-compose, které jsou určeny k řešení mnoha úloh. Konkrétně jde o sestavení kontejneru, jeho spuštění, zastavení, restartování, organizaci přístupu uživatele do kontejneru, práci s logy kontejneru a řešení dalších podobných úloh.

Typické možnosti použití Docker Compose

Představme si běžnou webovou aplikaci, která obsahuje následující komponenty:

  • Databáze TimescaleDB (Postgres).
  • Aplikace Express.js.
  • Ping (obecký kontejner, který nic zvláštního nedělá).

Této aplikaci budou potřeba 3 kontejnery Docker a soubor docker-compose, který obsahuje pokyny pro řízení těchto kontejnerů. Každý z kontejnerů bude mít různé interakční body. Například s kontejnerem timescale se bude pracovat zhruba tak, jak se pracuje s databázemi. To zahrnuje následující akce:

  • Přístup do shellu Postgres.
  • Import a export tabulek.
  • Tvorba pg_dump tabulky nebo databáze.

Kontejner aplikace Express.js, expressjs, může mít následující funkce:

  • Poskytování aktuálních dat z systémového logu.
  • Přístup do shellu pro vykonávání příkazů.

Interakce s kontejnery

Jakmile jsme nastavili propojení mezi kontejnery pomocí Docker Compose, je čas nastavit interakci s těmito kontejnery. V rámci systému Docker Compose existuje příkaz docker-compose, který podporuje volbu -f, která umožňuje systému předat soubor docker-compose.yml.

Pomocí této volby můžeme omezit interakci se systémem pouze na ty kontejnery, které jsou uvedeny v souboru docker-compose.yml.

Podívejme se, jak vypadají interakce s kontejnery při použití příkazů docker-compose. Pokud předpokládáme, že potřebujeme vstoupit do shellu psql, odpovídající příkazy mohou vypadat takto:

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

Tentýž příkaz, pro jehož provedení se používá pouze docker-compose, a docker, může vypadat takto:

docker exec -it edp_timescale_1 psql -Upostgres

Všimněte si, že v takových případech je vždy lepší použít příkaz docker, než příkaz docker-compose, protože to eliminuje potřebu pamatovat si jména kontejnerů.

Obě výše uvedené příkazy nejsou příliš složité. Ale kdybychom využili "obal" v podobě Makefile, který by nám poskytoval rozhraní ve formě jednoduchých příkazů a sám by volal podobné dlouhé příkazy, by bylo možné dosáhnout stejných výsledků takto:

make db-shell

Je zcela zřejmé, že použití Makefile výrazně zjednodušuje práci s kontejnery!

Ukázkový příklad

Na základě výše uvedeného schématu projektu vytvoříme následující soubor 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

Pro řízení konfigurace Docker Compose a pro interakci s kontejnery, které popisuje, vytvoříme následující soubor 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ětšina zde popsaných příkazů se vztahuje na všechny kontejnery, ale použití volby c= umožňuje omezit účinnost příkazu na jeden kontejner.

Jakmile je Makefile hotový, lze ho použít takto:

  • make help — výpis seznamu všech příkazů dostupných pro make.

Docker Compose: zjednodušení práce s využitím Makefile
Nápověda k dostupným příkazům

  • make build — vytvoření obrazu ze Dockerfile. V našem příkladu jsme použili existující obrazy timescale a ping. Ale obraz api který chceme sestavit lokálně. Toho dosáhneme po provedení tohoto příkazu.

Docker Compose: zjednodušení práce s využitím Makefile
Sestavení kontejneru Docker

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

Docker Compose: zjednodušení práce s využitím Makefile
Spuštění kontejneru timescale

Docker Compose: zjednodušení práce s využitím Makefile
Spuštění kontejneru ping

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

Docker Compose: zjednodušení práce s využitím Makefile
Spuštění bash v kontejneru timescale

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

Docker Compose: zjednodušení práce s využitím Makefile
Spuštění psql v kontejneru timescaledb

  • make stop — zastavení kontejnerů.

Docker Compose: zjednodušení práce s využitím Makefile
Zastavení kontejneru timescale

  • make down — zastavení a odstranění kontejnerů. Pro odstranění konkrétního kontejneru lze použít tento příkaz se specifikací požadovaného kontejneru. Například — make down c=timescale nebo make down c=api.

Docker Compose: zjednodušení práce s využitím Makefile
Zastavení a odstranění všech kontejnerů

Závěry

I když systém Docker Compose poskytuje rozsáhlou sadu příkazů určených pro správu kontejnerů, někdy se tyto příkazy stávají dlouhými, což ztěžuje jejich zapamatování.

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

  • Vývojář interaguje pouze s kontejnery projektu popsanými v docker-compose.yml, práce nejsou rušena dalšími spuštěnými kontejnery.
  • V případě, že je nějaký příkaz zapomenut, lze vykonat příkaz make help a získat pomoc s dostupnými příkazy.
  • Není třeba si zapamatovat dlouhé seznamy argumentů pro provádění takových akcí, jako je získání čerstvých záznamů protokolu nebo přihlášení do systému. Například příkaz typu docker-compose -f docker-compose.yml exec timescale psql -Upostgres se mění na make db-shell.
  • Soubor Makefile se dá při růstu projektu flexibilně přizpůsobovat. Například je snadné přidat příkaz pro vytvoření zálohy databáze nebo pro provedení jakéhokoli jiného kroku.
  • 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 marketplace existuje obraz Docker, který se instaluje jedním kliknutím. Můžete zkontrolovat funkčnost kontejnerů na VPS. Všem novým klientům se poskytují 3 dny testování zdarma.

Vážení čtenáři! Jak automatizujete práci s Docker Compose?

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

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster