Go com Docker: Guia Completo 2026
Aprenda a containerizar aplicações Go com Docker. Multi-stage builds, Dockerfile otimizado, docker-compose e deploy de imagens mínimas.
Go com Docker: Guia Completo 2026
Go e Docker formam uma das duplas mais poderosas do desenvolvimento moderno. Enquanto Go produz binários estáticos e compactos, Docker oferece portabilidade e consistência. O resultado? Imagens de produção com menos de 10MB que rodam em qualquer lugar.
Neste guia, vamos do básico ao avançado: desde o primeiro Dockerfile até um setup de produção completo com Docker Compose, health checks e boas práticas.
Por que Go + Docker Funciona Tão Bem?
Antes de colocar a mão na massa, vale entender por que essa combinação é tão popular:
Go e HashiCorp Vault: Gerenciamento de Segredos
Implemente gerenciamento seguro de segredos com HashiCorp Vault em aplicações Go. Aprenda autenticação, políticas, secrets dinâmicos e integração completa.
Go e HashiCorp Vault: Gerenciamento de Segredos
HashiCorp Vault é a solução líder para gerenciamento de segredos em ambientes cloud-native. Sua integração com Go permite proteger credenciais, APIs keys, certificados e dados sensíveis de forma segura e auditável.
Neste guia completo, você aprenderá a integrar Vault com aplicações Go, implementar padrões de segurança, usar secrets dinâmicos e automatizar rotação de credenciais.
Índice
- Fundamentos do Vault
- Instalação e Configuração
- Cliente Go do Vault
- Autenticação
- Leitura e Escrita de Secrets
- Secrets Dinâmicos
- Rotação Automática
- Padrões de Produção
Fundamentos do Vault
Arquitetura
┌─────────────────────────────────────────────────────────────┐
│ Aplicação Go │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Vault Client Go │ │
│ │ • Autenticação │ │
│ │ • Cache de tokens │ │
│ │ • Renovação automática │ │
│ └─────────────────────────┬───────────────────────────┘ │
└────────────────────────────┼────────────────────────────────┘
│ HTTPS/TLS
▼
┌─────────────────────────────────────────────────────────────┐
│ Vault Server │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Autenticação│ │ Policies │ │ Secret │ │
│ │ Methods │ │ (ACL) │ │ Engines │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Transit │ │ Database │ │ PKI │ │
│ │ (Encryption)│ │ (Dynamic) │ │ (Certificates) │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
Key Features
1. Secrets Estáticos Key-Value store para credenciais, API keys, certificados.
Go e Terraform: Infrastructure as Code com Go
Aprenda a criar providers Terraform personalizados em Go para automatizar sua infraestrutura. Guia completo com exemplos práticos e padrões de produção.
Go e Terraform: Infrastructure as Code com Go
O Terraform revolucionou a forma como gerenciamos infraestrutura, permitindo definir recursos como código. Embora o Terraform use sua própria linguagem de configuração (HCL), a linguagem Go é fundamental para estender suas capacidades através de providers personalizados.
Neste guia completo, você aprenderá a criar providers Terraform em Go, integrar Terraform com aplicações Go, e automatizar infraestrutura usando as melhores práticas de produção.
Índice
- Por que Go e Terraform?
- Arquitetura de Providers Terraform
- Criando seu Primeiro Provider
- Gerenciando Recursos com Go
- Testando Providers
- Integração com Aplicações Go
- Padrões de Produção
- Deploy e Distribuição
Por que Go e Terraform?
Vantagens da Combinação
1. Performance Nativa Providers Terraform são executados como binários nativos, e Go oferece excelente performance com compilação estática.
Go e Kubernetes: Deploy de Containers
Guia completo para fazer deploy de aplicações Go em Kubernetes. Aprenda a containerizar apps Go, criar manifests K8s e implementar health checks.
Go e Kubernetes: Deploy de Containers
Neste guia completo, você aprenderá a fazer deploy de aplicações Go em Kubernetes, desde a containerização até a configuração de health checks e boas práticas de produção. Se você está construindo microserviços ou APIs REST em Go, o Kubernetes é a plataforma ideal para orquestrar seus containers.
Por que Kubernetes para Go?
Go foi projetada para a era dos containers. Sua compilação para binário único, baixo consumo de memória e startup instantâneo tornam aplicações Go perfeitas para Kubernetes:
Go e Docker: Containerização de Aplicações com Multi-Stage Builds
Aprenda a containerizar aplicações Go com Docker. Guia completo de Dockerfiles otimizados, multi-stage builds, Docker Compose para desenvolvimento, boas práticas de produção e segurança. Reduza imagens de 1GB para 15MB.
Go e Docker são uma combinação poderosa. Enquanto aplicações em outras linguagens precisam de runtimes pesados, Go compila para binários nativos que rodam em containers minimalistas de 10-20MB. Neste guia, você vai aprender a criar imagens Docker otimizadas, seguras e prontas para produção.
Por Que Docker com Go?
Vantagens da Combinação
| Aspecto | Go + Docker | Outras Linguagens |
|---|---|---|
| Tamanho da Imagem | 10-50MB | 100MB-1GB+ |
| Tempo de Startup | < 100ms | 1-30 segundos |
| Memory Footprint | 10-50MB | 100MB-1GB |
| Runtime | Nenhum (binário nativo) | JVM, Node, Python |
| Security Surface | Mínima (scratch/alpine) | Grande (SO completo) |
Casos de Uso
- Microserviços: Deploy rápido e escalável
- CI/CD: Builds reproduzíveis
- Desenvolvimento: Ambiente consistente
- Produção: Alta densidade de containers
Dockerfile Básico para Go
O Problema: Dockerfile Inicial
# ❌ NÃO FAÇA ISSO - Imagem gigante (~1GB)
FROM golang:1.21
WORKDIR /app
COPY . .
RUN go build -o main .
CMD ["./main"]
Problemas:
Go Testing: TDD e Integração Contínua - Guia Completo
Aprenda Test-Driven Development (TDD) e CI/CD para Go. Tutorial completo com GitHub Actions, testes automatizados, pipelines e deploy contínuo para projetos Go profissionais.
Test-Driven Development (TDD) e Integração Contínua (CI/CD) são práticas essenciais para desenvolvimento de software profissional. Este guia completo mostra como implementar TDD e pipelines de CI/CD em projetos Go, desde testes unitários até deploy automatizado.
Por Que TDD + CI/CD em Go?
Go é ideal para TDD e CI/CD porque:
- Testes rápidos — Compilação e execução em segundos
- Binário único — Deploy simplificado
- Biblioteca padrão robusta — Sem dependências complexas
- Cross-compilation nativa — Build para múltiplas plataformas
Fundamentos de TDD
O Ciclo Red-Green-Refactor
┌─────────┐ ┌─────────┐ ┌─────────┐
│ RED │ → │ GREEN │ → │ REFACTOR│
│ (Falha)│ │ (Passa) │ │(Melhora)│
└─────────┘ └─────────┘ └─────────┘
↑ │
└──────────────────────────────┘
Exemplo Prático: Calculadora com TDD
Passo 1: Escreva o teste (RED)
Go para Microserviços: Arquitetura e Práticas de Produção
Domine a arquitetura de microserviços em Go. Aprenda padrões de comunicação, service discovery, circuit breakers, distributed tracing e estratégias de deploy com exemplos práticos.
Microserviços transformaram a forma como desenvolvemos sistemas escaláveis. Go é a linguagem preferida para microserviços em empresas como Netflix, Uber, e Kubernetes. Neste guia completo, você aprenderá a arquitetar, construir e operar microserviços robustos em Go.
Por Que Go é Perfeito para Microserviços
O Match Perfeito
┌─────────────────────────────────────────────────────────────────┐
│ MICROSERVIÇO │ GO │
├─────────────────────────────────────────────────────────────────┤
│ Leve e rápido │ Binário único, startup < 100ms │
├─────────────────────────────────────────────────────────────────┤
│ Escalável │ Goroutines (milhões simultâneas) │
├─────────────────────────────────────────────────────────────────┤
│ Confiável │ Tipagem forte, sem runtime pesado │
├─────────────────────────────────────────────────────────────────┤
│ Eficiente │ Memória mínima (10-50MB por serviço) │
├─────────────────────────────────────────────────────────────────┤
│ Portátil │ Cross-compile, Docker nativo │
├─────────────────────────────────────────────────────────────────┤
│ Simples │ Código explícito, fácil manutenção │
└─────────────────────────────────────────────────────────────────┘
Comparação com Outras Linguagens
| Aspecto | Go | Java | Node.js | Python |
|---|---|---|---|---|
| Startup | ~50ms | ~5s | ~2s | ~1s |
| Memória | 10-50MB | 200-500MB | 100-300MB | 150-400MB |
| Concorrência | Nativa | Threads pesadas | Callbacks | GIL limita |
| Binário | Único | JVM necessária | Node runtime | Interpreter |
| Performance | Nativa | Boa (JIT) | Média | Lenta |
Arquitetura de um Microserviço Go
Estrutura de Projeto Recomendada
order-service/
├── cmd/
│ └── api/
│ └── main.go # Entry point
├── internal/
│ ├── domain/
│ │ ├── order.go # Entidades
│ │ └── errors.go # Erros de domínio
│ ├── application/
│ │ ├── service.go # Lógica de negócio
│ │ └── dto.go # Data Transfer Objects
│ ├── infrastructure/
│ │ ├── http/
│ │ │ ├── handler.go # HTTP handlers
│ │ │ ├── router.go # Configuração de rotas
│ │ │ └── middleware.go # Middlewares
│ │ ├── persistence/
│ │ │ ├── postgres.go # Implementação do repo
│ │ │ └── redis.go # Cache
│ │ └── messaging/
│ │ └── kafka.go # Event publisher
│ └── config/
│ └── config.go # Configurações
├── pkg/
│ └── logger/ # Shared packages
├── api/
│ └── proto/ # Protocol Buffers
├── deployments/
│ ├── docker/
│ └── k8s/
├── go.mod
└── Makefile
Implementação Completa
// internal/domain/order.go
package domain
import (
"errors"
"time"
)
var (
ErrInvalidAmount = errors.New("valor do pedido inválido")
ErrOrderNotFound = errors.New("pedido não encontrado")
)
type Order struct {
ID string `json:"id"`
UserID string `json:"user_id"`
Items []Item `json:"items"`
Total float64 `json:"total"`
Status Status `json:"status"`
CreatedAt time.Time `json:"created_at"`
}
type Item struct {
ProductID string `json:"product_id"`
Quantity int `json:"quantity"`
Price float64 `json:"price"`
}
type Status string
const (
StatusPending Status = "PENDING"
StatusPaid Status = "PAID"
StatusShipped Status = "SHIPPED"
StatusDelivered Status = "DELIVERED"
)
func (o *Order) CalculateTotal() {
var total float64
for _, item := range o.Items {
total += item.Price * float64(item.Quantity)
}
o.Total = total
}
func (o *Order) Validate() error {
if o.Total <= 0 {
return ErrInvalidAmount
}
return nil
}
// internal/application/service.go
package application
import (
"context"
"fmt"
"time"
"order-service/internal/domain"
)
// Portas (interfaces) para dependências
type OrderRepository interface {
Save(ctx context.Context, order *domain.Order) error
GetByID(ctx context.Context, id string) (*domain.Order, error)
Update(ctx context.Context, order *domain.Order) error
}
type PaymentService interface {
Process(ctx context.Context, orderID string, amount float64) error
}
type EventPublisher interface {
PublishOrderCreated(ctx context.Context, order *domain.Order) error
}
type OrderService struct {
repo OrderRepository
payment PaymentService
publisher EventPublisher
}
func NewOrderService(
repo OrderRepository,
payment PaymentService,
publisher EventPublisher,
) *OrderService {
return &OrderService{
repo: repo,
payment: payment,
publisher: publisher,
}
}
func (s *OrderService) CreateOrder(ctx context.Context, userID string, items []domain.Item) (*domain.Order, error) {
order := &domain.Order{
ID: generateID(),
UserID: userID,
Items: items,
Status: domain.StatusPending,
CreatedAt: time.Now(),
}
order.CalculateTotal()
if err := order.Validate(); err != nil {
return nil, err
}
// Salvar no banco
if err := s.repo.Save(ctx, order); err != nil {
return nil, fmt.Errorf("falha ao salvar pedido: %w", err)
}
// Publicar evento assíncrono
go func() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
s.publisher.PublishOrderCreated(ctx, order)
}()
return order, nil
}
func (s *OrderService) ProcessPayment(ctx context.Context, orderID string) error {
order, err := s.repo.GetByID(ctx, orderID)
if err != nil {
return err
}
if err := s.payment.Process(ctx, orderID, order.Total); err != nil {
return fmt.Errorf("pagamento falhou: %w", err)
}
order.Status = domain.StatusPaid
return s.repo.Update(ctx, order)
}
func generateID() string {
return fmt.Sprintf("ORD-%d", time.Now().UnixNano())
}
Padrões de Comunicação
1. Síncrono: HTTP REST
Já coberto no guia de APIs REST. Para microserviços, adicione: