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.
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
Docker Compose
Технология
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.
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 (
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-compose
I 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 permake
.
Ajuda sobre les ordres disponibles
make build
- Muntatge d'una imatge a partir deDockerfile
. En el nostre exemple hem utilitzat imatges existentstimescale
иping
. Però la imatgeapi
volem recollir localment. Això és exactament el que es farà després d'executar aquesta ordre.
Construcció d'un contenidor Docker
make start
— llançament de tots els contenidors. Per llançar només un contenidor, podeu utilitzar una ordre commake start c=timescale
.
Execució del contenidor d'escala de temps
Execució d'un contenidor de ping
make login-timescale
— inicieu sessió a la sessió bash del contenidortimescale
.
Execució de bash en un contenidor d'escala de temps
make db-shell
- entrada apsql
en un recipienttimescale
per executar consultes SQL a la base de dades.
S'està executant psql en un contenidor a escala temporal
make stop
- aturar contenidors.
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
omake down c=api
.
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 enmake 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
Benvolguts lectors! Com automatitzeu Docker Compose?
Font: www.habr.com