Docker Compose: Guia completo para iniciantes

Aprenda a utilizar essa ferramenta que se tornou fundamental para desenvolvedores que trabalham com aplicações multi-container

O Docker Compose é uma ferramenta essencial para desenvolvedores que trabalham com aplicações multi-container. Se você já experimentou executar múltiplos contêineres Docker manualmente, sabe o quanto isso pode se tornar complexo rapidamente. Neste guia completo, vamos explorar o que é o Docker Compose, como utilizá-lo e por que ele se tornou indispensável no desenvolvimento moderno.

O que é Docker Compose?

Docker Compose é uma ferramenta que permite definir e executar aplicações Docker multi-container. Com ele, você utiliza um arquivo YAML para configurar todos os serviços da sua aplicação. Em seguida, com um único comando, você cria e inicia todos os serviços definidos na sua configuração.

A grande vantagem? Simplicidade e reprodutibilidade. Ao invés de executar múltiplos comandos docker run com dezenas de flags e parâmetros, você define tudo uma vez no arquivo de configuração e compartilha com sua equipe.

Dockerfile vs Compose file: qual a diferença?

É comum confundir esses dois conceitos no início, mas a distinção é importante:

Dockerfile

Compose file

Fornece instruções para construir uma imagem de container

Define como seus containers devem executar

Foco em uma única imagem

Orquestra múltiplos serviços

Usado com docker build

Usado com docker compose up

Frequentemente, um arquivo Compose referencia um Dockerfile para construir a imagem que será utilizada em um serviço específico.

Por que usar Docker Compose?

Seguindo as melhores práticas

Uma das melhores práticas em containers é que cada container deve fazer uma coisa e fazê-la bem. Isso significa que, para uma aplicação completa, você provavelmente precisará de:

  • Um container para a aplicação

  • Um container para o banco de dados

  • Um container para cache (Redis, por exemplo)

  • Um container para filas de mensagens

  • E assim por diante

Gerenciar tudo isso manualmente rapidamente se torna um pesadelo de complexidade.

Abordagem declarativa

O Docker Compose é uma ferramenta declarativa - você simplesmente define o que quer e executa. Não é necessário recriar tudo do zero a cada mudança. Quando você altera algo no arquivo de configuração e executa docker compose up novamente, o Compose identifica as alterações e as aplica de forma inteligente.

Versionamento e colaboração

Incluindo o arquivo compose.yaml no seu repositório de código, qualquer pessoa que clonar o projeto pode colocar toda a aplicação em funcionamento com um único comando. Isso facilita enormemente a integração de novos membros na equipe e garante que todos estejam trabalhando com a mesma configuração.

Colocando a mão na massa: aplicação to-do list

Vamos construir uma aplicação to-do list utilizando Node.js e MySQL para entender na prática como o Docker Compose funciona.

Pré-requisitos

  • Docker Desktop instalado em seu sistema

  • Git para clonar o repositório de exemplo

Iniciando a aplicação

  1. Clone o repositório de exemplo:

git clone https://github.com/dockersamples/todo-list-app
cd todo-list-app
  1. Explore o arquivo compose.yaml:

Dentro do diretório, você encontrará o arquivo compose.yaml. Este é o coração da configuração, onde toda a mágica acontece. O arquivo define:

  • Serviços que compõem a aplicação

  • Imagens Docker utilizadas

  • Portas expostas

  • Volumes para persistência de dados

  • Redes para comunicação entre containers

  • Outras configurações necessárias

  1. Inicie a aplicação:

docker compose up -d --build

O output será similar a este:

[+] Running 5/5
 ✔ app 3 layers [⣿⣿⣿]      0B/0B            Pulled          7.1s
   ✔ e6f4e57cc59e Download complete                          0.9s
   ✔ df998480d81d Download complete                          1.0s
   ✔ 31e174fedd23 Download complete                          2.5s
   ✔ 43c47a581c29 Download complete                          2.0s
[+] Running 4/4
   ⠸ Network todo-list-app_default           Created         0.3s
   ⠸ Volume "todo-list-app_todo-mysql-data"  Created         0.3s
   ✔ Container todo-list-app-app-1           Started         0.3s
   ✔ Container todo-list-app-mysql-1         Started         0.3s

O que aconteceu nos bastidores?

Com esse único comando, o Docker Compose realizou várias operações:

  • Download de imagens: As imagens Node.js e MySQL foram baixadas do Docker Hub

  • Criação de rede: Uma rede foi criada para permitir a comunicação entre os containers

  • Criação de volume: Um volume foi criado para persistir os dados do banco de dados entre reinicializações

  • Inicialização de containers: Dois containers foram iniciados com todas as configurações necessárias

  1. Acesse a aplicação:

Abra seu navegador e acesse http://localhost:3000. A aplicação pode levar de 10 a 15 segundos para inicializar completamente. Experimente adicionar itens à lista, marcá-los como concluídos e removê-los.

Gerenciando a aplicação

Visualizando no Docker Desktop

Através da interface gráfica do Docker Desktop, você pode:

  • Visualizar todos os containers em execução

  • Acessar logs de cada serviço

  • Inspecionar configurações detalhadas

  • Monitorar uso de recursos

Finalizando a aplicação

Quando terminar de trabalhar, é simples desligar tudo:

docker compose down

Output esperado:

[+] Running 3/3
 ✔ Container todo-list-app-mysql-1  Removed        2.9s
 ✔ Container todo-list-app-app-1    Removed        0.1s
 ✔ Network todo-list-app_default    Removed        0.1s

Persistência de volumes

Por padrão, os volumes não são removidos automaticamente quando você derruba um stack do Compose. Isso é intencional - você pode querer preservar os dados caso reinicie a aplicação.

Para remover também os volumes, adicione a flag --volumes:

docker compose down --volumes

Comandos essenciais do Docker Compose

Comando

Descrição

docker compose up

Cria e inicia os containers

docker compose up -d

Inicia em modo detached (background)

docker compose down

Para e remove containers, redes

docker compose ps

Lista containers em execução

docker compose logs

Visualiza logs dos serviços

docker compose exec

Executa comando em um container em execução

docker compose build

Constrói ou reconstrói serviços

Estrutura básica de um arquivo compose.yaml

Embora cada aplicação tenha necessidades específicas, a estrutura básica de um arquivo Compose segue este padrão:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    environment:
      - NODE_ENV=development
    depends_on:
      - db
  
  db:
    image: mysql:8.0
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret

volumes:
  db-data:

Melhores práticas com Docker Compose

1. Use variáveis de ambiente

Evite hardcoding de credenciais e configurações sensíveis. Utilize arquivos .env:

environment:
  - DB_PASSWORD=${DB_PASSWORD}

2. Defina health checks

Garanta que seus serviços estejam realmente prontos antes de iniciar dependências:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:3000"]
  interval: 30s
  timeout: 3s
  retries: 3

3. Use named volumes

Volumes nomeados são mais fáceis de gerenciar e entender:

volumes:
  postgres-data:
  redis-data:

4. Limite recursos

Evite que um container consuma todos os recursos do sistema:

deploy:
  resources:
    limits:
      cpus: '0.5'
      memory: 512M

FAQ sobre Docker Compose

O Docker Compose substitui o Kubernetes?

Não. Docker Compose é ideal para desenvolvimento local e aplicações menores. Kubernetes é mais adequado para ambientes de produção em larga escala com requisitos complexos de orquestração.

Posso usar Docker Compose em produção?

Embora possível, não é recomendado para ambientes de produção críticos. Para produção, considere ferramentas como Kubernetes, Docker Swarm ou serviços de orquestração em nuvem.

Como depurar problemas no Docker Compose?

Use docker compose logs [service-name] para visualizar logs específicos, ou docker compose logs -f para acompanhar em tempo real.

É possível usar múltiplos arquivos Compose?

Sim! Você pode usar a flag -f para especificar múltiplos arquivos, útil para diferentes ambientes:

docker compose -f docker-compose.yml -f docker-compose.prod.yml up

Próximos passos

Agora que você compreende os fundamentos do Docker Compose, aqui estão algumas sugestões para aprofundar seus conhecimentos:

  1. Explore a documentação oficial sobre como o Compose funciona internamente

  2. Pratique criando seus próprios arquivos Compose para projetos pessoais

  3. Aprenda sobre Docker networks para entender melhor a comunicação entre containers

  4. Estude patterns de configuração para diferentes tipos de aplicações (microserviços, monolitos, etc.)

  5. Experimente com diferentes stacks (LAMP, MEAN, JAMstack) usando Compose

Conclusão

Docker Compose é uma ferramenta poderosa que simplifica drasticamente o desenvolvimento de aplicações multi-container. Ao definir toda a infraestrutura da sua aplicação em um único arquivo YAML, você ganha em produtividade, reprodutibilidade e colaboração.

A curva de aprendizado inicial pode parecer íngreme, mas os benefícios a longo prazo são imensos. Com a prática, você descobrirá que o Docker Compose se torna uma extensão natural do seu fluxo de trabalho de desenvolvimento.

Comece pequeno, experimente com aplicações simples e gradualmente incorpore configurações mais avançadas conforme sua confiança e necessidades crescem. O ecossistema Docker é vasto e está em constante evolução, tornando este um momento excelente para aprofundar seus conhecimentos em containers e orquestração.