Siguiendo con la serie de tutoriales dedicados a Docker,
vamos a ver como integrar Docker dentro de nuestros proyectos a través de Maven
y como lanzar nuestros test de integración sobre una base de datos creada en un contenedor.
0. Índice de contenidos
- 1. Introducción
- 2. Entorno
- 3. Plugins Maven Docker
- 4. Configuración del plugin
- 5. Integración con Test de Integración
- 6. Conclusiones
- 7. Referencias
1. Introducción
En el tutorial Docker para Bases de Datos
habíamos creado una serie de imágenes con diferentes motores de BBDD, ahora vamos a dar un paso más y vamos a integrar una de estas
imágenes (en concreto la imagen con DB2 )
dentro de nuestro proyecto Maven.
El objetivo es que durante la fase de tests de integración, construyamos la imagen con DB2, arranquemos el contenedor, ejecutemos los test de integración y destruyamos el
contenedor.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: MacBook Pro 15' (2.3 GHz Intel Core i7, 16GB DDR3 SDRAM)
- Sistema Operativo: Mac OS X El Capitan 10.11
- Software: Docker 1.9.1, Docker Machine 0.5.2
3. Plugins Maven Docker
En la actualidad existen varios plugin para integrar docker con nuestros proyectos java, entre ellos destacamos:
- wouterd/docker-maven-plugin
- alexec/docker-maven-plugin
- spotify/docker-maven-plugin
- rhuss/docker-maven-plugin
Entre estas alternativas nos hemos decantado por rhuss/docker-maven-plugin, básicamente porque dispone de una documentación más completa.
Gracias a este plugin podemos hacer uso de docker a traves de Maven con los siguientes goals:
Goal | Description |
---|---|
docker:start |
Arranca un contenedor |
docker:stop |
Para y destruye el contenedor |
docker:build |
Construye la imagen |
docker:watch |
Habilita la reconstrucción de imágenes y rearranque de contenedores en caso de cambios |
docker:push |
Sube la imagen al repositorio |
docker:remove |
Elimina la imagen |
docker:logs |
Muestra los logs del contenedor |
4. Configuración del plugin
En este apartado vamos a ver como configuramos el plugin:
<plugin> <groupId>org.jolokia</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.13.6</version> <configuration> <logDate>default</logDate> <autoPull>true</autoPull> <images> <image> <alias>db</alias> <name>jpacheco/db2-formacion</name> <build> <assembly> <dockerFileDir>demo</dockerFileDir> </assembly> </build> <run> <privileged>true</privileged> <ports> <port>50001:50000</port> </ports> <wait> <time>200</time> </wait> <log> <color>yellow</color> <prefix>DB PRUEBA DOCKER MAVEN</prefix> </log> <cmd>db2start</cmd> </run> </image> </images> </configuration>
En el apartado configuration indicamos:
- logDate: que tome la configuración de fecha por defecto para los logs
- autoPull: indicamos que si las imágenes base no están en nuestro repositorio local, intente hacer un docker pull ..
En el apartado images describimos las imágenes que podemos gestionar desde nuestro proyecto.
En nuestro ejemplo vamos a describir la imagen con DB2
dentro del tag image :
- alias: Alias de la imagen (puede ser usada para vincularla a otra imagen)
- name: Nombre de la imagen
En la sección build le indicamos la configuración necesaria para construir la imagen, la información que tomará cuando ejecutemos mvn docker:build
- assembly / dockerFileDir :Directorio donde se encuentra el DockerFile y ficheros necesarios para construir la imagen
En la sección run le indicamos la configuración necesaria para arrancar un contenedor mvn docker:start
- privileged :Directorio donde se encuentra el DockerFile y ficheros necesarios para construir la imagen
- ports / port : Mapeo de puertos entre el contenedor y la máquina anfitriona
- wait / time : Tiempo en ms de espera a que arranque el contenedor
- log / color / prefix : Configuramos el color y el prefijo de los logs del plugin
- cmd : Comando de arranque del contenedor
Una vez configurado podemos ejecutar alguno de los goals del plugin:
mvn docker:build
Con la que construimos la imagen.
mvn docker:start
Arranca el contenedor, como podemos comprobar con docker ps.
Paramos y destruimos el contenedor, como podemos comprobar con docker ps -a.
5. Integración con Test de Integración
Una vez hemos configurado correctamente el plugin, vamos a engancharlo con nuestros test de integración, para ello vamos a partir de un proyecto Spring + MyBatis + Maven que esta disponible
aquí
No se trata de explicar el código del proyecto, basta decir que hemos usado el plugin de Maven Failsafe
para lanzar los test de integración usando la
configuración básica y cumpliendo con la convención de llamar a nuestros tests de integración
con el sufijo «IntegrationTest». (conviene indicar que asociaremos la fase de de test de integración a un ‘profile’ maven llamado integration)
Sólo nos falta enganchar el plugin de Docker en las fases pre-integration-test (construimos la imagen y arrancamos el contenedor)
y post-integration-test (paramos – borramos el contenedor y destruimos la imagen)
Para ello basta con añadir a la configuración del plugin lo siguiente:
<executions> <execution> <id>start</id> <phase>pre-integration-test</phase> <goals> <goal>build</goal> <goal>start</goal> </goals> </execution> <execution> <id>stop</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> <goal>remove</goal> </goals> </execution> </executions>
como se puede observar en el código estamos vinculando los goals de build y start a la fase de pre-integration-test y los de stop y remove
a la fase post-integration-test
Una vez configurado todo podemos lanzar los test de integración, ejecutando
mvn clean verify -P integration
Como podemos apreciar en la imagen se construye la imagen Built image 38786c137995, arranca el contenedor
Start container 5b7eb588ea26, se lanzan los test org.autentia.tutoriales.ProfesorMapperIntegrationTest y finalmente
paramos y destruimos el contenedor Stop and remove container 5b7eb588ea26 y eliminamos la imagen Remove
6. Conclusiones
Como hemos podido comprobar a través de esta serie de tutoriales, los ámbitos de aplicación de Docker parecen ilimitados,
en próximos tutoriales seguiremos descubriendo nuevas características y usos de Docker.
Un saludo.
Grande Pacheco!! Sigues igual de crack!