tech19 min de leitura

Docker e Kubernetes: Guia Completo para Iniciantes em 2026

Luiz Leno

Luiz Leno

Especialista em Automação • 25 de maio de 2026

Introdução ao Ecossistema de Contêineres

Em 2026, a corrida pela transformação digital é vencida por quem domina a orquestração de contêineres. Docker e Kubernetes deixaram de ser novidade e se consolidaram como o sistema operacional da nuvem. Segundo o relatório anual da CNCF (Cloud Native Computing Foundation), 98% das organizações adotaram tecnologias cloud native, e 82% dos usuários de contêineres executam Kubernetes em produção. O maior desafio, no entanto, não é mais técnico: 47% das empresas citam a mudança cultural como a principal barreira. Este guia foi criado para encurtar essa curva de aprendizado, fornecendo uma base sólida e atualizada com as práticas de 2026.

O que são contêineres e por que eles dominam?

Contêineres são unidades leves e portáteis que empacotam uma aplicação com todas as suas dependências (bibliotecas, runtime, configurações). Diferente das máquinas virtuais (VMs), que virtualizam o hardware e carregam um sistema operacional completo, os contêineres compartilham o kernel do host e isolam processos em nível de sistema operacional. Isso resulta em:

  • Inicialização em segundos: enquanto uma VM pode levar minutos para iniciar, um contêiner sobe em milissegundos.
  • Tamanho reduzido: imagens de contêiner têm megabytes, contra gigabytes de VMs.
  • Portabilidade: uma imagem construída no laptop do desenvolvedor roda exatamente igual no servidor de produção, no data center on-premises e em qualquer nuvem pública.
  • O problema que Docker e Kubernetes resolvem

  • Docker padronizou o empacotamento e a execução de contêineres. Com ele, você cria imagens, sobe ambientes locais e gerencia o ciclo de vida de contêineres em uma única máquina.
  • Kubernetes (ou K8s) orquestra milhares de contêineres distribuídos em um cluster de servidores. Ele resolve problemas de escalabilidade, alta disponibilidade, balanceamento de carga, atualizações sem downtime e gerenciamento de configurações.
  • Tendências recentes (2026)

  • Edge computing com K3s: clusters Kubernetes leves rodando em dispositivos IoT e na borda da rede.
  • Serverless em contêineres: plataformas como Knative e AWS Fargate abstraem a infraestrutura, permitindo executar funções serverless em contêineres sem gerenciar nós.
  • Kubernetes nativo em cloud providers: EKS (AWS), AKS (Azure) e GKE (Google) são hoje serviços gerenciados maduros que eliminaram a complexidade operacional do control plane.
  • Fundamentos do Docker: Imagens, Contêineres e Dockerfile

    Imagem vs Contêiner

    Uma imagem é um template imutável e somente leitura, composto por camadas (layers) empilhadas. Cada camada representa uma instrução do Dockerfile. O contêiner é uma instância executável da imagem, com uma camada adicional de leitura e escrita (writable layer) que persiste enquanto o contêiner existir. Essa arquitetura de camadas permite cache inteligente: se uma camada não mudou, o Docker reutiliza a versão em cache, acelerando builds.

    Estrutura de um Dockerfile

    dockerfile código
    # Dockerfile otimizado para Python 3.12 em produção
    FROM python:3.12-slim AS builder
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    
    FROM python:3.12-slim
    WORKDIR /app
    COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
    COPY . .
    USER 1001
    EXPOSE 8000
    CMD ["python", "app.py"]

    Boas práticas:

  • Use FROM alpine ou slim para reduzir o tamanho da imagem (imagens Ubuntu de 1.2 GB são evitadas em 2026).
  • Multi-stage builds: como no exemplo, separa o build da execução para não carregar ferramentas de compilação.
  • Non-root user: a instrução USER 1001 evita que o contêiner rode como root, mitigando riscos de escalonamento de privilégios.
  • Comandos essenciais do Docker

    | Comando | Descrição | |--------|-----------| | docker build -t minha-app:1.0 . | Constrói a imagem a partir do Dockerfile | | docker run -d -p 8080:8000 --name app minha-app:1.0 | Executa o contêiner em background, mapeando porta | | docker ps | Lista contêineres em execução | | docker images | Lista imagens locais | | docker exec -it app bash | Acessa o terminal do contêiner em execução | | docker logs app | Exibe logs do contêiner | | docker push user/minha-app:1.0 | Envia a imagem para um registry |

    Docker Compose para ambientes multi-contêiner

    O Docker Compose permite definir e gerenciar múltiplos contêineres com um único arquivo YAML. Exemplo de docker-compose.yml para uma aplicação web com banco PostgreSQL:

    yaml código
    version: '3.8'
    services:
      web:
        build: .
        ports:
          - "8000:8000"
        environment:
          - DATABASE_URL=postgresql://user:pass@db:5432/mydb
        depends_on:
          - db
      db:
        image: postgres:16-alpine
        environment:
          POSTGRES_USER: user
          POSTGRES_PASSWORD: pass
        volumes:
          - pgdata:/var/lib/postgresql/data
    
    volumes:
      pgdata:

    Execute com docker compose up -d para subir tudo. Para desenvolvimento local, Compose é a ferramenta ideal. Para produção com Kubernetes, usamos Helm.

    Registries e versionamento de imagens

    Registries armazenam e distribuem imagens. Os principais em 2026:

  • Docker Hub: público gratuito com limites de pull rate.
  • Amazon ECR, Google GCR, Azure ACR: integrados aos cloud providers.
  • Harbor: open source, com scanning de vulnerabilidades e suporte a OCI.
  • Versionamento por tags: app:1.0, app:latest, app:sha-abc123. Evite latest em produção; use tags semânticas ou SHA do commit.

    Introdução ao Kubernetes: Arquitetura e Componentes Principais

    Arquitetura Master-Worker

    O Kubernetes é um sistema declarativo. Você declara o estado desejado em arquivos YAML, e o cluster trabalha constantemente para reconciliar a realidade com esse estado — esse é o reconciliation loop.

    Componentes do Control Plane (master):

  • API Server: porta de entrada para todas as requisições (kubectl, UI, automação).
  • Scheduler: decide em qual worker node um Pod será executado, baseado em recursos disponíveis e restrições.
  • Controller Manager: roda controladores que observam objetos e tomam ações corretivas (ex: Deployment controller, Node controller).
  • etcd: banco chave-valor distribuído que armazena todo o estado do cluster.
  • Componentes dos Worker Nodes:

  • kubelet: agente que garante que os contêineres estejam rodando conforme o manifesto.
  • kube-proxy: gerencia as regras de rede e balanceamento de carga dos Services.
  • Container runtime: em 2026, o padrão é containerd (Docker deixou de ser runtime nativo do Kubernetes, mas ainda é usado em desenvolvimento). CRI-O é alternativa popular no OpenShift.
  • Principais recursos (objetos do Kubernetes)

    | Objeto | Função | |--------|--------| | Pod | Menor unidade de computação: um ou mais contêineres que compartilham rede e armazenamento. | | Deployment | Gerencia um conjunto de réplicas de Pods, com suporte a rolling updates e rollbacks. | | Service | Abstrai um conjunto de Pods e fornece um endpoint estável (ClusterIP, NodePort, LoadBalancer). | | ConfigMap | Injeta configurações (variáveis de ambiente, arquivos) sem reconstruir a imagem. | | Secret | Similar ao ConfigMap, mas para dados sensíveis (senhas, tokens). Atenção: Secrets são apenas base64, não criptografia real sem configuração adicional. | | Volume | Monta armazenamento efêmero ou persistente dentro do Pod. | | Namespace | Isola recursos dentro do cluster (útil para ambientes dev/staging/prod). |

    Escalabilidade e atualizações

  • ReplicaSet: garante que um número específico de réplicas de Pods esteja rodando. O Deployment gerencia o ReplicaSet.
  • Rolling Update: atualiza gradualmente os Pods para uma nova versão sem downtime. Controlado pelos parâmetros maxSurge e maxUnavailable.
  • Rollback: se a nova versão falhar, kubectl rollout undo deployment/meu-app reverte para o estado anterior.
  • Exposição externa: Ingress (congelado) e Gateway API (padrão 2026)

    Até 2025, o Ingress era o padrão para expor serviços HTTP/HTTPS externamente. Em março de 2026, o repositório ingress-nginx foi arquivado (read-only) devido ao CVE-2025-1974 (IngressNightmare, CVSS 9.8). O Ingress tradicional não receberá mais patches de segurança.

    O substituto oficial é o Gateway API, maduro desde a versão 1.2+. Ele separa as responsabilidades de infraestrutura (GatewayClass, Gateway) e aplicação (HTTPRoute). Exemplo com Envoy Gateway:

    yaml código
    apiVersion: gateway.networking.k8s.io/v1
    kind: GatewayClass
    metadata:
      name: eg
    spec:
      controllerName: gateway.envoyproxy.io/gatewayclass-controller
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: meu-gateway
    spec:
      gatewayClassName: eg
      listeners:
        - name: http
          protocol: HTTP
          port: 80
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: minha-app
    spec:
      parentRefs:
        - name: meu-gateway
      rules:
        - matches:
            - path:
                type: PathPrefix
                value: /
          backendRefs:
            - name: meu-service
              port: 80

    A ferramenta ingress2gateway v1.0 (lançada em março de 2026) ajuda na migração automática de centenas de annotations.

    Clusters locais e gerenciados

  • Minikube: cluster single-node para desenvolvimento local (recomendado para iniciantes).
  • Kind: Kubernetes in Docker, rápido para testes em CI/CD.
  • EKS/AKS/GKE: clusters gerenciados pelos cloud providers, que cuidam do control plane.
  • Integração Docker e Kubernetes na Prática

    Exportando imagens para o cluster

    1. Construa a imagem com Docker: docker build -t meu-app:1.0 . 2. Faça push para um registry: docker push meu-registry.io/meu-app:1.0 3. Referencie a imagem no manifesto do Pod/Deployment.

    Criando um Deployment e Service

    yaml código
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: meu-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: meu-app
      template:
        metadata:
          labels:
            app: meu-app
        spec:
          containers:
            - name: app
              image: meu-registry.io/meu-app:1.0
              ports:
                - containerPort: 8000
              resources:
                requests:
                  memory: "128Mi"
                  cpu: "250m"
                limits:
                  memory: "256Mi"
                  cpu: "500m"
              livenessProbe:
                httpGet:
                  path: /health
                  port: 8000
                initialDelaySeconds: 10
                periodSeconds: 10
              readinessProbe:
                httpGet:
                  path: /ready
                  port: 8000
                initialDelaySeconds: 5
                periodSeconds: 5
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: meu-service
    spec:
      selector:
        app: meu-app
      ports:
        - port: 80
          targetPort: 8000
      type: LoadBalancer

    Aplique com kubectl apply -f deployment.yaml.

    ConfigMaps e Secrets

    ConfigMap para configurações não sensíveis:

    yaml código
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: app-config
    data:
      APP_ENV: production
      DB_HOST: localhost

    Secret para dados sensíveis (lembre-se: base64 não é segurança; use criptografia com KMS e etcd encryption):

    yaml código
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-password
    type: Opaque
    data:
      password: cGFzc3dvcmQxMjM=

    Referencie no Pod:

    yaml código
    env:
      - name: DB_PASSWORD
        valueFrom:
          secretKeyRef:
            name: db-password
            key: password

    Volumes compartilhados

  • emptyDir: volume efêmero que vive com o Pod, usado para compartilhar dados entre contêineres.
  • hostPath: monta um diretório do nó host (cuidado com segurança).
  • PersistentVolumeClaim (PVC): solicitação de armazenamento persistente, gerenciado pelo cluster (EBS em AWS, disk em GCP).
  • Docker Compose vs Helm

  • Docker Compose: ideal para desenvolvimento local em uma única máquina. Simples e rápido.
  • Helm: gerenciador de pacotes para Kubernetes. Usa Charts (pacotes de manifests YAML parametrizáveis com values.yaml). Em 2026, OCI registries são o padrão para distribuição de Charts.
  • Exemplo de instalação com Helm:

    bash código
    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm install meu-release bitnami/nginx --values values.yaml

    Orquestração e Gerenciamento do Ciclo de Vida

    Comandos kubectl essenciais

    | Comando | Descrição | |---------|-----------| | kubectl get pods | Lista Pods | | kubectl describe pod <nome> | Detalhes do Pod (eventos, condições) | | kubectl logs <pod> | Logs do contêiner | | kubectl exec -it <pod> -- bash | Acesso ao shell | | kubectl top pods | Métricas de CPU/memória (requer Metrics Server) | | kubectl rollout status deployment/meu-app | Status da atualização |

    Health checks: probes

    Configurar probes corretamente é crítico para evitar downtime. Em 2026, o Kubernetes suporta três tipos:

  • Liveness probe: "Este container está vivo ou precisa ser reiniciado?" Usado para detectar deadlocks ou loops infinitos.
  • Readiness probe: "Este container está pronto para receber tráfego?" Aguarda inicialização do banco, cache, etc.
  • Startup probe: Introduzido para apps com inicialização lenta. Enquanto a startup probe não passa, a liveness probe fica desabilitada.
  • Erro comum: readiness que apenas checa a porta (TCP) pode dar falso positivo — a aplicação pode estar ouvindo, mas ainda não pronta para servir requisições. Sempre use endpoints HTTP com lógica real.

    Auto-scaling horizontal (HPA)

    O Horizontal Pod Autoscaler ajusta dinamicamente o número de réplicas baseado em métricas:

    yaml código
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: meu-app-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: meu-app
      minReplicas: 2
      maxReplicas: 10
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 70
        - type: Resource
          resource:
            name: memory
            target:
              type: Utilization
              averageUtilization: 80

    Atualizações sem downtime: RollingUpdate vs Canary

    RollingUpdate (padrão): substitui Pods gradualmente. Parâmetros importantes:

  • maxSurge: quantos Pods extras podem ser criados durante a atualização (padrão 25%).
  • maxUnavailable: quantos Pods podem ficar indisponíveis (padrão 25%).
  • Canary deployment: uma nova versão recebe uma pequena parcela do tráfego antes de ser promovida. Ferramentas como Argo Rollouts e Flagger facilitam esse processo, integrando-se ao Service Mesh (Istio, Linkerd) ou ao Gateway API.

    Gerenciamento de recursos: requests e limits

    Declarar resources.requests e resources.limits é obrigatório em produção. Eles definem:

  • Requests: quantidade mínima garantida para o Pod. O Scheduler usa requests para alocar nós.
  • Limits: teto máximo que o Pod pode usar. Se excedido, o Pod pode ser throttled (CPU) ou morto (memory - OOMKilled).
  • A relação entre requests e limits define a Quality of Service (QoS):

    | QoS Class | Requests = Limits? | Prioridade | |-----------|-------------------|------------| | Guaranteed | Sim, para CPU e memória | Mais alta | | Burstable | Pelo menos um request < limit | Média | | BestEffort | Nenhum request ou limit | Mais baixa (primeiro a ser morto) |

    Prática recomendada: defina requests baseados em uso real (medido com kubectl top), e limits 50-100% acima para permitir picos.

    Melhores Práticas e Observabilidade em 2026

    Segurança prática

  • Image scanning: use Trivy ou Snyk no pipeline CI/CD. Exemplo com GitHub Actions:
  • yaml código
      - name: Scan image with Trivy
        run: |
          trivy image minha-app:1.0 --severity HIGH,CRITICAL
  • Assinatura de imagens: com Cosign (Sigstore), garanta a integridade e proveniência das imagens.
  • bash código
      cosign sign --key cosign.key minha-app:1.0
  • Pod Security Standards: aplique o nível restricted para workloads de produção:
  • yaml código
      apiVersion: v1
      kind: Namespace
      metadata:
        labels:
          pod-security.kubernetes.io/enforce: restricted
  • NetworkPolicy: por padrão, qualquer Pod consegue falar com qualquer Pod. Isole com:
  • yaml código
      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: allow-frontend
        namespace: app
      spec:
        podSelector:
          matchLabels:
            role: db
        ingress:
          - from:
              - podSelector:
                  matchLabels:
                    role: backend
  • Secrets não são criptografados: por padrão, Secrets são armazenados em etcd como base64. Para segurança real, habilite encryption at rest com KMS.
  • Observabilidade: logs, métricas e tracing

  • Prometheus + Grafana: stack padrão para métricas. Instale com Helm:
  • bash código
      helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
      helm install prometheus prometheus-community/kube-prometheus-stack
  • Loki: logs centralizados, semelhante ao Prometheus mas para logs. Exporte logs no formato JSON estruturado.
  • OpenTelemetry: padrão para tracing distribuído. Instrumente sua aplicação (SDK para Go, Python, Java, etc.) e configure o collector.
  • Service Mesh (Istio, Linkerd)

    Service Mesh fornece mTLS automático, balanceamento de carga inteligente, tracing e políticas de tráfego sem alterar o código da aplicação. Em 2026, Cilium (baseado em eBPF) ganha força como alternativa sem sidecar, oferecendo alta performance.

    GitOps: o padrão de deployment em 2026

    GitOps usa Git como única fonte da verdade. Um operador dentro do cluster (ArgoCD ou Flux) monitora o repositório e reconcilia o estado real com o desejado. Benefícios:

  • Auditoria completa: cada mudança é um commit.
  • Rollback automático: reverta o commit que introduziu o bug.
  • Progressive delivery: canary, blue-green com Argo Rollouts.
  • 73% dos times de DevOps adotam GitOps em 2026. Exemplo de aplicação com ArgoCD:

    bash código
    argocd app create meu-app --repo https://github.com/user/meu-app.git --path k8s --dest-server https://kubernetes.default.svc

    FinOps: otimização de custos

    Clusters Kubernetes mal configurados geram desperdício. Práticas:

  • Right-sizing: ajuste requests e limits com base em métricas reais.
  • Karpenter: auto-scaling inteligente de nós, substituindo o Cluster Autoscaler tradicional, reduzindo custos em 30-40%.
  • Spot Instances: use instâncias preemptíveis (EC2 Spot, GCP Preemptible) para workloads não-críticos.
  • Hibernação de ambientes não-produtivos: desligue clusters dev/staging fora do horário comercial.
  • Conclusão e Próximos Passos

    Você percorreu um longo caminho: do Dockerfile ao GitOps em um cluster Kubernetes atualizado para 2026. Recapitulando:

  • Docker resolve o problema de empacotamento e execução local de contêineres.
  • Kubernetes orquestra esses contêineres em escala, com auto-reparação, escalabilidade e atualizações sem downtime.
  • Segurança, observabilidade e GitOps são requisitos fundamentais, não opcionais, para qualquer ambiente de produção.
  • Roteiro de estudos práticos

    1. Monte um cluster local com Minikube ou Kind. 2. Coloque em prática os exemplos deste artigo: crie um Deployment, exponha com Gateway API, configure probes e HPA. 3. Estude certificações: CKA (Certified Kubernetes Administrator) e CKAD (Certified Kubernetes Application Developer) são as mais reconhecidas. 4. Explore projetos open source: contribua com documentação, corrija bugs ou crie Charts Helm. 5. Acompanhe a comunidade: CNCF (cncf.io), Kubernetes Slack (slack.k8s.io) e fóruns do Docker.

    Próximo nível

  • Service Mesh: implemente Istio ou Cilium para segurança e observabilidade avançadas.
  • GitOps: configure ArgoCD e automatize deploys com Git.
  • Kubernetes nativo da borda: experimente K3s em um Raspberry Pi.
  • O conteúdo completo deste guia, com todos os YAMLs e comandos, está disponível em um repositório GitHub (exemplo: github.com/exemplo/guia-docker-k8s-2026). Clone, modifique, quebre e aprenda. A melhor maneira de dominar contêineres é colocar a mão no código.

    Perguntas Frequentes

    Qual a diferença entre Docker e Kubernetes?expand_more
    Docker é uma plataforma para criar, executar e gerenciar contêineres em uma única máquina. Kubernetes é um orquestrador que gerencia centenas ou milhares de contêineres em um cluster de servidores, oferecendo escalabilidade, alta disponibilidade e auto-reparação. Eles são complementares: Docker empacota a aplicação, Kubernetes a executa em produção.
    O que é um Pod no Kubernetes?expand_more
    Um Pod é a menor unidade de computação no Kubernetes. Ele encapsula um ou mais contêineres que compartilham o mesmo namespace de rede e armazenamento. Na prática, a maioria dos Pods contém um único contêiner, mas padrões como sidecar colocam contêineres auxiliares no mesmo Pod para logging, proxy ou monitoramento.
    Como expor uma aplicação Kubernetes externamente em 2026?expand_more
    O padrão atual é o Gateway API, que substituiu o Ingress (aposentado em março de 2026). Você define um Gateway (ponto de entrada) e HTTPRoutes (regras de roteamento). Implementações como Envoy Gateway, NGINX Gateway Fabric e Cilium são compatíveis. Para ambientes cloud, Services tipo LoadBalancer também funcionam.
    O que são liveness, readiness e startup probes?expand_more
    São health checks que o kubelet executa periodicamente no contêiner. Liveness probe decide se o contêiner deve ser reiniciado (deadlock). Readiness probe decide se o contêiner recebe tráfego (aguarda inicialização). Startup probe desabilita a liveness durante a inicialização lenta, evitando reinícios desnecessários.
    O que é GitOps e por que é importante em 2026?expand_more
    GitOps é uma metodologia que usa Git como fonte única da verdade para a configuração do cluster. Ferramentas como ArgoCD e Flux monitoram o repositório e automaticamente reconciliam o estado do cluster com o que está no Git. Isso garante auditoria, rollback rápido e deploys seguros. Em 2026, 73% dos times de DevOps adotam GitOps.
    Luiz Leno

    Luiz Leno

    Luiz Leno é especialista em automações corporativas inteligentes e inteligência artificial empresarial. Ajuda empresas B2B a otimizarem seus processos de atendimento e vendas utilizando tecnologia autônoma de ponta.