Docker Compose: Orquestrando Contêineres com Eficiência
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í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ços
Configuraçã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:
- Criar um arquivo docker-compose
Volumes 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 que descreva os serviços
Configuraçã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. (contêineres) necessários.
- Definir variáveis de ambiente
Dockerfile: 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 configurações adicionais para personalizar a execução.
- Executar poucos comandos que levantam todo o stack de serviços
Configuraçã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..
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 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 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 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í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:
- docker-compose
Volumes 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: arquivo principal que define os serviços
Configuraçã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., volumes, redes e links.
- docker-compose
Volumes 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..override.yml (opcional): permite sobrescrever configurações do arquivo principal, útil para diferentes ambientes (desenvolvimento, teste, produção).
- .env (opcional): armazena variáveis de ambiente
Dockerfile: 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. que podem ser referenciadas tanto no Docker Compose quanto nos serviços em si.
Definindo serviços no docker-compose.yml🔗
No arquivo docker-composeVolumes 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 ambiente
Dockerfile: 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:
- version: versão do esquema do Compose
Configuraçã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. (no exemplo, 3.8).
- build: caminho com o Dockerfile
Dockerfile: 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. para criar a imagem de forma automatizada.
- environment
Configuraçã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.: pode incluir variáveis definidas no arquivo .env.
- depends_on: garante que serviços
Configuraçã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. críticos (ex.: banco de dados) sejam iniciados antes de outros.
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çõ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 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í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í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 Dockerfile
Dockerfile: 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í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 base
Otimizando 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í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í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 redes
Configuraçã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 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 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:
- Atualização gradativa: você pode subir o novo contêiner (ex.: db_v2) e manter o anterior (db_v1) em paralelo até garantir que o novo esteja estável.
- Rollback manual: caso a nova versão apresente problemas, basta reverter o arquivo docker-compose
Volumes 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 para a configuração anterior e executar
docker compose
novamente.Introduçã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
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í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çõ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"]
- Ao executar
docker compose
, apenas os serviçosIntroduçã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. --profile prod up -d
Configuraçã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. web e cache serão iniciados.
- Ao executar
docker compose
, os serviçosIntroduçã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. --profile dev up -d
Configuraçã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. web e debug-tool entram em execução, facilitando depurações e testes.
Além disso, você pode escalar um serviço para lidar com mais volumeConfiguraçã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 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çõ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çõ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ços
Configuraçã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 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 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 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 compose
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 ambienteIntroduçã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
Dockerfile: 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í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 ambiente
Dockerfile: 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/