CodeGym /Cursos /Módulo 5. Spring /Lección 149: Práctica: crear una imagen Docker para una a...

Lección 149: Práctica: crear una imagen Docker para una aplicación Spring Boot

Módulo 5. Spring
Nivel 22 , Lección 8
Disponible

Recordemos, Docker permite:

  • Crear contenedores, que incluyen no solo tu aplicación, sino también todas sus dependencias.
  • Garantizar la portabilidad, ya que el contenedor funciona igual en cualquier sitio.
  • Aislar las aplicaciones unas de otras.
  • Facilitar el despliegue en la nube, en servidores o incluso en tu portátil local.

¿Listos? ¡Pues empezamos!


Estructura del proyecto

Antes que nada, asegúrate de que tienes una aplicación Spring Boot lista que genere un archivo jar mediante Maven. Por ejemplo, la estructura de tu proyecto puede verse así:


my-spring-boot-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example.demo/
│   │   │       ├── DemoApplication.java
│   │   │       └── controllers/
│   │   │           └── HelloController.java
│   │   └── resources/
│   │       └── application.properties
├── pom.xml
├── target/
│   └── my-spring-boot-app-0.0.1-SNAPSHOT.jar
└── Dockerfile

El archivo Dockerfile lo crearemos hoy.


Paso 1: Crear el Dockerfile

Dockerfile — es la "receta" para construir la imagen Docker. Abre tu proyecto y crea un nuevo archivo llamado Dockerfile en la carpeta raíz.

Ejemplo mínimo de Dockerfile


# Usamos una imagen base con Java instalado
FROM openjdk:17-jdk-slim

# Indicamos el directorio de trabajo dentro del contenedor
WORKDIR /app

# Copiamos el archivo jar de la aplicación al contenedor
COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar

# Indicamos el comando para ejecutar la aplicación
ENTRYPOINT ["java", "-jar", "app.jar"]
  • FROM openjdk:17-jdk-slim
    Indica la imagen base para el contenedor. Es una imagen ligera con Java 17.
  • WORKDIR /app
    Establece el directorio de trabajo dentro del contenedor, desde el que se ejecutará la aplicación.
  • COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar
    Copia el archivo app.jar desde la carpeta local target al directorio /app del contenedor.
  • ENTRYPOINT ["java", "-jar", "app.jar"]
    Indica el comando que se ejecuta al iniciar el contenedor.

Paso 2: Construir la imagen Docker

Ahora que el Dockerfile está listo, puedes construir la imagen Docker. Ejecuta los siguientes comandos en la terminal:


# Ve a la carpeta del proyecto
cd /path/to/my-spring-boot-app

# Compila el archivo jar, si aún no lo tienes
mvn clean package

# Construye la imagen Docker
docker build -t my-spring-boot-app:latest .
  • docker build
    Comando para construir la imagen Docker.
  • -t my-spring-boot-app:latest
    Indica el nombre (tag) para la imagen creada. Aquí es "my-spring-boot-app", versión "latest".
  • .
    Indica el directorio donde está el Dockerfile.

Paso 3: Ejecutar el contenedor Docker

Después de construir la imagen puedes ejecutarla como contenedor:


docker run -d -p 8080:8080 --name spring-app my-spring-boot-app:latest
  • -d
    Ejecuta el contenedor en segundo plano (detached mode).
  • -p 8080:8080
    Mapea el puerto 8080 del host al puerto 8080 del contenedor.
  • --name spring-app
    Asigna un nombre al contenedor.
  • my-spring-boot-app:latest
    Especifica la imagen Docker que se va a usar.

Ahora tu aplicación está disponible en http://localhost:8080.


Paso 4: Verificar que el contenedor funciona

Para asegurarte de que el contenedor está funcionando, ejecuta estos comandos:


# Comprueba los contenedores en ejecución
docker ps

# Mira los logs de la aplicación
docker logs spring-app

Deberías ver los logs del funcionamiento de tu aplicación Spring Boot.


Consejos y errores comunes

  1. Si el archivo jar no se genera, asegúrate de haber compilado el proyecto correctamente con Maven (mvn clean package).
  2. Si la imagen Docker no se construye, revisa que las rutas en el Dockerfile estén correctas.
  3. Si la aplicación dentro del contenedor no arranca, revisa los logs con docker logs spring-app.

Ajustes adicionales del Dockerfile

1. Definir variables de entorno

Puedes pasar variables al contenedor:


ENV SERVER_PORT=8080
ENTRYPOINT ["java", "-jar", "app.jar", "--server.port=${SERVER_PORT}"]

Ahora puedes indicar el puerto al ejecutar el contenedor:


docker run -d -p 9090:9090 -e SERVER_PORT=9090 my-spring-boot-app:latest

2. Reducir el tamaño de la imagen Docker

Las imágenes ligeras ayudan a ahorrar espacio. En lugar de la imagen openjdk usa distroless:


FROM gcr.io/distroless/java:17
COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar
CMD ["app.jar"]

¿Qué sigue?

Con Docker tus aplicaciones pueden funcionar igual en tu portátil de desarrollo, en un servidor o en la nube. En el siguiente paso aprenderemos a subir imágenes Docker a repositorios en la nube y desplegarlas en plataformas como AWS o Kubernetes!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION