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