Docker

Open Source Fundamental Containerization DevOps

Plataforma para desenvolver, distribuir e executar aplicações usando containerização

Visão Geral

Docker é uma plataforma de containerização que revolucionou o desenvolvimento e deployment de aplicações. Criado em 2013, permite empacotar aplicações e suas dependências em containers leves e portáveis, garantindo consistência entre ambientes de desenvolvimento, teste e produção.

Principais Características

  • Containerização: Isolamento de aplicações em containers leves
  • Portabilidade: "Build once, run anywhere"
  • Eficiência: Menor overhead que VMs tradicionais
  • Escalabilidade: Fácil escalonamento horizontal
  • Versionamento: Controle de versões de imagens
  • Ecosystem: Docker Hub com milhões de imagens

Arquitetura Docker

O Docker utiliza uma arquitetura cliente-servidor:

  • Docker Client: Interface de linha de comando
  • Docker Daemon: Gerencia containers, imagens e redes
  • Docker Images: Templates read-only para containers
  • Docker Containers: Instâncias executáveis de imagens
  • Docker Registry: Repositório de imagens (Docker Hub)

Exemplo de Dockerfile

# Dockerfile para aplicação Python
FROM python:3.11-slim

# Define diretório de trabalho
WORKDIR /app

# Copia arquivos de dependências
COPY requirements.txt .

# Instala dependências
RUN pip install --no-cache-dir -r requirements.txt

# Copia código da aplicação
COPY . .

# Expõe porta da aplicação
EXPOSE 8000

# Define usuário não-root
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser

# Comando para iniciar aplicação
CMD ["python", "app.py"]

Docker Compose para Orquestração

# docker-compose.yml para stack de dados
version: '3.8'

services:
  # Aplicação principal
  app:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
    volumes:
      - ./data:/app/data
    networks:
      - app-network

  # Banco de dados PostgreSQL
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - app-network

  # Cache Redis
  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      - app-network

  # Processamento de dados com Spark
  spark-master:
    image: bitnami/spark:3.5
    environment:
      - SPARK_MODE=master
      - SPARK_RPC_AUTHENTICATION_ENABLED=no
      - SPARK_RPC_ENCRYPTION_ENABLED=no
    ports:
      - "8080:8080"
      - "7077:7077"
    networks:
      - app-network

  spark-worker:
    image: bitnami/spark:3.5
    environment:
      - SPARK_MODE=worker
      - SPARK_MASTER_URL=spark://spark-master:7077
      - SPARK_WORKER_MEMORY=2G
      - SPARK_WORKER_CORES=2
    depends_on:
      - spark-master
    networks:
      - app-network

  # Monitoramento
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - app-network

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - app-network

volumes:
  postgres_data:
  redis_data:
  grafana_data:

networks:
  app-network:
    driver: bridge

Comandos Docker Essenciais

Gerenciamento de Imagens

# Construir imagem
docker build -t myapp:latest .

# Listar imagens
docker images

# Baixar imagem
docker pull ubuntu:20.04

# Remover imagem
docker rmi myapp:latest

# Limpar imagens não utilizadas
docker image prune

Gerenciamento de Containers

# Executar container
docker run -d -p 8000:8000 myapp

# Listar containers
docker ps -a

# Parar container
docker stop container_id

# Remover container
docker rm container_id

# Logs do container
docker logs container_id

Multi-stage Builds

# Multi-stage build para aplicação Go
# Estágio de build
FROM golang:1.21-alpine AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# Estágio de produção
FROM alpine:latest

RUN apk --no-cache add ca-certificates
WORKDIR /root/

# Copia apenas o binário do estágio anterior
COPY --from=builder /app/main .

CMD ["./main"]

Docker para Big Data

Docker é amplamente usado em ambientes de Big Data para:

  • Spark Clusters: Deploy distribuído de aplicações Spark
  • Kafka Clusters: Orquestração de brokers Kafka
  • Hadoop Ecosystem: Containerização de componentes Hadoop
  • ML Pipelines: Isolamento de ambientes de ML
  • Data Processing: Jobs de processamento escaláveis

Exemplo: Cluster Kafka com Docker

# docker-compose.yml para Kafka
version: '3.8'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.4.0
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka1:
    image: confluentinc/cp-kafka:7.4.0
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3

  kafka2:
    image: confluentinc/cp-kafka:7.4.0
    depends_on:
      - zookeeper
    ports:
      - "9093:9093"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3

  kafka3:
    image: confluentinc/cp-kafka:7.4.0
    depends_on:
      - zookeeper
    ports:
      - "9094:9094"
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9094
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3

Melhores Práticas

Segurança

  • Use imagens oficiais e verificadas
  • Mantenha imagens atualizadas
  • Execute como usuário não-root
  • Escaneie vulnerabilidades
  • Use secrets para dados sensíveis

Performance

  • Otimize camadas do Dockerfile
  • Use .dockerignore
  • Minimize tamanho das imagens
  • Configure limites de recursos
  • Use multi-stage builds

Casos de Uso

  • Microservices: Arquiteturas distribuídas
  • CI/CD: Pipelines de integração contínua
  • Development: Ambientes consistentes
  • Big Data: Processamento distribuído
  • ML/AI: Isolamento de modelos

Vantagens

  • Portabilidade entre ambientes
  • Isolamento de aplicações
  • Eficiência de recursos
  • Facilidade de deployment
  • Ecossistema rico

Desvantagens

  • Curva de aprendizado inicial
  • Overhead de gerenciamento
  • Complexidade em produção
  • Questões de persistência
  • Segurança adicional necessária