Resumen del tutorial de Docker Hub
-
Conocer como ejecutar aplicaciones Java en Docker.
-
Generar Dockerfile para un proyecto.
-
Generar Docker Compose para un Dockerfile.
-
Conocer los Dockerfile Multistage
En el siguiente ejemplo vamos a partir de una aplicación de Spring compilada en un .jar, podemos generar un Dockerfile y Compose que se encargue de desplegarlo.
Spring es un framework web Java que permite desplegar proyectos web en un .war (para lanzarlos desde un servidor tomcat o similar) o desde un .jar donde lleva el servidor web también embebido.
En nuestro caso vamos a desplegar un fichero .jar para simplificar el proceso.
En primer lugar debemos buscar en los archivos .properties
de la carpeta src/main/resources
para ver en qué puerto se está desplegando.
En este paso podemos ver que se ejecuta en el puerto 8090.
El siguiente paso es compilar el proyecto ejecutando ./mvn install
Tras realizarse correctamente la compilación podemos buscar el .jar
de nuestro proyecto.
Por lo tanto sabemos que nuestro ejecutable se encuentra en la ruta target/wtcdefinition-0.0.1-SNAPSHOT.jar
Una vez hemos recopilado esta información podemos realizar el Dockerfile de nuestro proyecto.
FROM openjdk:8-jdk-alpine (1)
RUN mkdir -p /usr/app/ (2)
WORKDIR /usr/app (3)
COPY wtcdefinition-0.0.1-SNAPSHOT.jar /usr/app (4)
EXPOSE 8090 (5)
CMD ["java", "-jar", "wtcdefinition-0.0.1-SNAPSHOT.jar"] (6)
-
Nombre de la imagen para ejecutar Java (SDK 8)
-
Directorio donde copiar el
.jar
-
Directorio donde ejecutar las ordenes con
docker run
-
Copiamos el
.jar
de nuestro proyecto al contenedor -
Exponemos el puerto 8090
-
Comando para ejecutar nuestro
.jar
con Java
A partir de la información anterior podemos crear un fichero docker-compose.yml
que nos ayude a ejecutar nuestra aplicación sin necesida de tener que recordar todos los parametros de la invocación.
docker-compose.yml
para nuestra aplicación.version: '3.3' (1)
services: (2)
couchbase: (3)
build: . (4)
ports:
- "8090:8090" (5)
-
Versión de formato de docker-compose (actualmente es esa).
-
Servicios que componen el docker-compose.
-
Nombre que le damos al servicio. Puede ser el que queramos.
-
Ruta relativa donde encontrar el Dockerfile del servicio
-
Puertos de la aplicación
Cuando la configuración del docker-compose.yml
tiene algún servicio que use build
, antes de poder lanzar la orden docker-compose up
tenemos que hacer un docker-compose build
para que ejecute la configuración definida en el dockerfile.
En lugar de compilar el .jar
previamente a constuir la imagen Docker, podemos crear un Dockerfile que tambien lo compile. Estos Dockerfile que contienen multiples FROM
se llaman Multistage.
FROM openjdk:8-jdk-alpine as build (1)
RUN mkdir -p /usr/app/ (2)
WORKDIR /usr/app (3)
COPY mvnw . (4)
COPY .mvn .mvn (4)
COPY pom.xml . (4)
COPY src src (5)
RUN sh mvnw install -DskipTests (6)
FROM openjdk:8-jdk-alpine (7)
RUN mkdir -p /usr/app/ (8)
WORKDIR /usr/app (8)
COPY --from=build /usr/app/target/wtcdefinition-0.0.1-SNAPSHOT.jar /usr/app (9)
EXPOSE 8090 (10)
CMD ["java", "-jar", "wtcdefinition-0.0.1-SNAPSHOT.jar"] (11)
-
Primer Stage llamado
build
. Imagen que nos permita compilar. Pueden ser diferentes. -
Directorio donde vamos a compilar.
-
Directorio donde ejecutar las siguientes ordenes.
-
Copiamos solo los ficheros necesarios para Maven.
-
Copiamos el código fuente de la aplicación
-
Compilamos usando Maven.
-
Segundo Stage. Imagen que nos permita ejecutar. Partimos de cero.
-
Creamos el directorio para ejecutar nuestro programa.
-
Copiamos el programa compilado en el Stage anterior.
-
Exponemos el puerto 8090
-
Comando para ejecutar nuestro
.jar
con Java
Clona el repositorio https://github.com/ualdra/jar2compose
Crea un fichero Dockerfile de tipo Multistage y un docker-compose.yml
para compilar y ejecutar el proyecto.