Spring Boot en un contenedor de Docker

Problema

A la hora de crear servicios de forma local no puedo ejecutar los servicios en el mismo puerto, 8080 por defecto, por lo que tengo que cambiarlos de forma manual y luego recordar no subir este cambio.

Esto podría no suponer un problema cuando se trabaja con un par de servicios… pero que pasa cuando trabajas con +80 servicios?

Solución

Con Docker se pueden crear contenedores donde nuestros servicios siempre se ejecutan usando el puerto 8080, pero estos puertos se pueden mapear a otros si se desea. Estos contenedores están listos para el uso en producción y al mismo tiempo pueden ser orquestados de forma local con Docker Compose.

Docker casi nativo

En la última Keynote 2016 se presentó un nuevo cliente para OSX y Windows, aún en Beta a la hora de escribir estas lineas, que acerca un poco más docker a como funciona en un OS Linux. Yo lo estoy usando y estoy encantado! 😉

Para OSX

Para Windows 64bits

Al ajo!

  1. Cambiar el nombre del fichero que se genera al empaquetarhttps://gist.github.com/carlosjgp/ce6469f1ef71157c4deec21882186281#file-target-pom-xmlEsto ayudará a generar un fichero Docker genérico para todos los servicios
  2. Añadir el plugin de Docker al proceso de empaquetado
    https://gist.github.com/carlosjgp/ce6469f1ef71157c4deec21882186281#file-plugin-pom-xmlCon este plugin y esta configuración instalamos una image de nuestro servicio “Dockerizado” de forma local. Opcionalmente se puede enviar la imagen a Docker Hub añadiendo otro paso a la configuración del plugin de Spotify.
  3. Añadir el fichero Dockerfile para instalar la imagen de forma local
    https://gist.github.com/carlosjgp/ce6469f1ef71157c4deec21882186281#file-DockerfileQue deberá ser creado en el subdirectorio especificado en el plugin de maven. Por defecto “docker/”
  4. Empaquetar y ejecutar
    https://gist.github.com/carlosjgp/ce6469f1ef71157c4deec21882186281#file-run-sh

Y ya tenemos nuestro servicio rest dentro de un contenedor Docker con el puerto 8080 mapeado al exterior, también al puerto 8080.

Evidentemente esto no es una muy buena práctica (ver Best practices) pero siempre podemos cambiar el puerto del contenedor y mantener el del servicio. Lo mejor sería decir cual es el puerto privado que queremos exponer, sin especificar el público en el fichero Dockerfile, sino a la hora de ejecutar el contenedor

y si no se especifica se asigna un puerto aleatorio el cual se puede ver ejecutando

Docker compose

Para orquestar todos los servicios solo tenemos que crear un fichero Docker compose e ir añadiendo servicios y cambiar el puerto por defecto 8080 al que queramos

y ejecutar!

Más…

Esto es una primera aproximación a como resolver este problema… próximamente publicaré un artículo de como hacerlo automáticamente, sin tener que preocuparse de mapear los puertos y no repetirlos… todo automáticamente!

Deja un comentario

Tu dirección de correo electrónico no será publicada.