Pular para conteúdo

Aula 15 - Docker e Deploy 🐳

Na penúltima aula, vamos aprender a empacotar nossa API para rodar em qualquer ambiente e publicá-la em produção usando Docker.

😊 O Problema: "Na Minha Máquina Funciona"

Diferenças entre ambientes (versão do Java, do banco de dados, configurações de sistema operacional) são uma fonte clássica de bugs difíceis de rastrear. O Docker resolve isso empacotando a aplicação com tudo que ela precisa para rodar.

🧠 Containerizando a Aplicação Spring Boot

Um Dockerfile descreve como construir a imagem da sua aplicação:

FROM eclipse-temurin:17-jre
WORKDIR /app
COPY target/backend-0.0.1.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

📊 Do Código ao Container

graph LR
    A[Código Fonte] -- "mvn package" --> B[arquivo .jar]
    B -- "docker build" --> C[Imagem Docker]
    C -- "docker run" --> D[Container rodando]

💻 Construindo e Rodando o Container

$ mvn clean package
$ docker build -t minha-api .
$ docker run -p 8080:8080 minha-api
$ Started BackendApplication in 2.3 seconds

🧠 Orquestrando com Docker Compose

Aplicações reais geralmente precisam de mais de um container (a API + o banco de dados). O Docker Compose orquestra vários containers juntos:

services:
  api:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: senha

Important

depends_on garante que o container do banco de dados suba antes do container da API tentar se conectar a ele.

🧠 Variáveis de Ambiente e Segredos

Caution

Nunca coloque senhas de banco ou chaves secretas (como a chave do JWT) diretamente no código ou na imagem Docker. Use variáveis de ambiente, injetadas em tempo de execução.

📝 Exercícios Progressivos

  1. Básico: Qual problema o Docker resolve em relação a diferenças entre ambientes?
  2. Básico: O que é um Dockerfile?
  3. Intermediário: Para que serve o Docker Compose, em vez de rodar cada container manualmente?
  4. Intermediário: Por que não devemos colocar a senha do banco de dados diretamente no Dockerfile?
  5. Desafio: Adicione um serviço de pgadmin ao docker-compose.yml para gerenciar visualmente o banco PostgreSQL.

🚀 Mini-projeto: Crie o Dockerfile da sua API e um docker-compose.yml que suba a API junto com um banco PostgreSQL, tudo com um único comando docker compose up.