Como Criar Aplicações Docker Compose

DockerBeginner
Pratique Agora

Introdução

Docker Compose é uma ferramenta crucial para o desenvolvimento de software moderno, permitindo que os desenvolvedores definam e gerenciem aplicações multi-container complexas por meio de arquivos de configuração declarativos simples. Este tutorial abrangente explora os conceitos centrais, a arquitetura e as estratégias de implementação práticas do Docker Compose para um gerenciamento e implantação eficientes de contêineres.

Conceitos Básicos do Docker Compose

Introdução ao Docker Compose

Docker Compose é uma ferramenta poderosa para orquestração de contêineres, permitindo que desenvolvedores definam e gerenciem aplicações multi-contêiner com facilidade. Como componente chave em implantações de software modernas, o Docker Compose simplifica o processo de configurar e executar ambientes de aplicação complexos.

Conceitos e Arquitetura Core

Docker Compose utiliza arquivos de configuração YAML para definir serviços, redes e volumes para aplicações containerizadas. O objetivo principal é otimizar a implantação de contêineres interconectados através de uma única configuração declarativa.

graph TD
    A[Docker Compose] --> B[Configuração YAML]
    B --> C[Definições de Serviço]
    B --> D[Configuração de Rede]
    B --> E[Gerenciamento de Volumes]

Componentes Principais do Docker Compose

Componente Descrição Finalidade
Serviços Configurações de contêiner Definir contêineres individuais
Redes Comunicação entre contêineres Gerenciar a rede entre contêineres
Volumes Armazenamento de dados persistentes Lidar com a persistência de dados

Exemplo Prático: Configuração de Aplicação Web

Aqui está uma configuração abrangente do Docker Compose para uma aplicação web típica:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./website:/usr/share/nginx/html
  database:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Análise da Configuração

  1. O exemplo define dois serviços: um servidor web e um banco de dados.
  2. O Nginx serve conteúdo estático de um diretório local.
  3. O banco de dados PostgreSQL é configurado com um volume persistente.
  4. O mapeamento de portas permite acesso web externo.

Instalação e Inicialização

Para começar com o Docker Compose no Ubuntu 22.04, utilize os seguintes comandos:

sudo apt update
sudo apt install docker-compose-plugin
docker compose version

Execução e Gerenciamento

Executar uma aplicação multi-contêiner é simples:

## Iniciar contêineres em segundo plano
docker compose up -d

## Visualizar contêineres em execução
docker compose ps

## Parar e remover contêineres
docker compose down

Configuração e Rede

Fundamentos de Configuração YAML

Docker Compose depende de arquivos YAML para definir ambientes complexos de contêineres. A estrutura de configuração oferece controle granular sobre a implantação de serviços, redes e configurações de ambiente.

graph LR
    A[Configuração YAML] --> B[Definições de Serviço]
    A --> C[Configurações de Rede]
    A --> D[Variáveis de Ambiente]

Estratégias de Definição de Serviço

Opção de Configuração Finalidade Exemplo
image Especificar a imagem base do contêiner nginx:latest
ports Mapear portas do contêiner para o host "8080:80"
environment Definir variáveis de tempo de execução DATABASE_URL=postgres://...
volumes Gerenciar armazenamento persistente ./data:/app/data

Configuração Avançada de Rede

Docker Compose permite cenários de rede sofisticados por meio de definições de rede personalizadas:

version: "3.8"
services:
  frontend:
    image: nginx:alpine
    networks:
      - frontend_network

  backend:
    image: python:3.9
    networks:
      - backend_network
      - frontend_network

networks:
  frontend_network:
    driver: bridge
  backend_network:
    driver: overlay

Gerenciamento de Variáveis de Ambiente

A configuração flexível de ambiente suporta múltiplos cenários de implantação:

## Criar arquivo .env
echo "DATABASE_PASSWORD=secretpassword" > .env

## Configuração Docker Compose
version: '3.8'
services:
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}

Isolamento e Comunicação de Rede

graph TD
    A[Serviço Frontend] -->|Rede Isolada| B[Serviço Backend]
    B -->|Rede Compartilhada| C[Serviço de Banco de Dados]

Comandos Práticos de Rede

## Listar redes Docker
docker network ls

## Inspecionar rede específica
docker network inspect frontend_network

## Criar rede personalizada
docker network create myapp_network

Verificação de Conectividade de Contêineres

## Verificar conectividade de serviço
docker compose exec frontend ping backend

## Visualizar detalhes da rede
docker compose config --resolve-env-vars

Estratégias Avançadas de Implantação

Escalonamento Dinâmico de Serviços

Docker Compose fornece mecanismos poderosos para gerenciar instâncias de contêineres:

## Escalonar serviço específico
docker compose up --scale web=3 -d
graph LR
    A[Load Balancer] --> B[Serviço Web 1]
    A --> C[Serviço Web 2]
    A --> D[Serviço Web 3]

Gerenciamento de Dependências de Serviços

Garantir a sequência correta de inicialização e as dependências entre serviços:

version: "3.8"
services:
  database:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5

  backend:
    image: myapp-backend
    depends_on:
      database:
        condition: service_healthy

Monitoramento e Verificações de Saúde

Técnica de Monitoramento Descrição Implementação
Verificações de Saúde Verificar a prontidão do serviço Execução de comando personalizado
Limites de Recurso Controlar recursos do contêiner Restrições de CPU/Memória
Logística Gerenciamento centralizado de logs Integração com o ELK stack

Configuração de Restrição de Recursos

services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

Técnicas Avançadas de Solução de Problemas

## Logs detalhados do serviço
docker compose logs -f backend

## Monitoramento de recursos em tempo real
docker stats

## Diagnóstico abrangente do sistema
docker compose ps
docker compose config

Descoberta de Serviços e Complexidade de Rede

graph TD
    A[Registro de Serviços] --> B[Serviço Frontend]
    A --> C[Serviço Backend]
    A --> D[Microserviço 1]
    A --> E[Microserviço 2]

Workflow de Implantação Contínua

version: "3.8"
services:
  ci-runner:
    image: docker:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: |
      sh -c "
        docker compose pull
        docker compose up -d --build
        docker compose ps
      "

Estratégias de Otimização de Desempenho

## Inicialização paralela de serviços
docker compose up -d --parallel

## Gerenciamento seletivo de serviços
docker compose up frontend backend

Resumo

Dominando o Docker Compose, os desenvolvedores podem otimizar a implantação de aplicações, simplificar a configuração de contêineres e criar ambientes escaláveis e reproduzíveis. O tutorial abrange técnicas essenciais, desde definições básicas de serviços até redes avançadas e gerenciamento de volumes, fornecendo uma base sólida para o desenvolvimento e orquestração de aplicações em contêineres.