Integración de Spring Boot con Docker: de cero a producción

En el desarrollo backend moderno, ya no basta con que una aplicación funcione en tu máquina.
Aroa Nieto Rodríguez | Mario Rodrigo Marcos | Julia García Vega
uXcale Backend and APIs Developers

Hoy, es indispensable que las soluciones puedan desplegarse de forma rápida, consistente y escalable, sin importar si se ejecutan en tu ordenador, un servidor local o en la nube. Aquí es donde la combinación de Spring Boot y Docker se vuelve especialmente útil.

Este artículo muestra cómo empaquetar tu aplicación Spring Boot en un contenedor Docker, cómo orquestarla con docker-compose y qué buenas prácticas debes considerar para llevarla a producción con confianza.

Web Page visualization. Protocol procedure. Dynamic software workflow. Full Stack development, markup, administrate system. Driver for shared memory. Vector isolated concept metaphor illustration.

¿Por qué Docker junto a Spring Boot?

Spring Boot ofrece una plataforma sólida para construir servicios backend. Pero cuando se trata de empaquetar, desplegar y escalar aplicaciones, surgen los desafíos habituales: entornos inconsistentes, configuraciones difíciles de replicar, dependencias que fallan según el entorno.

Docker permite encapsular tu aplicación en un contenedor autocontenible que se comporta de la misma forma en cualquier sistema. Junto a Spring Boot, esta combinación resuelve los problemas habituales del despliegue tradicional, facilitando la entrega continua y la operación estable en cualquier entorno.

1. Preparar tu aplicación Spring Boot

Supongamos que tienes una aplicación backend con Spring Boot, por ejemplo una API REST para gestión de tareas. La estructura básica del proyecto es la siguiente:

/mi-app├── src/├── pom.xml

Usando Maven o Gradle, compila tu aplicación para generar un archivo .jar ejecutable. Con Maven:

./mvnw clean package

Esto generará un archivo como target/mi-app-0.0.1-SNAPSHOT.jar, que contiene todo lo necesario para ejecutar la app.

2. Crear el Dockerfile

El Dockerfile define los pasos para construir la imagen que contendrá tu aplicación. Un ejemplo funcional y eficiente podría verse así:

eclipse-temurin:17-jdk-alpineWORKDIR /appCOPY target/mi-app-0.0.1-SNAPSHOT.jar app.jarENTRYPOINT ["java", "-jar", "app.jar"]

Esta configuración usa una imagen base, copia tu .jar compilado, y establece el comando de ejecución. Es una base estable y segura para producción.

Construir la imagen y ejecutar el contenedor

Desde la raíz del proyecto, construye la imagen:

docker build -t miapp-springboot .

Y luego ejecútala en el puerto 8080:

docker run -p 8080:8080 miapp-springboot

La aplicación ya está en funcionamiento dentro de un contenedor, aislada de tu sistema operativo, con el entorno exacto que definiste en la imagen.

Orquestar servicios con Docker Compose

En aplicaciones reales, es común depender de otros servicios como bases de datos. docker-compose permite levantar múltiples contenedores con una sola instrucción.

Un archivo docker-compose.yml típico para una app con PostgreSQL puede verse así:

'3.8' services:app:build: .ports:- "8080:8080"depends_on:- dbenvironment:- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb- SPRING_DATASOURCE_USERNAME=postgres- SPRING_DATASOURCE_PASSWORD=secretdb:image: postgres:15environment:POSTGRES_DB: mydbPOSTGRES_USER: postgresPOSTGRES_PASSWORD: secretvolumes:- dbdata:/var/lib/postgresql/datavolumes:dbdata: 

Con este archivo, levantar tu entorno completo es tan simple como:

docker-compose up --build

Ideal para desarrollo local, pruebas de integración y flujos CI.

Recomendaciones para entornos productivos

Contenerizar una aplicación es solo el primer paso. Para que tu servicio esté listo para producción, conviene aplicar varias buenas prácticas:

Optimizar la imagen
Usa imágenes livianas como Alpine o distroless. Evita instalar herramientas innecesarias. Escanea tus imágenes regularmente con herramientas como Trivy.

Separar configuración del código
Nunca incluyas credenciales en el repositorio ni en el Dockerfile. Usa variables de entorno y perfiles como application-prod.yml para ajustar comportamiento según el entorno.

Monitoreo y puntos de salud
Agrega spring-boot-starter-actuator para exponer métricas, health checks y endpoints de información. Esto facilita la integración con orquestadores como Kubernetes y plataformas de monitoreo.

Automatizar el despliegue
Una vez que la imagen está lista, puedes publicarla en un container registry y automatizar el despliegue mediante pipelines CI/CD. Por ejemplo:

docker tag miapp-springboot registry.miempresa.com/miapp:latestdocker 
docker push registry.miempresa.com/miapp:latest

A partir de ahí, puede ser desplegada en servicios como AWS ECS, Google Cloud Run, Azure Container Apps o clústeres Kubernetes.

Para finalizar

Adoptar Docker en proyectos con Spring Boot no es solo una mejora técnica: es un cambio estructural en la forma en que desarrollamos, probamos y desplegamos software. Al encapsular tu aplicación en contenedores, eliminás incertidumbres, ganás portabilidad y abrís la puerta a un ecosistema DevOps más ágil y confiable.

Es una inversión que vale la pena, tanto en proyectos pequeños como en arquitecturas complejas basadas en microservicios. Si tu equipo aún no trabaja con contenedores, empezar con Spring Boot es un punto de partida claro, accesible y de alto impacto.