Aula 15 - Docker e Deploy 🐳
Objetivo
Objetivo: Aprender a "conteinerizar" uma aplicação Go usando Docker, otimizando o tamanho da imagem com Multi-Stage Builds e preparando o ambiente para produção.
1. Por que usar Docker com Go? 🚀
Go gera binários estáticos, o que significa que eles não precisam de um runtime (como Python ou Node) instalado no servidor. O Docker ajuda a empacotar esse binário com suas dependências de sistema e arquivos estáticos, garantindo que o programa rode igual em qualquer lugar.
2. Multi-Stage Builds: O Segredo da Eficiência 🏗️
Como o Go só precisa do binário para rodar, não precisamos levar o compilador para a imagem final. Usamos dois estágios no Dockerfile:
# Estágio 1: Compilação
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o main cmd/main.go
# Estágio 2: Execução (Imagem Final)
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
CMD ["./main"]
Isso reduz uma imagem de 300MB+ para apenas 15MB!
3. Docker Compose: Orquestrando Dependências 🎼
Se sua API precisa de um banco de dados, o docker-compose.yml facilita subir tudo junto.
services:
app:
build: .
ports: ["8080:8080"]
depends_on: [db]
db:
image: postgres:alpine
environment:
POSTGRES_PASSWORD: 123
4. O Fluxo de Deploy (Mermaid) 📊
graph LR
Dev[Dev Code] -->|Push| Git[GitHub/GitLab]
Git -->|CI/CD| Build[Build Docker Image]
Build -->|Push| Registry[Docker Hub/ECR]
Registry -->|Pull| Server[Production Server]
Server -->|Run| Container[Running App]
5. Variáveis de Ambiente e Configuração ⚙️
Nunca coloque senhas no código! Use variáveis de ambiente que o Go lê via os.Getenv e o Docker injeta.
6. Mini-Projeto: API no Container 🚀
Crie um Dockerfile para sua API de livros e:
1. Gere a imagem via terminal.
2. Suba um container mapeando a porta 8080.
3. Acesse a API pelo navegador e verifique se ela responde corretamente.
7. Exercícios de Fixação 🧠
- Para que serve o "Multi-Stage Build" no Dockerfile?
- Qual a vantagem de usar imagens
alpine? - Como você passa uma variável de ambiente para um container Docker via linha de comando?
Próxima Aula: É hora de aplicar tudo no nosso Projeto Final! 🏆🐹