Docker Compose: simplificant el vostre treball amb Makefiles

Cada pocs anys, la indústria del desenvolupament de programari experimenta un canvi de paradigma. Un d'aquests fenòmens es pot reconèixer com l'interès creixent pel concepte de microserveis. Tot i que els microserveis no són la tecnologia més nova, només fa poc que la seva popularitat s'ha disparat literalment.

Els grans serveis monolítics estan sent substituïts per microserveis independents i autònoms. Un microservei es pot pensar com una aplicació que serveix per a un propòsit únic i molt específic. Per exemple, podria ser un SGBD relacional, una aplicació Express, un servei Solr.

Docker Compose: simplificant el vostre treball amb Makefiles

En aquests dies, és difícil imaginar-se desenvolupar un nou sistema de programari sense utilitzar microserveis. I aquesta situació, al seu torn, ens porta a la plataforma Docker.

estibador

Plataforma estibador, en el desenvolupament i desplegament de microserveis, s'ha convertit gairebé en un estàndard del sector. Al lloc web del projecte podeu esbrinar que Docker és l'única plataforma de contenidors independent que permet a les organitzacions crear sense esforç qualsevol aplicació, així com distribuir-les i executar-les en qualsevol entorn, des de núvols híbrids fins a sistemes perifèrics.

Docker Compose

Технология Docker Compose dissenyat per configurar aplicacions multicontenidor. Un projecte Docker Compose pot contenir tants contenidors Docker com necessiti el creador del projecte.

Quan es treballa amb Docker Compose, s'utilitza un fitxer YAML per configurar els serveis d'aplicacions i organitzar la seva interacció entre ells. Docker Compose és, per tant, una eina per descriure i executar aplicacions Docker de diversos contenidors.

Docker Compose: simplificant el vostre treball amb Makefiles
Dos contenidors que s'executen en un sistema host

GNU Make

Programa make, és essencialment una eina per automatitzar la creació de programes i biblioteques a partir del codi font. En general, ho podem dir make s'aplica a qualsevol procés que impliqui l'execució d'ordres arbitràries per transformar alguns materials d'entrada a una forma de sortida, a algun objectiu. En el nostre cas, les ordres docker-compose es transformaran en objectius abstractes (Objectius telefònics).

Per dir el programa make sobre el que volem d'ell, necessitem un fitxer Makefile.

En la nostra Makefile contindrà ordres habituals docker и docker-compose, que estan dissenyats per resoldre molts problemes. És a dir, estem parlant de muntar un contenidor, d'iniciar-lo, aturar-lo, reiniciar-lo, d'organitzar l'inici de sessió dels usuaris al contenidor, de treballar amb registres de contenidors i de resoldre altres problemes similars.

Casos d'ús típics de Docker Compose

Imaginem una aplicació web normal que tingui els components següents:

  • Base de dades TimescaleDB (Postgres).
  • Aplicació Express.js.
  • Ping (només un contenidor, no fa res especial).

Aquesta aplicació necessitarà 3 contenidors Docker i un fitxer docker-compose, que conté instruccions per gestionar aquests contenidors. Cada contenidor tindrà diferents punts de contacte. Per exemple, amb un contenidor timescale serà possible treballar aproximadament de la mateixa manera que funcionen amb bases de dades. És a dir, us permet realitzar les accions següents:

  • Inici de sessió al shell de Postgres.
  • Importació i exportació de taules.
  • creació pg_dump taules o bases de dades.

contenidor d'aplicacions Express.js, expressjs, pot tenir les capacitats següents:

  • Proporcionar dades noves del registre del sistema.
  • Inicieu sessió al shell per executar determinades ordres.

Interacció amb els contenidors

Un cop hàgim configurat la comunicació entre contenidors mitjançant Docker Compose, és hora de comunicar-nos amb aquests contenidors. Dins del sistema Docker Compose hi ha una ordre docker-compose, opció de suport -f, que permet transferir un fitxer al sistema docker-compose.yml.

Utilitzant les capacitats d'aquesta opció, podeu limitar la interacció amb el sistema només als contenidors que s'esmenten al fitxer docker-compose.yml.

Fem una ullada a com són les interaccions amb els contenidors quan s'utilitzen ordres docker-compose. Si ens imaginem que necessitem iniciar sessió al shell psql, aleshores les ordres corresponents podrien semblar així:

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

La mateixa ordre que no s'utilitza per executar docker-composeI docker, podria semblar així:

docker exec -it  edp_timescale_1 psql -Upostgres

Tingueu en compte que en aquests casos sempre és preferible utilitzar l'ordre docker, i l'ordre docker-compose, ja que això elimina la necessitat de recordar els noms dels contenidors.

Les dues ordres anteriors no són tan difícils. Però si utilitzem un "embolcall" en el formulari Makefile, que ens donaria una interfície en forma d'ordres simples i anomenaria comandes llargues similars, llavors es podrien aconseguir els mateixos resultats com aquest:

make db-shell

És força evident que l'ús Makefile fa molt més fàcil treballar amb contenidors!

Exemple de treball

A partir del diagrama del projecte anterior, crearem el següent fitxer 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

Per gestionar la configuració de Docker Compose i interactuar amb els contenidors que descriu, crearem el següent fitxer 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

La majoria de les ordres descrites aquí s'apliquen a tots els contenidors, però utilitzant l'opció c= permet limitar l'abast d'una ordre a un contenidor.

Després Makefile llest, podeu utilitzar-lo així:

  • make help — emetre una llista de totes les ordres disponibles per make.

Docker Compose: simplificant el vostre treball amb Makefiles
Ajuda sobre les ordres disponibles

  • make build - Muntatge d'una imatge a partir de Dockerfile. En el nostre exemple hem utilitzat imatges existents timescale и ping. Però la imatge api volem recollir localment. Això és exactament el que es farà després d'executar aquesta ordre.

Docker Compose: simplificant el vostre treball amb Makefiles
Construcció d'un contenidor Docker

  • make start — llançament de tots els contenidors. Per llançar només un contenidor, podeu utilitzar una ordre com make start c=timescale.

Docker Compose: simplificant el vostre treball amb Makefiles
Execució del contenidor d'escala de temps

Docker Compose: simplificant el vostre treball amb Makefiles
Execució d'un contenidor de ping

  • make login-timescale — inicieu sessió a la sessió bash del contenidor timescale.

Docker Compose: simplificant el vostre treball amb Makefiles
Execució de bash en un contenidor d'escala de temps

  • make db-shell - entrada a psql en un recipient timescale per executar consultes SQL a la base de dades.

Docker Compose: simplificant el vostre treball amb Makefiles
S'està executant psql en un contenidor a escala temporal

  • make stop - aturar contenidors.

Docker Compose: simplificant el vostre treball amb Makefiles
Aturar un contenidor a escala temporal

  • make down — aturar i retirar contenidors. Per eliminar un contenidor específic, podeu utilitzar aquesta ordre especificant el contenidor desitjat. Per exemple - make down c=timescale o make down c=api.

Docker Compose: simplificant el vostre treball amb Makefiles
Aturar i eliminar tots els contenidors

Resultats de

Tot i que Docker Compose ens ofereix un conjunt ric d'ordres per gestionar contenidors, de vegades aquestes ordres poden arribar a ser llargues i difícils de recordar.

Mètode d'ús Makefile ens va ajudar a establir una interacció ràpida i senzilla amb els contenidors d'un fitxer docker-compose.yml. És a dir, estem parlant del següent:

  • El desenvolupador només interactua amb els contenidors del projecte descrits a docker-compose.yml, el treball no es veu interferit per altres contenidors en funcionament.
  • En cas que s'oblidi una determinada ordre, podeu executar-la make help i obtenir ajuda sobre les ordres disponibles.
  • No cal que recordeu llargues llistes d'arguments per dur a terme accions com ara obtenir les últimes entrades de registre o iniciar sessió en un sistema. Per exemple, una ordre com docker-compose -f docker-compose.yml exec timescale psql -Upostgres es converteix en make db-shell.
  • expedient Makefile Podeu adaptar-vos-hi de manera flexible a mesura que el projecte creixi. Per exemple, és fàcil afegir una ordre per crear una còpia de seguretat de la base de dades o realitzar qualsevol altra acció.
  • Si un gran equip de desenvolupadors utilitza el mateix Makefile, això agilitza la col·laboració i redueix els errors.

PS En la nostra mercat hi ha una imatge estibador, que s'instal·la amb un sol clic. Podeu comprovar el funcionament dels contenidors VPS. Tots els clients nous reben 3 dies de proves de manera gratuïta.

Benvolguts lectors! Com automatitzeu Docker Compose?

Docker Compose: simplificant el vostre treball amb Makefiles

Font: www.habr.com

Afegeix comentari