Containerização de Aplicações Spring Boot com Docker: Implementação Prática de Microsserviços

Introdução ao Container com Docker

Docker é uma ferramenta fundamental para o deploy de microsserviços, proporcionando portabilidade e escalabilidade. Aqui, exploraremos como containerizar uma aplicação Spring Boot, partindo do zero até um ambiente de produção.

Vantagens do Uso de Docker

  • Consistência Ambiental: Elimina discrepâncias entre desenvolvimento, teste e produção.
  • Deploy Ágil: Inicialização e escalonamento em segundos.
  • Isolamento de Recursos: Cada contêiner opera de forma independente.
  • Integração com CI/CD: Compatível com ferramentas como GitLab CI e CircleCI.

Configuração do Projeto Spring Boot

Configure o arquivo de build do Maven para empacotar a aplicação como um JAR executável.

<!-- configuração no pom.xml -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>3.2.0</version>
        </plugin>
    </plugins>
</build>

Execute o comando de build para gerar o pacote:

mvn clean package -DskipTests
# Resultado: target/service-app-2.0.0.jar

Elaboração do Dockerfile

Crie um Dockerfile usando uma abordagem simples e, em seguida, uma versão otimizada com múltiplas etapas de construção.

# Versão básica
FROM amazoncorretto:17-alpine
WORKDIR /app
COPY target/service-app-2.0.0.jar application.jar
EXPOSE 8080
CMD ["java", "-jar", "application.jar"]

# Versão com build multi-stage (recomendada)
FROM maven:3.8.8-eclipse-temurin-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:resolve
COPY src ./src
RUN mvn package -DskipTests

FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /build/target/service-app-2.0.0.jar application.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "application.jar"]

Construção e Execução do Contêiner

Construa a imagem Docker e execute o contêiner com variáveis de ambiente.

# Construção da imagem
docker build -t service-app:2.0.0 .

# Inicialização do contêiner
docker run -d --name my-service -p 9090:8080 \
  -e SPRING_PROFILES_ACTIVE=production \
  -e JAVA_OPTS="-Xms512m -Xmx1024m" \
  service-app:2.0.0

# Monitoramento de logs
docker logs -f my-service

# Acesso ao terminal do contêiner
docker exec -it my-service sh

Orquestração com Docker Compose

Defina um arquivo de composição para gerenciar múltiplos serviços.

# docker-compose.yml
version: "3.9"
services:
  web-service:
    build: .
    ports:
      - "9090:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=production
      - SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/appdb
    depends_on:
      database:
        condition: service_healthy
    restart: on-failure

  database:
    image: mysql:8.0.36
    environment:
      - MYSQL_ROOT_PASSWORD=securePassword
      - MYSQL_DATABASE=appdb
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 15s
      retries: 3

  cache-service:
    image: redis:7.2-alpine
    ports:
      - "6379:6379"

volumes:
  db_data:

# Comando para iniciar os serviços
docker compose up -d

Técnicas de Otimização de Imagens

Implemente práticas para reduzir o tamanho da imagem e melhorar a segurança.

# 1. Crie um arquivo .dockerignore
.git
.mvn
target
test

# 2. Configure um usuário não-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# 3. Comparação de tamanhos de imagens base
# amazoncorretto:17 = ~300MB
# eclipse-temurin:17-jre-alpine = ~85MB
# Economia de aproximadamente 72%

Comandos Essenciais do Docker

Referência rápida para operações comuns.

docker images -a

docker ps --all

docker logs --follow my-service

docker stats

Tags: Docker spring-boot maven docker-compose java

Publicado em 6-20 01:09