Docker Compose: Simplifique usando Makefile

A cada poucos anos, uma mudança de paradigma ocorre na indĂșstria de desenvolvimento de software. Um desses fenĂŽmenos Ă© o crescente interesse no conceito de microsserviços. Embora os microsserviços nĂŁo sejam a tecnologia mais recente, apenas recentemente sua popularidade disparou literalmente.

Atualmente, grandes serviços monolĂ­ticos sĂŁo substituĂ­dos por microsserviços autĂŽnomos independentes. Um microsserviço pode ser considerado como um aplicativo que serve a um propĂłsito Ășnico e muito especĂ­fico. Por exemplo, pode ser um DBMS relacional, aplicativo Express, serviço Solr. Hoje em dia Ă© difĂ­cil imaginar o desenvolvimento de um novo sistema de software sem o uso de microsserviços. E essa situação, por sua vez, nos leva Ă  plataforma Docker.





Docker


A plataforma Docker , no desenvolvimento e implantação de microsserviços, tornou-se quase um padrĂŁo do setor. No site do projeto, vocĂȘ pode descobrir que o Docker Ă© a Ășnica plataforma de contĂȘiner independente que permite que as organizaçÔes criem sem esforço qualquer aplicativo, alĂ©m de distribuĂ­-lo e executĂĄ-lo em qualquer ambiente - de nuvens hĂ­bridas a sistemas de fronteira.

Docker compor


A tecnologia Docker Compose foi projetada para configurar aplicativos com vĂĄrios contĂȘineres. Um projeto do Docker Compose pode incluir quantos contĂȘineres do Docker forem necessĂĄrios para o criador deste projeto.

Ao trabalhar com o Docker Compose, um arquivo YAML Ă© usado para configurar serviços de aplicativos e organizar sua interação. O Docker Compose Ă©, portanto, uma ferramenta para descrever e executar aplicativos Docker com vĂĄrios contĂȘineres.


Dois contĂȘineres em execução no sistema host

GNU Make


Um programa makeé essencialmente uma ferramenta para automatizar a montagem de programas e bibliotecas a partir do código fonte. Em geral, podemos dizer que é makeaplicåvel a qualquer processo que inclua a execução de comandos arbitrårios para converter determinados materiais de origem em uma determinada forma resultante, em um determinado objetivo. No nosso caso, as equipes docker-composeserão convertidas em objetivos abstratos ( alvos falsos ).

Para dizer ao programa makeo que queremos dele, precisamos de um arquivo Makefile.

Os nossos MakefileconterĂŁo os comandos usuais dockeredocker-composeque sĂŁo projetados para resolver muitos problemas. Ou seja, estamos falando sobre a montagem do contĂȘiner, sobre como iniciĂĄ-lo, parar, reiniciar, organizar o logon do usuĂĄrio no contĂȘiner, trabalhar com logs do contĂȘiner e resolver outros problemas semelhantes.

Usos tĂ­picos do Docker Compose


Imagine um aplicativo Web regular que possua os seguintes componentes:

  • Banco de dados TimescaleDB (Postgres).
  • Aplicativo Express.js.
  • Ping (apenas um contĂȘiner que nĂŁo faz nada de especial).

Esse aplicativo precisarĂĄ de trĂȘs contĂȘineres do Docker e um arquivo docker-composecontendo instruçÔes para gerenciar esses contĂȘineres. Cada um dos contĂȘineres terĂĄ diferentes pontos de interação. Por exemplo, timescalevocĂȘ pode trabalhar com um contĂȘiner da mesma maneira que trabalha com bancos de dados. Ou seja, permite executar as seguintes açÔes:

  • Entre no shell do Postgres.
  • Importar e exportar tabelas.
  • Crie uma pg_dumptabela ou banco de dados.

O contĂȘiner de um aplicativo Express.js ,, expressjspode ter os seguintes recursos:

  • A saĂ­da de dados atualizados do log do sistema.
  • Digite o shell para executar determinados comandos.

Interação de contĂȘiner


Depois de configurar a conexĂŁo entre os contĂȘineres usando o Docker Compose, Ă© hora de estabelecer interação com esses contĂȘineres. Como parte do sistema Docker Compose, hĂĄ um comando docker-composeque suporta uma opção -fque permite transferir um arquivo para o sistema docker-compose.yml.

Usando os recursos desta opção, vocĂȘ pode limitar a interação com o sistema apenas para os contĂȘineres mencionados no arquivo docker-compose.yml.

Veja como sĂŁo as interaçÔes do contĂȘiner ao usar comandos docker-compose. Se imaginarmos que precisamos entrar no shell psql, os comandos correspondentes podem ser assim:

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

O mesmo comando para o qual nĂŁo docker-compose, mas Ă© usado docker, pode se parecer com isso:

docker exec -it  edp_timescale_1 psql -Upostgres

Observe que, nesses casos, Ă© sempre preferĂ­vel usar nĂŁo um comando docker, mas um comando docker-compose, pois isso elimina a necessidade de lembrar os nomes dos contĂȘineres.

Ambos os comandos acima não são tão complicados. Mas se usåssemos um "wrapper" de uma forma Makefileque nos desse uma interface na forma de comandos simples e chamasse comandos tão longos, então os mesmos resultados poderiam ser alcançados assim:

make db-shell

É Ăłbvio que o uso Makefilesimplifica bastante o trabalho com contĂȘineres!

Exemplo de trabalho


Com base no diagrama do projeto acima, crie o seguinte arquivo 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 gerenciar a configuração do Docker Compose e interagir com os contĂȘineres descritos, crie o seguinte arquivo 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

A maioria dos comandos descritos aqui se aplica a todos os contĂȘineres, mas o uso da opção c=permite limitar o escopo do comando a um contĂȘiner.

Depois de Makefilepronto, vocĂȘ pode usĂĄ-lo assim:

  • make help- emitindo uma lista de todos os comandos disponĂ­veis para make.


Ajuda de comandos disponĂ­veis

  • make build- montagem da imagem de Dockerfile. No nosso exemplo, usamos imagens timescalee ping. Mas apiqueremos coletar a imagem localmente. Isso Ă© exatamente o que serĂĄ feito apĂłs a execução deste comando.


Montagem de contĂȘiner do Docker

  • make start- lançamento de todos os contĂȘineres. Para iniciar apenas um contĂȘiner, vocĂȘ pode usar o comando do formulĂĄrio make start c=timescale.


Iniciar contĂȘiner de escala de tempo


Iniciar o contĂȘiner de ping

  • make login-timescale- entrada na sessĂŁo bash do contĂȘiner timescale.


Executando o bash no contĂȘiner de escala de tempo

  • make db-shell- Efetue login no psqlcontĂȘiner timescalepara executar consultas SQL no banco de dados.


Executando psql no contĂȘiner timescaledb

  • make stop - parar recipientes.


Parando o contĂȘiner da escala de tempo

  • make down- pare e remova os recipientes. Para excluir um contĂȘiner especĂ­fico, vocĂȘ pode usar este comando com o contĂȘiner especificado. Por exemplo - make down c=timescaleou make down c=api.


Pare e exclua todos os contĂȘineres

SumĂĄrio


Apesar do sistema Docker Compose nos fornecer um conjunto extenso de comandos projetados para gerenciar contĂȘineres, algumas vezes esses comandos se tornam longos e, como resultado, podem ser difĂ­ceis de lembrar.

A metodologia de uso Makefilenos ajudou a estabelecer uma interação rĂĄpida e fĂĄcil com os contĂȘineres do arquivo docker-compose.yml. Ou seja, estamos falando sobre o seguinte:

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

PS No nosso mercado, hĂĄ uma imagem do Docker , instalada em um clique. VocĂȘ pode verificar a operação de contĂȘineres no VPS . Todos os novos clientes recebem 3 dias gratuitamente para testes.

Queridos leitores! Como vocĂȘ automatiza o trabalho com o Docker Compose?

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


All Articles