Docker Compose: förenkla arbetet med att anvÀnda Makefile

Varje par Ă„r sker det en förĂ€ndring av paradigmer inom programvaruutvecklingsindustrin. En av dessa fenomen kan betraktas som det vĂ€xande intresset för konceptet mikrotjĂ€nster. Även om mikrotjĂ€nster inte Ă€r en helt ny teknologi har dess popularitet pĂ„ senare tid verkligen skjutit i höjden.

Stora monolitiska tjÀnster ersÀtts nu för tiden av oberoende, autonomiska mikrotjÀnster. En mikrotjÀnst kan ses som en applikation som har ett mycket specifikt syfte. Till exempel kan det vara en relationsdatabas, en Express-applikation eller en Solr-tjÀnst.

Docker Compose: förenkla arbetet med att anvÀnda Makefile

Idag Àr det svÄrt att förestÀlla sig utvecklingen av ett nytt programvarusystem utan att anvÀnda mikrotjÀnster. Denna situation leder oss till plattformen Docker.

Docker

Plattform Docker, i utveckling och distribution av mikrotjĂ€nster, har blivit praktiskt taget en branschstandard. PĂ„ projektets webbplats kan man lĂ€sa att Docker Ă€r den enda oberoende containerplattformen som gör det möjligt för organisationer att skapa, distribuera och köra applikationer i olika miljöer — frĂ„n hybridmoln till edge-system, utan större anstrĂ€ngning.

Docker Compose

Tekniken Docker Compose Àr avsedd för konfiguration av flercontainerapplikationer. I ett Docker Compose-projekt kan det ingÄ sÄ mÄnga Docker-containrar som skaparen av projektet behöver.

Vid arbete med Docker Compose anvÀnds en YAML-fil för att konfigurera apptjÀnster och organisera deras interaktion med varandra. Docker Compose Àr sÄledes ett verktyg för att beskriva och köra flercontainerapplikationer i Docker.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
TvÄ containrar som arbetar pÄ vÀrdsystemet

GNU Make

Programmet make, Àr i grunden ett verktyg för att automatisera byggandet av program och bibliotek frÄn kÀllkod. Generellt kan man sÀga att make Àr tillÀmpligt pÄ alla processer som involverar utförande av godtyckliga kommandon för att omvandla vissa ingÄngsmaterial till ett visst resulterande tillstÄnd, till ett visst mÄl. I vÄrt fall kommer kommandona docker-compose att omvandlas till abstrakta mÄl (Phony targets).

För att informera programmet make om vad vi vill ha frÄn det, behöver vi en fil Makefile.

I vÄr Makefile som kommer att innehÄlla vanliga kommandon docker och docker-compose, som Àr avsedda för att lösa mÄnga uppgifter. Det handlar om att bygga containrar, om att starta, stoppa och Äterstarta dem, om att organisera anvÀndarinloggning i containrar, om att arbeta med loggar av containrar samt om att lösa andra liknande uppgifter.

Typiska anvÀndningsomrÄden för Docker Compose

LÄt oss förestÀlla oss en vanlig webbapplikation som har följande komponenter:

  • TimescaleDB-databasen (Postgres).
  • Ett Express.js-program.
  • Ping (en enkel container som inte gör nĂ„got sĂ€rskilt).

Denna applikation kommer att behöva 3 Docker-containrar och en fil docker-compose, som innehÄller instruktioner för hantering av dessa containrar. Varje container kommer att ha olika interaktionspunkter. Till exempel kan man arbeta med containern timescale pÄ ett liknande sÀtt som man arbetar med databaser. Det vill sÀga, den tillÄter följande ÄtgÀrder:

  • Inloggning i Postgres-skalet.
  • Import och export av tabeller.
  • Skapande pg_dump tabeller eller databaser.

Containern för Express.js-programmet, expressjs, kan ha följande möjligheter:

  • Leverera fĂ€rska data frĂ„n systemloggen.
  • Inloggning i skalet för att köra vissa kommandon.

Interaktion med containrar

NÀr vi har konfigurerat kopplingen mellan containrarna med hjÀlp av Docker Compose, Àr det dags att etablera interaktionen med dessa containrar. Inom Docker Compose-systemet finns det en kommando docker-compose, som stöder alternativet -f, vilket gör att man kan överföra en fil till systemet. docker-compose.yml.

Genom att anvÀnda detta alternativ kan man begrÀnsa interaktionen med systemet till endast de containrar som nÀmns i filen. docker-compose.yml.

LÄt oss titta pÄ hur interaktionerna med containrarna ser ut nÀr vi anvÀnder kommandon docker-compose. Om vi förestÀller oss att vi behöver logga in i skalet psql, kan de relevanta kommandona se ut sÄ hÀr:

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

Samma kommando, för vilket man inte anvÀnder docker-compose, och docker, kan se ut sÄ hÀr:

docker exec -it edp_timescale_1 psql -Upostgres

Observera att det alltid Àr att föredra att anvÀnda kommandot docker, och inte kommandot docker-compose, eftersom detta gör att man slipper komma ihÄg containerns namn.

BÄda ovanstÄende kommandon Àr inte sÄ svÄra. Men om vi anvÀnde en "inpackning" i form av Makefile, som skulle ge oss ett grÀnssnitt i form av enkla kommandon och sjÀlv skulle anropa sÄdana lÄnga kommandon, kan vi uppnÄ samma resultat sÄ hÀr:

make db-shell

Det Àr helt uppenbart att anvÀndningen av Makefile avsevÀrt förenklar arbetet med containrar!

Praktiskt exempel

Baserat pÄ den ovan diskuterade projektschemat kommer vi att skapa följande fil 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

För att hantera Docker Compose-konfigurationen och interagera med de containrar den beskriver, ska vi skapa följande fil 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

De flesta av de kommandon som beskrivs hÀr tillÀmpas pÄ alla containrar, men anvÀndningen av alternativet c= tillÄter att begrÀnsa kommandots rÀckvidd till en enskild container.

Efter att Makefile klar, du kan anvÀnda den sÄ hÀr:

  • make help — ger en lista över alla kommandon som Ă€r tillgĂ€ngliga för make.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
HjÀlp om tillgÀngliga kommandon

  • make build — bygga en bild frĂ„n DockerfileI vĂ„rt exempel har vi anvĂ€nt befintliga bilder timescale och pingMen bilden api som vi vill samla lokalt. Det Ă€r just detta som kommer att göras efter att kommandot har körts.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
Byggnation av en Docker-behÄllare

  • make start — startar alla behĂ„llare. För att starta bara en behĂ„llare kan man anvĂ€nda ett kommando som make start c=timescale.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
Startar timescale-behÄllaren

Docker Compose: förenkla arbetet med att anvÀnda Makefile
Startar ping-behÄllaren

  • make login-timescale — loggar in i bash-sessionen för behĂ„llaren timescale.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
Starta bash i timescale-behÄllaren

  • make db-shell — loggar in i psql i en container timescale för att köra SQL-frĂ„gor mot databasen.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
Startar psql i timescaledb-behÄllaren

  • make stop — stoppar behĂ„llarna.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
Stoppar timescale-behÄllaren

  • make down — stoppar och tar bort behĂ„llarna. För att ta bort en specifik behĂ„llare kan man anvĂ€nda detta kommando med den specifika behĂ„llaren angiven. Till exempel — make down c=timescale eller make down c=api.

Docker Compose: förenkla arbetet med att anvÀnda Makefile
Stoppar och tar bort alla behÄllare

Sammanfattning

Trots att Docker Compose ger oss en omfattande uppsÀttning kommandon för att hantera behÄllare, kan dessa kommandon ibland bli lÄnga och svÄra att komma ihÄg.

AnvÀndningsmetodiken Makefile har hjÀlpt oss att hantera snabb och enkel interaktion med behÄllarna frÄn filen docker-compose.yml. Det handlar om följande:

  • Utvecklaren interagerar endast med projektets behĂ„llare som beskrivs i docker-compose.yml, andra körda behĂ„llare stör inte arbetet.
  • Om nĂ„got kommando har glömts kan man köra kommandot make help och fĂ„ hjĂ€lp med tillgĂ€ngliga kommandon.
  • Det Ă€r inte nödvĂ€ndigt att komma ihĂ„g lĂ„nga listor med argument för att utföra Ă„tgĂ€rder som att hĂ€mta fĂ€rska loggar eller logga in. Till exempel, ett kommando som docker-compose -f docker-compose.yml exec timescale psql -Upostgres blir make db-shell.
  • Fil Makefile kan, nĂ€r projektet vĂ€xer, anpassas flexibelt efter det. Till exempel Ă€r det inte svĂ„rt att lĂ€gga till ett kommando för att skapa en databasbackup eller utföra nĂ„gon annan Ă„tgĂ€rd.
  • Om ett stort team av utvecklare anvĂ€nder samma Makefile, organiserar det det gemensamma arbetet och minskar antalet fel.

P.S. I vÄr marknadsplats finns en bild Docker, som installeras med ett klick. Du kan kontrollera hur containrarna fungerar pÄ VPS. Alla nya kunder fÄr 3 dagar gratis för testning.

KÀra lÀsare! Hur automatiserar du arbetet med Docker Compose?

Docker Compose: förenkla arbetet med att anvÀnda Makefile

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster