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.
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 , 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 À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.

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 ().
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_dumptabeller 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örmake.

HjÀlp om tillgÀngliga kommandon
make buildâ bygga en bild frĂ„nDockerfileI vĂ„rt exempel har vi anvĂ€nt befintliga bildertimescaleochpingMen bildenapisom vi vill samla lokalt. Det Ă€r just detta som kommer att göras efter att kommandot har körts.

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 sommake start c=timescale.

Startar timescale-behÄllaren

Startar ping-behÄllaren
make login-timescaleâ loggar in i bash-sessionen för behĂ„llarentimescale.

Starta bash i timescale-behÄllaren
make db-shellâ loggar in ipsqli en containertimescaleför att köra SQL-frĂ„gor mot databasen.

Startar psql i timescaledb-behÄllaren
make stopâ stoppar behĂ„llarna.
![]()
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=timescaleellermake down c=api.

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 helpoch 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 -Upostgresblirmake db-shell. - Fil
Makefilekan, 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 finns en bild , som installeras med ett klick. Du kan kontrollera hur containrarna fungerar pÄ . Alla nya kunder fÄr 3 dagar gratis för testning.
KÀra lÀsare! Hur automatiserar du arbetet med Docker Compose?
KĂ€lla: habr.com
