SpringBoot + Docker
En este post intentare explicar los pasos que tienes que seguir para construir una imagen Docker y subirla a Docker Hub para ejecutar una aplicación SpringBoot.
Docker
Según su propia web, Docker en resumen, es una plataforma para desarrollar, implementar y ejecutar aplicaciones con contenedores.
Un contenedor ejecuta una imagen. ¿Y que es una imagen? Es un paquete ejecutable que incluye todo lo que se necesita para ejecutar una aplicación: el código, librerías, variables de entorno y archivos de configuración.
A container is a runtime instace of an image
(Un contenedor es una instancia en tiempo de ejecución de una imagen)
DockerHub
Es un servicio cloud que tiene varias características:- Repositorios de imágenes
- Builds automáticos
- Webhooks
- Organizaciones
- Integración con GitHub y Bitbucket
En este post, lo que haremos será construir una imagen que subiremos al repositorio de imágenes de Docker Hub.
Para poder subir imágenes, debemos crearnos un Docker Id en DockerHub https://hub.docker.com/
Si quieres conocer mas en detalle Docker Hub te invito a consultar su documentación.
Para este ejemplo necesitamos:
- Linux
- JDK 1.8 o superior
- Maven 3.2+
- IDE favorito
1. Instalar Docker
La guía oficial de instalación la puedes ver en: https://docs.docker.com/install/
Para este post he usado Linux Mint Silvia 18.3 KDE 64-bit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#desintalar versiones antiguas | |
$ sudo apt-get remove docker docker-engine docker-ce docker.io | |
$ sudo apt-get update | |
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common | |
#Agregar GPG Key oficial de Docker | |
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - | |
#Verificar Key, | |
$ sudo apt-key fingerprint 0EBFCD88 | |
# en la respuesta debe estar el siguiente código : 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 | |
#Add reposoitory en Ubuntu | |
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ | |
stable" | |
#En Linux Mint Silvia 18.3 KDE 64-bit | |
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ xenial stable" | |
#Instalar | |
$ sudo apt-get update | |
$ sudo apt-get install docker-ce | |
#Verificar instalación | |
$ sudo docker run hello-world |
2. Dockerfile
El Dockerfile, es un fichero que tenemos que crear en nuestro proyecto SpringBoot, este fichero define todo lo que necesitamos en nuestro contenedor, para este caso únicamente necesitamos Java y un Jar que es el fichero del proyecto.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FROM java:8 | |
VOLUME /tmp | |
ARG JAR_FILE | |
ADD ${JAR_FILE} app.jar | |
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] |
3. Construir Imagen con Maven
Para construir la imagen de nuestro proyecto utilizaremos un plugin de Spotify que nos facilita esta creación (puedes consultar la documentación del plugin)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<properties> | |
<docker.image.prefix>alsoft27</docker.image.prefix> | |
</properties> | |
<build> | |
<plugins> | |
<plugin> | |
<groupId>com.spotify</groupId> | |
<artifactId>dockerfile-maven-plugin</artifactId> | |
<version>1.3.6</version> | |
<configuration> | |
<repository>${docker.image.prefix}/${project.artifactId}</repository> | |
<buildArgs> | |
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> | |
</buildArgs> | |
</configuration> | |
</plugin> | |
</plugins> | |
</build> |
El repository tendrá el nombre de imagen que indiquemos en <configuration>..<repository>.. en este caso sera alsoft27/helloworlddocker
para construir la imagen ejecutamos:
$ mvn install dockerfile:build
4. Subir imagen a Docker Hub
Para subir la imagen, primero debemos crear un repositorio en Docker HubUna vez creado el repositorio, hacemos login en Docker Hub (ejecutar como root) y hacemos push de la imagen
$ sudo su
$ docker login
$ mvn dockerfile:push
El plugin de Spotify también nos permite subir la imagen automáticamente si deseamos, para eso agregamos la siguiente configuración al plugin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<properties> | |
<docker.image.prefix>alsoft27</docker.image.prefix> | |
</properties> | |
<build> | |
<plugins> | |
<plugin> | |
<groupId>com.spotify</groupId> | |
<artifactId>dockerfile-maven-plugin</artifactId> | |
<version>1.3.6</version> | |
<!-- agregamos esta configuración para subir al imagen automaticamente --> | |
<executions> | |
<execution> | |
<id>default</id> | |
<phase>install</phase> | |
<goals> | |
<goal>build</goal> | |
<goal>push</goal> | |
</goals> | |
</execution> | |
</executions> | |
<configuration> | |
<repository>${docker.image.prefix}/${project.artifactId}</repository> | |
<buildArgs> | |
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> | |
</buildArgs> | |
</configuration> | |
</plugin> | |
</plugins> | |
</build> |
5. Descargar y ejecutar
Como ya hemos subido la imagen al Docker Hub, la podemos descargar:$ docker pull alsoft27/helloworlddocker
$ docker run -p 8080:8080 -t alsoft27/helloworlddocker
La aplicación estará accesible en http://localhost:8080, para probar esta aplicación tenemos el endpoint http://localhost:8080/helloworld, la respuesta tiene que ser como se muestra en la imagen:
Si no subimos la imagen a Docker Hub podemos obviar el paso anterior y ejecutar la imagen en local.
Muchas gracias por leer el post y espero que les sirva de ayuda para iniciar en este mundo de los contenedores.
El código lo tenéis disponible en Github
Algunos comandos de Docker
listar imágenes de Docker
$ docker image ls
listar contenedores
$ docker container ls
Detener contenedor
$ docker stop [container id]
Arrancar contenedor
$ docker start [container id]
Comentarios
Publicar un comentario