Plataforma para desenvolver, distribuir e executar aplicações usando containerização
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.
O Docker utiliza uma arquitetura cliente-servidor:
# 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.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
# 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
# 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 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 é amplamente usado em ambientes de Big Data para:
# 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