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:

Ler mais →

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

  1. Fundamentos do Vault
  2. Instalação e Configuração
  3. Cliente Go do Vault
  4. Autenticação
  5. Leitura e Escrita de Secrets
  6. Secrets Dinâmicos
  7. Rotação Automática
  8. 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.

Ler mais →

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

  1. Por que Go e Terraform?
  2. Arquitetura de Providers Terraform
  3. Criando seu Primeiro Provider
  4. Gerenciando Recursos com Go
  5. Testando Providers
  6. Integração com Aplicações Go
  7. Padrões de Produção
  8. 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.

Ler mais →

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:

Ler mais →

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

AspectoGo + DockerOutras Linguagens
Tamanho da Imagem10-50MB100MB-1GB+
Tempo de Startup< 100ms1-30 segundos
Memory Footprint10-50MB100MB-1GB
RuntimeNenhum (binário nativo)JVM, Node, Python
Security SurfaceMí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:

Ler mais →

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)

Ler mais →

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

AspectoGoJavaNode.jsPython
Startup~50ms~5s~2s~1s
Memória10-50MB200-500MB100-300MB150-400MB
ConcorrênciaNativaThreads pesadasCallbacksGIL limita
BinárioÚnicoJVM necessáriaNode runtimeInterpreter
PerformanceNativaBoa (JIT)MédiaLenta

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:

Ler mais →