Automatize Ambientes com Docker Compose: Guia Completo

Automatizar a implantação de ambientes é um passo fundamental para garantir consistência, rapidez e escalabilidade no desenvolvimento e na entrega de aplicações. Docker ComposeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. se destaca como uma ferramenta poderosa para orquestrar múltiplos contêineres de forma simples e unificada, permitindo que desenvolvedores, DevOps e administradores de sistemas definam, configurem e executem todo o conjunto de serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. com apenas alguns comandos. Neste tutorial, vamos explorar conceitos e práticas que possibilitam automatizar a criação, configuração e execução de ambientes completos utilizando Docker Compose.

Visão geral da automação com Docker Compose🔗

A automação na implantação de ambientes consiste em:

O objetivo é eliminar processos manuais repetitivos, minimizando a ocorrência de erros de configuração e maximizando a eficiênciaDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. do time.

Principais benefícios da automação

1. Reprodutibilidade: qualquer pessoa da equipe consegue iniciar o mesmo ambienteConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. de forma idêntica.

2. Escalabilidade: é simples adicionar ou remover serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. e escalar contêineres conforme a demanda.

3. Consistência: todos os membros utilizam a mesma versão dos componentes, reduzindo problemas de compatibilidade.

Estrutura de arquivos para automação🔗

Uma prática comum ao trabalhar com Docker ComposeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. é organizar o projeto em diretórios que facilitem a leitura e a manutenção. A estrutura abaixo é apenas um exemplo, que pode ser ajustado conforme seu contexto:

meu-projeto/
├─ docker-compose.yml
├─ docker-compose.override.yml
├─ .env
├─ service1/
│   ├─ Dockerfile
│   └─ ...
├─ service2/
│   ├─ Dockerfile
│   └─ ...
└─ ...

A seguir, entenda como cada arquivo auxilia no processo de automação:

Definindo serviços no docker-compose.yml🔗

No arquivo docker-composeVolumes em Docker: conceitos e configuraçõesVolumes em Docker: conceitos e configuraçõesAprenda passo a passo a criar e configurar volumes Docker, assegurando persistência de dados e adotando práticas recomendadas para evitar perdas..yml, você descreve cada serviço e sua imagem, bem como portas, volumes, variáveis de ambienteDockerfile: criando imagens personalizadas passo a passoDockerfile: criando imagens personalizadas passo a passoAprenda a criar Dockerfile para aplicações Node.js, garantindo consistência e reprodutibilidade na construção de imagens Docker. e dependências. Por exemplo:

version: "3.8"
services:
  api:
    build: ./service1
    container_name: api-container
    ports:
  • "8080:8080"
environment:
  • APP_ENV=${APP_ENV}
depends_on:
  • db
db: image: postgres:15 container_name: db-container environment:
  • POSTGRES_USER=${DB_USER}
  • POSTGRES_PASSWORD=${DB_PASS}
volumes:
  • db_data:/var/lib/postgresql/data
volumes: db_data:

Alguns pontos importantes para automação:

Variáveis de ambiente e arquivo .env🔗

Para tornar a implantação flexível, é comum utilizar o arquivo .env para centralizar valores sensíveis ou que variam entre ambientes. Exemplo de arquivo .env:

APP_ENV=production
DB_USER=admin
DB_PASS=S3nh@F0rt3

No docker-composeVolumes em Docker: conceitos e configuraçõesVolumes em Docker: conceitos e configuraçõesAprenda passo a passo a criar e configurar volumes Docker, assegurando persistência de dados e adotando práticas recomendadas para evitar perdas..yml, essas variáveis podem ser referenciadas utilizando a sintaxe ${VARIAVEL}. Assim, quando for necessário alterar a senha do banco ou a porta de exposição de algum serviço, basta atualizar o arquivo .env. Isso automatiza a adaptação do ambienteConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. para cada cenário, seja desenvolvimento local, teste ou produção.

Automatizando builds e atualizações🔗

Para garantir que sempre estejam sendo executadas as versões mais recentes dos contêineres, o Docker ComposeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. oferece comandos que podem ser integrados a scripts ou pipelines de automação:

1. docker composeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. build: constroi as imagens de cada serviço que possui diretório com DockerfileDockerfile: criando imagens personalizadas passo a passoDockerfile: criando imagens personalizadas passo a passoAprenda a criar Dockerfile para aplicações Node.js, garantindo consistência e reprodutibilidade na construção de imagens Docker..

2. docker composeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. pull: atualiza as imagens baseOtimizando imagens Docker para melhor desempenhoOtimizando imagens Docker para melhor desempenhoAprenda a otimizar imagens Docker com bases enxutas, redução de camadas e remoção de pacotes supérfluos para acelerar builds e melhorar a performance. a partir de repositórios remotos.

3. docker composeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. up -d: cria e inicia todos os contêineres em segundo plano.

4. docker composeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. down: remove os contêineres e redesConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras., caso necessário.

É comum combinar esses comandos em um script deploy.sh, por exemplo:

#!/bin/bash
echo "Iniciando a construção das imagens..."
docker compose build --no-cache
echo "Atualizando imagens remotas..."
docker compose pull
echo "Subindo o ambiente..."
docker compose up -d
echo "Implantação concluída!"

Esse script pode ser disparado automaticamente em sistemas de Integração Contínua (CI) ou na linha de comando para manter o ambienteConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. sempre atualizado.

Estratégias de update e rollback🔗

Para cenários em que um serviço precise ser atualizado sem prejudicar a disponibilidade do ambienteConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras., é possível usar algumas estratégias:

Essas abordagens podem ser automatizadas com scripts ou mesmo integradas a soluções de CI que monitoram logs e indicadores de saúde da aplicação.

Uso de perfis e escalabilidade🔗

Uma funcionalidade útil para automatizar o uso de configurações diferentes (ex.: produção vs. desenvolvimento) é o uso de perfis no Docker ComposeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção.. Você pode habilitar ou desabilitar determinados serviços com base em perfis, ajustando o ambiente conforme suas necessidades.

Por exemplo, em seu docker-composeVolumes em Docker: conceitos e configuraçõesVolumes em Docker: conceitos e configuraçõesAprenda passo a passo a criar e configurar volumes Docker, assegurando persistência de dados e adotando práticas recomendadas para evitar perdas..yml:

version: "3.8"
services:
  web:
    image: nginx:latest
    profiles: ["prod", "dev"]
  cache:
    image: redis:latest
    profiles: ["prod"]
  debug-tool:
    image: alpine:latest
    command: ["tail", "-f", "/dev/null"]
    profiles: ["dev"]

Além disso, você pode escalar um serviço para lidar com mais volumeConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. de requisições de forma simples:

docker compose up -d --scale web=3

Esse comando criará três contêineres do serviço web, permitindo melhor distribuição de cargaResiliência e balanceamento de carga em redes DockerResiliência e balanceamento de carga em redes DockerDescubra como implementar resiliência e balanceamento de carga em redes Docker, garantindo alta disponibilidade e desempenho contínuo mesmo em casos de falha..

Boas práticas para automação🔗

1. Controle de versão: mantenha os arquivos docker-composeVolumes em Docker: conceitos e configuraçõesVolumes em Docker: conceitos e configuraçõesAprenda passo a passo a criar e configurar volumes Docker, assegurando persistência de dados e adotando práticas recomendadas para evitar perdas..yml, .env e demais scripts no seu repositório, garantindo rastreabilidade de mudanças.

2. Divisão de responsabilidades: evite que um único docker-composeVolumes em Docker: conceitos e configuraçõesVolumes em Docker: conceitos e configuraçõesAprenda passo a passo a criar e configurar volumes Docker, assegurando persistência de dados e adotando práticas recomendadas para evitar perdas..yml controle um número excessivo de serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. desconexos. Se necessário, crie múltiplos arquivos para cada “conjunto lógico” de aplicações.

3. Documentação interna: inclua no repositório um arquivo README com instruções de como iniciar, atualizar e depurar o ambienteConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras..

4. Manutenção de imagens: faça limpeza periódica de imagens antigas e contêineres parados para evitar uso excessivo de armazenamento.

5. Utilize recursos nativos: perfis, overrides e variáveis de ambienteDockerfile: criando imagens personalizadas passo a passoDockerfile: criando imagens personalizadas passo a passoAprenda a criar Dockerfile para aplicações Node.js, garantindo consistência e reprodutibilidade na construção de imagens Docker. simplificam a personalização de cada ambiente.

Exemplo completo de arquivo docker-compose.yml🔗

Abaixo, um exemplo mais completo que demonstra uma abordagem para automatizar o deployment de um ambienteConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. com duas aplicações e um banco de dados:

version: "3.8"
services:
  frontend:
    build: ./frontend
    container_name: frontend-app
    ports:
  • "3000:3000"
environment:
  • NODE_ENV=${APP_ENV}
depends_on:
  • backend
backend: build: ./backend container_name: backend-app ports:
  • "4000:4000"
environment:
  • DB_HOST=db
  • DB_USER=${DB_USER}
  • DB_PASS=${DB_PASS}
depends_on:
  • db
db: image: postgres:15 container_name: db-container environment:
  • POSTGRES_USER=${DB_USER}
  • POSTGRES_PASSWORD=${DB_PASS}
volumes:
  • postgres_data:/var/lib/postgresql/data
volumes: postgres_data:

Com este arquivo, basta executar docker composeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. up -d para que os três contêineres estejam rodando. O frontend se comunica com o backend, e o backend interage com o banco. As variáveis de ambienteDockerfile: criando imagens personalizadas passo a passoDockerfile: criando imagens personalizadas passo a passoAprenda a criar Dockerfile para aplicações Node.js, garantindo consistência e reprodutibilidade na construção de imagens Docker. são lidas do arquivo .env, tornando simples a troca de credenciais e configurações.

Conclusão🔗

Automatizar a implantação de ambientes com Docker ComposeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. reduz complexidade e falhas humanas, tornando o ciclo de desenvolvimento e entrega mais ágil. A capacidade de definir múltiplos serviços em um único arquivo, combinada com variáveis de ambienteDockerfile: criando imagens personalizadas passo a passoDockerfile: criando imagens personalizadas passo a passoAprenda a criar Dockerfile para aplicações Node.js, garantindo consistência e reprodutibilidade na construção de imagens Docker. e estratégias de build e rollback, permite que equipes de diferentes níveis de experiência criem e gerenciem seus stacks de forma padronizada.

Ao aplicar as práticas abordadas neste tutorial, você estará pronto para construir ambientes sustentáveis, versionados e facilmente reproduzíveis, economizando tempo e recursos, além de garantir consistência em todo o ciclo de vida da aplicação.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

  • Documentação do Docker Engine, útil para compreender como os contêineres e imagens funcionam por baixo dos comandos do Docker Compose: docs.docker.com/engine/
  • Documentação oficial do Docker, que fornece fundamentos e boas práticas usadas no tutorial: docs.docker.com/
  • Guia oficial do Docker Compose, essencial para entender e aprofundar o conteúdo abordado sobre automação de ambientes: docs.docker.com/compose/
  • Referência de linha de comando Docker CLI, que pode complementar o entendimento dos comandos executados via Docker Compose: docs.docker.com/engine/reference/commandline/docker/
  • Repositório de imagens oficiais no Docker Hub, onde é possível encontrar imagens para utilização e build nos serviços descritos: hub.docker.com/

Compartilhar artigo

Artigos Relacionados