Do `docker run` Repetido a um Arquivo Único
Gerenciar aplicações que dependem de múltiplos serviços, como APIs, bancos de dados, caches e filas, pode se tornar um pesadelo com o uso individual de comandos docker run. Cada serviço requer a especificação de imagens, redes, volumes e variáveis de ambiente. Repetir esses comandos longos e complexos para cada serviço, ou mesmo tentar mantê-los em scripts dispersos, rapidamente se torna inviável e propenso a erros. O Docker Compose surge como a solução definitiva para essa complexidade, permitindo que você defina toda a arquitetura de sua aplicação multi-container em um único arquivo declarativo. Esse arquivo pode ser versionado junto com o código-fonte, garantindo consistência e reprodutibilidade em todos os ambientes.
O Arquivo `compose.yaml`
O coração do Docker Compose é o arquivo de configuração, tradicionalmente nomeado docker-compose.yml ou, mais modernamente, compose.yaml. Este arquivo utiliza a sintaxe YAML para descrever os componentes da sua aplicação. Ele define serviços, que são essencialmente as configurações para criar e executar um ou mais containers. Além dos serviços, o arquivo também pode configurar as redes virtuais que conectarão esses containers e os volumes de dados que garantirão a persistência das informações.
Um serviço no arquivo compose.yaml é definido pela sua imagem Docker. Por exemplo, para configurar um serviço de banco de dados PostgreSQL, você especificaria a imagem oficial do PostgreSQL. O Compose cuida de baixar a imagem, criar o container e configurá-lo de acordo com as definições no arquivo. Isso inclui a atribuição de um nome ao serviço (que pode ser usado como um hostname dentro da rede Docker), a especificação de portas para mapeamento do host para o container, a montagem de volumes para persistência de dados e a injeção de variáveis de ambiente necessárias para a configuração do serviço.
# Exemplo básico de um arquivo compose.yaml
version: "3.8"
services:
db:
image: "postgres:14"
container_name: "meu-postgres"
restart: "always"
environment:
POSTGRES_DB: "meubanco"
POSTGRES_USER: "usuario"
POSTGRES_PASSWORD: "senha"
volumes:
- "db_data:/var/lib/postgresql/data"
ports:
- "5432:5432"
api:
build: "./api" # Caminho para o Dockerfile da API
container_name: "minha-api"
restart: "always"
ports:
- "3000:3000"
depends_on:
- "db" # Garante que o db inicie antes da api
environment:
DATABASE_URL: "postgres://usuario:senha@db:5432/meubanco"
volumes:
db_data:
Comandos Essenciais do Docker Compose
Uma vez que o arquivo compose.yaml está configurado, interagir com sua aplicação multi-container se torna trivial. O comando principal é docker compose up. Ao executá-lo no mesmo diretório do arquivo compose.yaml, o Docker Compose lê as definições, cria as redes e volumes necessários, e inicia os containers para cada serviço definido. Ele também gerencia as dependências entre os serviços, garantindo que, por exemplo, a API inicie apenas após o banco de dados estar pronto, graças à diretiva depends_on.
Para parar os containers e remover as redes criadas pelo Compose, o comando é docker compose down. Ele é o contraponto de up, garantindo uma limpeza completa. Se você precisar parar os containers sem removê-los, pode usar docker compose stop, e para reiniciá-los, docker compose start.
A visualização do status de todos os containers em execução pode ser feita com docker compose ps. Para ver os logs de todos os serviços, docker compose logs é o comando a ser usado. Adicionar a flag -f (docker compose logs -f) permite seguir os logs em tempo real, o que é extremamente útil durante o desenvolvimento e depuração.
Um recurso poderoso é a capacidade de executar comandos dentro de um container em execução. Por exemplo, para abrir um shell interativo no container do banco de dados PostgreSQL, você usaria docker compose exec db sh. Isso permite interagir diretamente com o ambiente do container, seja para executar comandos de administração do banco de dados ou para inspecionar arquivos e processos.
A construção de imagens customizadas para seus serviços, como a API no exemplo anterior, é feita com docker compose build. Este comando lê os Dockerfiles referenciados na seção build de cada serviço e constrói as imagens correspondentes. Isso integra perfeitamente o ciclo de desenvolvimento de imagens com a orquestração de containers.
Benefícios e Casos de Uso
O Docker Compose é uma ferramenta indispensável no ecossistema Docker. Seus benefícios são claros: simplificação drástica da configuração e gerenciamento de aplicações multi-container, aumento da produtividade do desenvolvedor e garantia de ambientes de desenvolvimento, teste e produção consistentes. Para desenvolvedores, isso significa menos tempo configurando e mais tempo codificando.
Para equipes, o uso de compose.yaml versionado no controle de versão do código garante que todos estejam trabalhando com a mesma configuração de ambiente. Isso elimina o clássico problema de
