Cada pocos años, la industria del desarrollo de software sufre un cambio de paradigma. Uno de estos fenómenos puede reconocerse como el creciente interés por el concepto de microservicios. Aunque los microservicios no son la tecnología más nueva, sólo recientemente su popularidad se ha disparado literalmente.
Los grandes servicios monolíticos están siendo reemplazados por microservicios autónomos e independientes. Se puede considerar un microservicio como una aplicación que tiene un propósito único y muy específico. Por ejemplo, podría ser un DBMS relacional, una aplicación Express, un servicio Solr.
Hoy en día, es difícil imaginar el desarrollo de un nuevo sistema de software sin utilizar microservicios. Y esta situación, a su vez, nos lleva a la plataforma Docker.
Docker
plataforma
Docker Compose
Tecnología
Cuando se trabaja con Docker Compose, se utiliza un archivo YAML para configurar los servicios de las aplicaciones y organizar su interacción entre sí. Por lo tanto, Docker Compose es una herramienta para describir y ejecutar aplicaciones Docker de múltiples contenedores.
Dos contenedores ejecutándose en un sistema host
Marca GNU
programa make
, es esencialmente una herramienta para automatizar la creación de programas y bibliotecas a partir del código fuente. En general podemos decir que make
Se aplica a cualquier proceso que implique la ejecución de comandos arbitrarios para transformar algunos materiales de entrada en alguna forma de salida, con algún objetivo. En nuestro caso, los comandos docker-compose
se transformarán en metas abstractas (
Para decirle al programa make
sobre lo que queremos de él, necesitamos un archivo Makefile
.
En nuestro Makefile
contendrá comandos regulares docker
и docker-compose
, que están diseñados para resolver muchos problemas. Es decir, estamos hablando de ensamblar un contenedor, de iniciarlo, detenerlo, reiniciarlo, de organizar el inicio de sesión del usuario en el contenedor, de trabajar con los registros del contenedor y de resolver otros problemas similares.
Casos de uso típicos de Docker Compose
Imaginemos una aplicación web normal que tiene los siguientes componentes:
- Base de datos TimescaleDB (Postgres).
- Aplicación Express.js.
- Ping (solo un contenedor, no hace nada especial).
Esta aplicación necesitará 3 contenedores Docker y un archivo. docker-compose
, que contiene instrucciones para gestionar estos contenedores. Cada contenedor tendrá diferentes puntos de contacto. Por ejemplo, con un contenedor timescale
Será posible trabajar aproximadamente de la misma manera que trabajan con bases de datos. Es decir, le permite realizar las siguientes acciones:
- Iniciando sesión en el shell de Postgres.
- Importación y exportación de tablas.
- creación
pg_dump
tablas o bases de datos.
Contenedor de aplicaciones Express.js, expressjs
, puede tener las siguientes capacidades:
- Proporcionar datos nuevos del registro del sistema.
- Inicie sesión en el shell para ejecutar ciertos comandos.
Interactuar con contenedores
Una vez que hayamos configurado la comunicación entre contenedores usando Docker Compose, es hora de comunicarnos con esos contenedores. Dentro del sistema Docker Compose hay un comando docker-compose
, opción de soporte -f
, que le permite transferir un archivo al sistema docker-compose.yml
.
Usando las capacidades de esta opción, puede limitar la interacción con el sistema solo a aquellos contenedores que se mencionan en el archivo. docker-compose.yml
.
Echemos un vistazo a cómo se ven las interacciones con contenedores cuando se usan comandos. docker-compose
. Si imaginamos que necesitamos iniciar sesión en el shell psql
, entonces los comandos correspondientes podrían verse así:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
El mismo comando que no se utiliza para ejecutar. docker-compose
Y docker
, podría verse así:
docker exec -it edp_timescale_1 psql -Upostgres
Tenga en cuenta que en tales casos siempre es preferible utilizar el comando docker
y el comando docker-compose
, ya que esto elimina la necesidad de recordar los nombres de los contenedores.
Los dos comandos anteriores no son tan difíciles. Pero si usáramos un "envoltorio" en la forma Makefile
, que nos daría una interfaz en forma de comandos simples y llamaría a su vez comandos largos similares, entonces se podrían lograr los mismos resultados de esta manera:
make db-shell
Es bastante obvio que el uso Makefile
¡Hace que trabajar con contenedores sea mucho más fácil!
Ejemplo de trabajo
Según el diagrama del proyecto anterior, crearemos el siguiente archivo 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
Para gestionar la configuración de Docker Compose e interactuar con los contenedores que describe, crearemos el siguiente archivo 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 mayoría de los comandos descritos aquí se aplican a todos los contenedores, pero usando la opción c=
le permite limitar el alcance de un comando a un contenedor.
Después Makefile
Listo, puedes usarlo así:
make help
— emitir una lista de todos los comandos disponibles paramake
.
Ayuda sobre comandos disponibles
make build
- ensamblar una imagen deDockerfile
. En nuestro ejemplo utilizamos imágenes existentes.timescale
иping
. Pero la imagenapi
queremos recolectar localmente. Esto es exactamente lo que se hará después de ejecutar este comando.
Construyendo un contenedor Docker
make start
— lanzamiento de todos los contenedores. Para iniciar solo un contenedor, puede usar un comando comomake start c=timescale
.
Ejecutando el contenedor de escala de tiempo
Ejecutando un contenedor de ping
make login-timescale
— inicie sesión en la sesión bash del contenedortimescale
.
Ejecutando bash en un contenedor de escala de tiempo
make db-shell
- entrada apsql
en un contenedortimescale
para ejecutar consultas SQL contra la base de datos.
Ejecutando psql en un contenedor timescaledb
make stop
— detener los contenedores.
Detener un contenedor de escala de tiempo
make down
— detener y retirar contenedores. Para eliminar un contenedor específico, puede usar este comando especificando el contenedor deseado. Por ejemplo -make down c=timescale
omake down c=api
.
Detener y eliminar todos los contenedores
resultados
Aunque Docker Compose nos brinda un amplio conjunto de comandos para administrar contenedores, a veces estos comandos pueden volverse largos y difíciles de recordar.
Metodo de uso Makefile
nos ayudó a establecer una interacción rápida y sencilla con contenedores desde un archivo docker-compose.yml
. Es decir, estamos hablando de lo siguiente:
- El desarrollador interactúa sólo con los contenedores del proyecto descritos en
docker-compose.yml
, el trabajo no se ve interferido por otros contenedores en funcionamiento. - En caso de que se olvide un determinado comando, puede ejecutar el comando
make help
y obtenga ayuda sobre los comandos disponibles. - No es necesario recordar largas listas de argumentos para realizar acciones como obtener las últimas entradas del registro o iniciar sesión en un sistema. Por ejemplo, un comando como
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
se convierte enmake db-shell
. - Expediente
Makefile
Puede adaptarse con flexibilidad a medida que el proyecto crece. Por ejemplo, es fácil agregar un comando para crear una copia de seguridad de la base de datos o realizar cualquier otra acción. - Si un gran equipo de desarrolladores usa el mismo
Makefile
, esto agiliza la colaboración y reduce los errores.
PS En nuestro
Estimados lectores! ¿Cómo se automatiza Docker Compose?
Fuente: habr.com