Voltar ao Diminua Blog

Artigo

Orquestração de Contêineres para Projetos Pequenos: Uma Introdução ao Docker Compose

Simplifique o gerenciamento de aplicações multi-contêineres e acelere seu fluxo de trabalho de desenvolvimento e deploy.

Orquestração de Contêineres para Projetos Pequenos: Uma Introdução ao Docker Compose

O Desafio da Complexidade em Projetos Pequenos

Ao iniciar um projeto de software, especialmente aqueles de menor escala, a complexidade inicial pode parecer gerenciável. No entanto, à medida que a aplicação cresce, introduzimos dependências, serviços auxiliares (como bancos de dados, caches, filas de mensagens) e diferentes ambientes (desenvolvimento, staging, produção). Gerenciar manualmente cada um desses componentes, suas configurações e suas interconexões pode se tornar uma tarefa árdua, propensa a erros e que consome um tempo valioso que poderia ser dedicado ao desenvolvimento.

Para projetos pequenos, a introdução de ferramentas de orquestração de contêineres pode parecer um exagero. No entanto, ferramentas como o Docker Compose oferecem uma maneira elegante e eficiente de definir e executar aplicações multi-contêineres, mesmo em cenários mais simples. Elas permitem que você configure sua aplicação inteira com um único comando, facilitando a reprodução de ambientes e o compartilhamento do projeto com outros desenvolvedores.

O Que é Docker Compose?

Docker Compose é uma ferramenta para definir e executar aplicações Docker multi-contêineres. Com o Compose, você utiliza um arquivo YAML para configurar os serviços da sua aplicação. Em seguida, com um único comando, você pode criar e iniciar todos os serviços a partir da sua configuração. Ele é ideal para ambientes de desenvolvimento, testes e até mesmo para deploy em produção de aplicações mais simples.

Os principais benefícios do Docker Compose incluem:

  • Definição declarativa: Descreva sua aplicação em um arquivo YAML, tornando a configuração clara e versionável.
  • Orquestração simplificada: Inicie, pare e reconstrua todos os serviços da sua aplicação com comandos simples.
  • Reprodução de ambientes: Garanta que todos os desenvolvedores e ambientes de teste tenham a mesma configuração.
  • Gerenciamento de rede: Crie redes virtuais para que seus contêineres possam se comunicar facilmente.

Primeiros Passos com Docker Compose

Antes de começar, certifique-se de ter o Docker instalado em sua máquina. O Docker Compose geralmente vem incluído com o Docker Desktop ou pode ser instalado separadamente.

Vamos criar um exemplo simples: uma aplicação web básica com um servidor web (Nginx) e um banco de dados (PostgreSQL).

1. Criando o Arquivo de Configuração (`docker-compose.yml`)

Crie um arquivo chamado docker-compose.yml no diretório raiz do seu projeto. Este arquivo definirá os serviços, redes e volumes necessários.

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

2. Entendendo o Arquivo

  • version: '3.8': Especifica a versão da sintaxe do Docker Compose que estamos utilizando.
  • services:: Define os contêineres que compõem sua aplicação.
  • web:: Define o serviço do servidor web Nginx.
    • image: nginx:latest: Utiliza a imagem oficial do Nginx mais recente.
    • ports: - "8080:80": Mapeia a porta 8080 da sua máquina host para a porta 80 do contêiner Nginx. Assim, você acessará a aplicação via http://localhost:8080.
    • volumes: - ./html:/usr/share/nginx/html: Monta um diretório local html (que você precisará criar) dentro do contêiner, onde o Nginx busca os arquivos estáticos.
    • depends_on: - db: Indica que o serviço web depende do serviço db. O Docker Compose garantirá que o contêiner do banco de dados seja iniciado antes do contêiner web.
  • db:: Define o serviço do banco de dados PostgreSQL.
    • image: postgres:13: Utiliza a imagem oficial do PostgreSQL versão 13.
    • environment:: Define variáveis de ambiente necessárias para a configuração inicial do PostgreSQL (nome do banco, usuário e senha).
    • volumes: - postgres_data:/var/lib/postgresql/data: Monta um volume nomeado postgres_data para persistir os dados do banco de dados, mesmo que o contêiner seja recriado.
  • volumes:: Declara os volumes nomeados que serão utilizados.

3. Criando os Arquivos Necessários

No mesmo diretório do seu docker-compose.yml, crie um diretório chamado html e adicione um arquivo index.html simples para testar o Nginx:

<!DOCTYPE html>
<html>
<head>
  <title>Teste Docker Compose</title>
</head>
<body>
  <h1>Olá do Docker Compose!</h1>
  <p>Este é um teste simples de uma aplicação multi-contêiner.</p>
</body>
</html>

Executando Sua Aplicação

Com o arquivo docker-compose.yml e o diretório html configurados, abra seu terminal no diretório do projeto e execute os seguintes comandos:

1. Iniciar os Contêineres

Para iniciar todos os serviços definidos no arquivo docker-compose.yml em segundo plano:

docker-compose up -d
  • up: Cria e inicia os contêineres.
  • -d (detached): Executa os contêineres em segundo plano.

Na primeira vez que executar este comando, o Docker fará o download das imagens nginx:latest e postgres:13, o que pode levar alguns minutos dependendo da sua conexão com a internet.

2. Verificando os Contêineres em Execução

Para verificar se os contêineres foram iniciados corretamente:

docker-compose ps

Você deverá ver os contêineres web e db listados como Up.

3. Testando a Aplicação

Abra seu navegador e acesse http://localhost:8080. Você deverá ver a mensagem "Olá do Docker Compose!". Isso confirma que o Nginx está servindo o arquivo index.html corretamente.

4. Visualizando os Logs

Para ver os logs dos contêineres (útil para troubleshooting):

docker-compose logs

Você pode ver os logs de um serviço específico:

docker-compose logs web

5. Parando os Contêineres

Quando terminar, você pode parar e remover os contêineres, redes e volumes criados pelo Compose:

docker-compose down

Se você quiser remover também os volumes (e, portanto, os dados do banco de dados neste exemplo):

docker-compose down -v

Atenção: Remover volumes com -v apagará permanentemente os dados. Use com cautela.

Casos de Uso e Boas Práticas para Projetos Pequenos

O Docker Compose não se limita a exemplos simples. Ele é extremamente útil para:

  • Ambientes de Desenvolvimento Locais: Facilita a configuração de um ambiente de desenvolvimento idêntico ao de produção, eliminando o famoso "funciona na minha máquina".
  • Testes Automatizados: Permite levantar rapidamente os serviços necessários para a execução de testes de integração.
  • Demonstrações e Provas de Conceito: Simplifica a configuração e o deploy de demonstrações para clientes ou stakeholders.
  • Aplicações com Múltiplos Serviços: Mesmo que seu projeto seja pequeno, se ele interage com um banco de dados, um cache (Redis), uma fila (RabbitMQ) ou um serviço de autenticação, o Compose centraliza essa gestão.

Boas Práticas:

  • Versionamento do docker-compose.yml: Trate seu arquivo docker-compose.yml como código e o versiona junto com o restante do seu projeto no Git.
  • Uso de Volumes para Persistência: Sempre utilize volumes para dados importantes (bancos de dados, uploads, etc.) para garantir a persistência.
  • Variáveis de Ambiente: Evite hardcoding de senhas e configurações sensíveis diretamente no arquivo docker-compose.yml. Use arquivos .env para gerenciar variáveis de ambiente. Crie um arquivo .env na mesma pasta do docker-compose.yml com o conteúdo: POSTGRES_PASSWORD=mypassword e ajuste seu docker-compose.yml para ler essa variável.
  • Imagens Específicas: Em vez de usar latest, especifique versões de imagens (ex: nginx:1.21, postgres:13.4) para garantir builds reproduzíveis e evitar surpresas com atualizações automáticas.
  • Redes Personalizadas: Para aplicações mais complexas, considere definir redes personalizadas para um controle mais granular da comunicação entre contêineres.

Conclusão

O Docker Compose é uma ferramenta poderosa que democratiza a orquestração de contêineres, tornando-a acessível e prática mesmo para pequenos projetos. Ao adotar o Compose, você ganha agilidade no desenvolvimento, consistência entre ambientes e simplifica drasticamente o gerenciamento de aplicações multi-contêineres. Isso libera tempo e energia para focar no que realmente importa: construir e aprimorar seu produto. Experimente incluir o Docker Compose em seus próximos projetos, mesmo os menores, e veja como ele pode transformar seu fluxo de trabalho.

Foto de Wolfgang Weiser no Pexels.