Deploy de una aplicacion de Spring con Docker
Para realizar el deploy de una aplicacion de Spring Core con Docker, lo primero que se necesita hacer es empaquetar la aplicacion en su respectivo .jar
| |
Una vez la tenemos lista, podemos proceder a crear una imagen de Docker.
Para crear la imagen hay dos formas.
- Utilizar una imagen base que ya existe en Docker o en cualquier otro repositorio
- Utilizar una nueva imagen desde cero, desde un docker file herdando de una imagen de Docker hub
# Dockerfile
Para realizarlo a partir de un Dockerfile, lo primero que se debe hacer es identificar en Docker Hub la version del openjdk a utilizar.
Una vez identificada, podemos empezar a construir nuestro dockerfile
| |
# Docker build
Una vez escrita el dockerfile para la aplicacion, se debe construir la imagen a partir de ella. Para esto, nos dirigimos a la carpeta que contiene ahora le Dockerfile y lo construimos utilizando:
| |
Una vez finalizada, la imagen habra sido construida y podra ser visualizada junto con todas las demas usando:
| |
Y finalmente puede ser levantada utilizando su identificador (o tag) y mapeando un puerto externo con el interno del contenedor.
| |
# Optimizaciones
Podemos hacer que el Dockerfile no solo se encarge de crear el imagen obteniendo ya un jar, si no que tambien, se encargue de compilar el codigo fuente y descargar las dependencias necesarias. Para realizar estas operaciones desde el dockerfile correctamente es improtante saber que este trabaja en forma de cascada por capas, si se modifica una capa superior todas las capas subsecuentas van a tener que realizarse otra vez.
# Dependencias
Conociendo esto podemos hacer un Dockerfile de tal forma que cambios en el codigo fuente no afecten la descarga de las dependencias:
| |
# Peso
Para optimizar el peso, se utiliza una especie de implementacion del patron builder para construir la imagen de Docker en multietapas.
# Errores comunes
# La conexion a la base de datos es invalida
Esto se causa debido a que, dentro del container, su localhost es completamente diferente al localhost que se tenia cuando se corria la aplicacion en local, para corregirlo, se puede reemplazar el “localhost” dentro de las configuraciones del aplicacion.properties a host.docker.internal.
| |
Posterior a este cambio, se debe de regenerar el jar y el contenedor desde cero.