Docker Compose: Simplifique usando Makefile

Cada pocos años, se produce un cambio de paradigma en la industria del desarrollo de software. Uno de estos fenómenos es el creciente interés en el concepto de microservicios. Aunque los microservicios no son la última tecnología, recientemente su popularidad se disparó literalmente.

Los grandes servicios monolíticos en estos días son reemplazados por microservicios autónomos independientes. Un microservicio puede considerarse como una aplicación que tiene un propósito único y muy específico. Por ejemplo, puede ser un DBMS relacional, aplicación Express, servicio Solr. Hoy en día es difícil imaginar el desarrollo de un nuevo sistema de software sin el uso de microservicios. Y esta situación, a su vez, nos lleva a la plataforma Docker.





Estibador


La plataforma Docker , en el desarrollo y despliegue de microservicios, se ha convertido en un estándar casi 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 fácilmente cualquier aplicación, así como distribuirla y ejecutarla en cualquier entorno, desde nubes híbridas hasta sistemas fronterizos.

Docker componer


La tecnología Docker Compose está diseñada para configurar aplicaciones de contenedores múltiples. Un proyecto Docker Compose puede incluir tantos contenedores Docker como necesite el creador de este proyecto.

Cuando se trabaja con Docker Compose, se utiliza un archivo YAML para configurar los servicios de la aplicación y organizar su interacción entre ellos. Docker Compose es, por lo tanto, una herramienta para describir y ejecutar aplicaciones de múltiples contenedores Docker.


Dos contenedores que se ejecutan en el sistema host.

GNU Make


Un programa makees esencialmente una herramienta para automatizar el ensamblaje de programas y bibliotecas a partir del código fuente. En general, podemos decir que es makeaplicable a cualquier proceso que incluya la ejecución de comandos arbitrarios para convertir ciertos materiales de origen a una determinada forma resultante, a un objetivo determinado. En nuestro caso, los equipos docker-composese convertirán en objetivos abstractos ( objetivos falsos ).

Para decirle al programa makelo que queremos de él, necesitamos un archivo Makefile.

El nuestro Makefilecontendrá los comandos habituales dockerydocker-composeque están diseñados para resolver muchos problemas. Es decir, estamos hablando de ensamblar el contenedor, de iniciarlo, detenerlo, reiniciarlo, de organizar el inicio de sesión del usuario en el contenedor, de trabajar con registros de contenedor y de resolver otros problemas similares.

Usos típicos para Docker Compose


Imagine una aplicación web normal que tenga los siguientes componentes:

  • Base de datos TimescaleDB (Postgres).
  • Aplicación Express.js.
  • Ping (solo un contenedor que no hace nada especial).

Esta aplicación necesitará 3 contenedores Docker y un archivo que docker-composecontiene instrucciones para administrar estos contenedores. Cada uno de los contenedores tendrá diferentes puntos de interacción. Por ejemplo, timescalepuede trabajar con un contenedor de la misma manera que trabaja con bases de datos. A saber, le permite realizar las siguientes acciones:

  • Inicie sesión en el shell de Postgres.
  • Importar y exportar tablas.
  • Crea una pg_dumptabla o base de datos.

El contenedor de una aplicación Express.js, expressjspuede tener las siguientes características:

  • La salida de datos nuevos del registro del sistema.
  • Ingrese el shell para ejecutar ciertos comandos.

Interacción de contenedores


Después de configurar la conexión entre contenedores utilizando Docker Compose, es hora de establecer una interacción con estos contenedores. Como parte del sistema Docker Compose, hay un comando docker-composeque admite una opción -fque 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.

Eche un vistazo a cómo se ven las interacciones del contenedor al usar comandos docker-compose. Si imaginamos que necesitamos ingresar al shell psql, entonces los comandos correspondientes pueden verse así:

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

El mismo comando para el cual no docker-compose, pero se usa docker, puede verse así:

docker exec -it  edp_timescale_1 psql -Upostgres

Tenga en cuenta que en tales casos siempre es preferible utilizar no un comando docker, sino un comando docker-compose, ya que esto elimina la necesidad de recordar los nombres de los contenedores.

Los dos comandos anteriores no son tan complicados. Pero si usáramos un "contenedor" en una forma Makefileque nos diera una interfaz en forma de comandos simples y llamaramos comandos tan largos a nosotros mismos, entonces se podrían lograr los mismos resultados de esta manera:

make db-shell

¡Es obvio que el uso Makefilesimplifica enormemente el trabajo con contenedores!

Ejemplo de trabajo


Según el diagrama del proyecto anterior, cree 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 administrar la configuración de Docker Compose e interactuar con los contenedores que describe, cree 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 el uso de la opción le c=permite limitar el alcance del comando a un contenedor.

Una vez Makefilelisto, puedes usarlo así:

  • make help- emitiendo una lista de todos los comandos disponibles para make.


Comandos disponibles Ayuda

  • make build- montaje de la imagen de Dockerfile. En nuestro ejemplo, utilizamos imágenes existentes timescaley ping. Pero apiqueremos recopilar la imagen localmente. Esto es exactamente lo que se hará después de ejecutar este comando.


Ensamblaje de contenedor Docker

  • make start- lanzamiento de todos los contenedores. Para iniciar solo un contenedor, puede usar el comando del formulario make start c=timescale.


Lanzar contenedor de escala de tiempo


Lanzar contenedor de ping

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


Ejecutar bash en contenedor de escala de tiempo

  • make db-shell- Inicie sesión en psqlel contenedor timescalepara ejecutar consultas SQL en la base de datos.


Ejecutar psql en el contenedor timescaledb

  • make stop - parada de contenedores.


Detener el contenedor de escala de tiempo

  • make down- Pare y retire los contenedores. Para eliminar un contenedor específico, puede usar este comando con el contenedor especificado. Por ejemplo, make down c=timescaleo make down c=api.


Detener y eliminar todos los contenedores.

Resumen


A pesar de que el sistema Docker Compose nos proporciona un amplio conjunto de comandos diseñados para administrar contenedores, a veces estos comandos se vuelven largos y, como resultado, pueden ser difíciles de recordar.

La metodología de uso Makefilenos ayudó a establecer una interacción rápida y fácil con los contenedores del archivo docker-compose.yml. A saber, estamos hablando de lo siguiente:

  • , docker-compose.yml, .
  • , , make help .
  • , . , docker-compose -f docker-compose.yml exec timescale psql -Upostgres make db-shell.
  • Makefile , , . , .
  • Makefile, .

PD: en nuestro mercado hay una imagen de Docker , que se instala con un solo clic. Puede verificar el funcionamiento de los contenedores en VPS . Todos los nuevos clientes tienen 3 días gratuitos para realizar las pruebas.

¡Queridos lectores! ¿Cómo automatizas el trabajo con Docker Compose?

Source: https://habr.com/ru/post/undefined/


All Articles