Docker Compose: simplificando su trabajo usando Makefiles

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.

Docker Compose: simplificando su trabajo usando Makefiles

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, en el desarrollo e implementación de microservicios, se ha convertido casi en un estándar de la industria. En el sitio web del proyecto puede descubrir que Docker es la única plataforma de contenedorización independiente que permite a las organizaciones crear sin esfuerzo cualquier aplicación, así como distribuirla y ejecutarla en cualquier entorno, desde nubes híbridas hasta sistemas de borde.

Docker Compose

Tecnología Docker Compose Diseñado para configurar aplicaciones de múltiples contenedores. Un proyecto Docker Compose puede contener tantos contenedores Docker como necesite el creador del proyecto.

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.

Docker Compose: simplificando su trabajo usando Makefiles
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 (Objetivos telefónicos).

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-composeY 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 dockery 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 para make.

Docker Compose: simplificando su trabajo usando Makefiles
Ayuda sobre comandos disponibles

  • make build - ensamblar una imagen de Dockerfile. En nuestro ejemplo utilizamos imágenes existentes. timescale и ping. Pero la imagen api queremos recolectar localmente. Esto es exactamente lo que se hará después de ejecutar este comando.

Docker Compose: simplificando su trabajo usando Makefiles
Construyendo un contenedor Docker

  • make start — lanzamiento de todos los contenedores. Para iniciar solo un contenedor, puede usar un comando como make start c=timescale.

Docker Compose: simplificando su trabajo usando Makefiles
Ejecutando el contenedor de escala de tiempo

Docker Compose: simplificando su trabajo usando Makefiles
Ejecutando un contenedor de ping

  • make login-timescale — inicie sesión en la sesión bash del contenedor timescale.

Docker Compose: simplificando su trabajo usando Makefiles
Ejecutando bash en un contenedor de escala de tiempo

  • make db-shell - entrada a psql en un contenedor timescale para ejecutar consultas SQL contra la base de datos.

Docker Compose: simplificando su trabajo usando Makefiles
Ejecutando psql en un contenedor timescaledb

  • make stop — detener los contenedores.

Docker Compose: simplificando su trabajo usando Makefiles
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 o make down c=api.

Docker Compose: simplificando su trabajo usando Makefiles
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 en make 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 mercado hay una imagen Docker, que se instala con un solo clic. Puedes comprobar el funcionamiento de los contenedores. VPS. Todos los nuevos clientes reciben 3 días de prueba de forma gratuita.

Estimados lectores! ¿Cómo se automatiza Docker Compose?

Docker Compose: simplificando su trabajo usando Makefiles

Fuente: habr.com

Añadir un comentario