Docker Containers para Una API Rest Con Spring Boot y Angular
Docker Containers para Una API Rest Con Spring Boot y Angular
Cochabamba – Bolivia
2018
Dedicatoria
Dedico este trabajo principalmente a Dios, por haberme
dado la vida y permitirme el haber llegado hasta este
momento. A mi madre Nemia Patzi, por ser el pilar más
importante en mi vida. A mi Esposa Anabel Nina, por
darme su amor, cariño y apoyo incondicional. A mi Hijo
Josias Abdiel Herrera Nina, por darme fuerzas y aliento
para culminar el proyecto.
Agradecimientos
A mi madre, esposa y mi hijo; por darme su amor, y
apoyo incondicional que me han ayudado y llevado hasta
donde estoy ahora en mi formación profesional.
A mis hermanos, por estar siempre presentes,
acompañándome y por sus consejos y apoyo moral.
A Digital Harbor por abrir sus puertas y permitir realizar
el diplomado de doble titulación y concluir una etapa en
mi formación profesional.
A mis amigos que me ayudaron y apoyaron en los
módulos de nuestro diplomado.
¡Muchas Gracias!
1
Índice de Contenido
Introducción ......................................................................................................................................... 5
1 Generalidades .............................................................................................................................. 7
2 Metodología ................................................................................................................................. 8
4 Dockerfile ................................................................................................................................... 18
1
6.2 Iniciar los contenedores con Docker Compose ................................................................... 25
8 Conclusiones .............................................................................................................................. 31
2
Índice de Figuras
3
Resumen
En estos tiempos tan cambiantes en el mundo de la tecnología, hay muchos productos que nacen
en el mercado siendo muy prometedores pero que desaparecen tan rápido como han aparecido.
Pero ante las nuevas necesidades, el uso de nuevas tecnologías, estilos de desarrollo, acceso a los
datos de una forma rápida y eficaz, una solución ha aparecido con fuerza con el apoyo de las
empresas más importantes en el ámbito tecnológico:
Los contenedores Docker, los cuales proporcionan el mismo uso que las máquinas virtuales creadas
de la forma tradicional. Docker utiliza estos contenedores para aislar uno o más procesos. Estos
procesos en el Host necesitan Memoria, CPU, Acceso a la Red y espacio en disco, ofrece una
manera simple, eficiente y rápida de portar aplicaciones a través de sistemas y máquinas. Es ligero
y robusto, trabaja a través de Imágenes y contenedores diferenciados por un ID y un nombre.
Docker brinda una serie de comandos para interactuar con los contenedores que se crearán al
momento de desplegar una aplicación, con los cuales se podrá listar, construir, eliminar y muchas
opciones más.
Ofrece la herramienta docker-compose que es muy útil para el despliegue de múltiples servicios,
docker simplifica esta tarea, mediante un archivo .yml se podra configurar los servicios que se
necesitan según un orden prioritario y estos se empaquetarán en un solo contenedor, y con un solo
comando levanta todos los servicios, por ejemplo un proyecto hecho en Spring boot para interfaz
de usuario Angular y acceso a los datos Mysql.
Si bien se puede construir muchos contenedores y levantar uno por uno, si hay la posibilidad de
automatizar ese proceso, con docker-compose tenemos esa solución en la mano. De manera que la
tarea del administrador de Servidores o Devop se simplifica al momento de realizar el despliegue
de nuestros proyectos.
4
Introducción
Esto genera la necesidad de buscar entornos o servidores donde se puedan alojar proyectos de
forma más eficiente y segura.
En el campo de la virtualización han surgido durante los últimos años diferentes soluciones que
han servido para ahorrar costes a las empresas y mejorar sus prestaciones. Pero ante las nuevas
necesidades, principalmente por el denominado Big Data, una solución ha aparecido con fuerza
con el apoyo de las empresas más importantes en el ámbito tecnológico: Docker el cual se ha
convertido en uno de los productos más solicitados y admirados de la actualidad.
La tarea de realizar el despliegue de proyectos es muy importante, hoy en día Docker es la solución
de servidores que muchas empresas de desarrollo de software está empleando en sus despliegues,
es un ambiente perfecto para que las aplicaciones puedan funcionar de forma correcta, debido a su
simplicidad y poder de ejecución.
Los contenedores son la vía que provee Docker para tener el mismo uso que proporcionan las
máquinas virtuales creadas de la forma tradicional. Docker utiliza estos contenedores para aislar
uno o más procesos. Estos procesos en el Host necesitan Memoria, CPU, Acceso a la Red y espacio
en disco, ofrece una manera simple, eficiente y rápida de portar aplicaciones a través de sistemas
y máquinas. Es ligero y delgado, lo que permite contener aplicaciones rápidamente y ejecutarlas
dentro de sus propios entornos seguros (a través de Contenedores).
5
El enfoque que se empleara en esta monografía es acerca de Docker Containers para una API
Rest con Spring Boot y Angular.
Introducción a Docker
Instalación
Docker File
Docker Compose
Micro servicios
Desplegar Sprint Boot con Docker
6
1 Generalidades
En la actualidad vivimos en una era como muchos lo llaman la época de la tecnología, donde
se observa que el crecimiento de empresas de software va en aumento y Bolivia no es la
excepción. Esto es por la necesidad de sistematizar los procesos u operaciones de una empresa
y tener un software a la medida de sus necesidades.
Por ejemplo, una empresa que se dedica al servicio de comida necesita llevar las cuentas de
las ventas, ingresos, egresos y todo tipo de reportes que le ayude a tomar decisiones de una
manera más simple y efectiva, para solventar estas necesidades, surgieron las empresas de
desarrollo de software que brindan este servicio; en el caso de Bolivia hasta el 2018 existen
más 200 empresas de Informática registradas, dedicadas al desarrollo o soporte lógico de un
sistema informático (software), este aspecto es muy importante ya que un sistema tiene que
pasar las diferentes pruebas de testeo antes de pasar a producción y para ello se necesita de
ambientes donde los proyectos, productos (Sistema) estarán desplegados y alojados, con todas
las normas de seguridad y configuraciones necesarias.
El objetivo que se persigue es desarrollar un micro servicio con múltiples contenedores cada
uno con un servicio:
Spring Boot para la parte de backend usando Java y Maven, Angular Cli para la parte de
frontend o interfaz de usuario, Mysql para la conexión a la base de datos; todos estos servicios
contenerizarlos y empaquetarlos dentro de una imagen Docker y gracias a Docker-compose
una característica que proporciona Docker que se estará explicando más adelante, con un único
comando se podrá iniciar y desplegar todos los contenedores de una forma rápida, sencilla y
en el orden el cual lo hayamos definido.
7
1.2 Antecedentes Específicos
Con el objetivo de ofrecer, brindar una explicación clara al estudiante, profesional u otros
acerca de las herramientas que docker ofrece para colaborar en el despliegue de proyectos,
para ello se contemplara lo siguiente:
Introducción a Docker e instalación.
Explicación de los comandos básicos que docker requiere para ser ejecutado.
Explicación sobre dockerfile y su alcance.
Explicación de docker compose, su configuración y ejecución.
Se realizará un ejemplo de docker-compose con spring boot y angular.
2 Metodología
3 Introducción a Docker
Los contenedores son la vía que provee Docker para tener el mismo uso que tienen con las
máquinas virtuales creadas de la forma tradicional.
8
La idea detrás de Docker es crear contenedores ligeros y portables para que las aplicaciones
puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del
sistema operativo que la máquina tenga por debajo, facilitando también de esta forma los
despliegues.
Este concepto fue utilizado tiempo atrás y viene del Sistema Operativo Linux, pero por hacer
un símil con el mundo real, imaginemos un contenedor de esos que suelen llevar los barcos de
mercancías, que contiene distintos productos, docker cuenta con diferentes servicios el cual
están en contenedores.
Fuente: https://guiadev.com/introduccion-a-docker/
Docker es una herramienta diseñada para beneficiar tanto a desarrolladores, testers, como
administradores de sistemas, en relación a las máquinas, a los entornos en sí donde se ejecutan
las aplicaciones software, los procesos de despliegue, etc.
9
En el caso de los desarrolladores, el uso de Docker permite que puedan centrarse en desarrollar
su código sin preocuparse de si dicho código funcionará en la máquina en la que se ejecutará.
Por ejemplo, sin utilizar Docker un posible escenario podría ser el siguiente:
Este escenario desaparece con Docker. Para ejecutar la aplicación, Pepe se crea un contenedor
de Docker con la aplicación, la versión 8 de Java y el resto de recursos necesarios, y se lo pasa
a José.
José, teniendo Docker instalado en su ordenador, puede ejecutar la aplicación de Pepe a través
del contenedor, sin tener que instalar nada más.
3.1 Características
Docker es una plataforma abierta para desarrolladores y administradores de sistemas para
construir, entregar y ejecutar aplicaciones distribuidas.
Liviano
10
Portable
Puede ser ejecutado en muchos SO, Linux, Mac, Windows, a partir de la versión cuenta
con soporte para RedHat/Fedora.
Cuenta con soporte para Raspberry pi.
Autosuficiente
Puede ser ejecutado en SO Linux 64-bits con Kernel >= 3.8, también corre en
Windows y Mac.
Está soportado por muchas de las plataformas cloud, por ejemplo: Amazon EC2, Google
Compute Engine, Digital Ocean.
11
Figura 2: Características de Docker
3.2 Imágenes
Una parte básica de la introducción a Docker es entender qué es una imagen. El concepto de
Imagen que viene siendo en si nuestro sistema operativo, entonces se pude decir que se tiene
una imagen de Centos, Ubuntu o Debian.
Una imagen es una especie de plantilla, una captura del estado de un contenedor, esto quiere
decir que, un contenedor no es una máquina virtual, pero para hacernos una idea, se podría
decir que una imagen de un contenedor es como un snapshot de una máquina virtual, pero
mucho más ligero.
Por ejemplo una imagen podría contener un sistema operativo Ubuntu con un servidor Apache
y una aplicación web instalada. Las imágenes se utilizan para crear contenedores, y estas nunca
cambiarán.
Hay muchas imágenes públicas con elementos básicos como Java, Ubuntu, Apache, etc., que
se pueden descargar y utilizar. Normalmente cuando creas imágenes, partimos de una imagen
12
padre a la que le se van añadiendo servicios (por ejemplo: una imagen padre con Ubuntu y
Apache, la cual fue modificada para instalar una aplicación).
Ahora bien, lo interesante de las imágenes es que pueden ser más que solo un sistema
operativo, puede decir que tenemos una imagen de Nginx o una imagen de MySQL o de
Memcached, que estos últimos en si son servicios pero en Docker podemos crear imágenes a
partir de unos servicios ya instalados y hasta configurados. Como se muestra en la figura 3
Portátil: pueden ser versionadas en los repositorios de Docker Hub, o ser guardado como un
archivo .tar.
Estática: el contenido no se puede cambiar, a menos que se realice una nueva imagen.
13
3.3 Contenedores
Hacen uso de una imagen como base y pueden contener uno o más procesos.
Un contenedor Docker es:
Una instancia de una imagen Docker
Un conjunto de operaciones asociadas a su ciclo de vida:
Crear, Destruir, Arrancar, Reiniciar o Parar
Un entorno de ejecución (González, 2016)
Se realizará una explicación en el siguiente ejemplo: se tiene una Imagen de Ubuntu 14.04 con
Django instalado y se crearán 3 Contenedores a partir de la imagen de Ubuntu.
Los contenedores al igual que las máquinas virtuales tradicionales están aisladas del host,
luego cada contenedor debe tener su ID único y un nombre que sea legible por cualquier
persona esto es netamente para identificar cada contenedor y luego es necesario que cada
contenedor exponga los servicios que necesite.
Docker permite exponer puertos del contenedor para que el Host identifique cuando tratemos
de entrar a cada puerto lo que es conocido como el port forwarding.
Características de un Contenedor
Permisos de escritura: sólo tendrá permiso a sus propios archivos y a los volúmenes
asociados.
14
Figura 4: Docker vs VM
15
3.4 Comandos Docker
Docker cuenta con variedad de comandos según la necesidad del usuario, la forma de utilizar
estos comandos de docker es la siguiente:
docker <comando> <opción si es necesario> [ID]
Muchas veces se necesitarán ejecutar estos comandos en modo de súper usuario (root).
Se puede observar los siguientes comandos con su descripción:
Comando Descripción
docker -d & Ejecuta el demonio de Docker
docker commit Crea una nueva imagen de los cambios del contenedor
Copia archivos/carpetas de los contenedores del sistema de archivos a
docker cp
la ruta de host
docker events Obtiene eventos en tiempo real desde el servidor
docker pull Descarga una imagen o un repositorio del servidor de registros Docker
16
3.5 Cuando usar Docker
Puede utilizar los contenedores de Docker como bloque de construcción principal a la hora de
crear aplicaciones y plataformas modernas.
Una vez instalado Docker en una maquina cuyo SO sera Ubuntu 16.04 LTS.
Escribir (docker –v) en la línea de comandos, para ver la versión instalada.
ubuntu@docker:~$ docker -v
Docker version 1.11.2, build b9f10c9
Para verificar que Docker Community Edition (CE) esté instalado correctamente escribimos en
la línea de comandos lo siguiente:
$ sudo docker run hello-world
17
4 Dockerfile
Figura 5: Dockerfile
FROM: indica la imagen base a partir de la cual crearemos la imagen que construirá el
Dockerfile.
ENV HOME: establece el directorio HOME que usarán los comandos RUN.
RUN: permite ejecutar una instrucción en el contenedor, por ejemplo, para instalar algún
paquete mediante el gestor de paquetes (apt-get, yum, rpm).
EXPOSE: indica los puertos TCP/IP por los que se pueden acceder a los servicios del
contenedor, los típicos son 22 (SSH), 80 (HTTP) y en este caso el puerto por defecto de
mysql 3306 o postgres 5432, como se muestra en la imagen a continuación.
19
Figura 6 : Host – Port Contenedor
CDM: establece el comando del proceso de inicio que se usará si no se indica uno al iniciar
un contenedor con la imagen.
USER: Sirve para configurar el nombre de usuario a usar cuando se lanza un contenedor y
para la ejecución de cualquier instrucción RUN, CMD o ENTRYPOINT posteriores.
LABEL: Añade metadatos a una imagen Docker, se escribe en el formato etiqueta=valor.
Se pueden añadir varios metadatos separados por un espacio en blanco.
Ejemplo: LABEL versión=”1.0”
STOPSIGNAL: Indica al sistema una señal que será enviada al contenedor para salir. Puede
ser un número valido permitido por el Kernel (por ejemplo 9) o un nombre de señal en el
formato SIGNAME (por ejemplo SIGKILL).
20
5 Dockerizar el Micro Servicio
Primeramente se hablará de Docker Hub, que sirve como repositorio de imágenes oficiales y
de terceros donde se pueden descargar las imágenes actuales.
Las características de Docker Hub son:
• Repositorios de imágenes: encuentra, administra, sube y descarga imágenes oficiales y de
la comunidad.
• Imágenes automáticas: crea nuevas imágenes cuando haces un cambio en la fuente de
Github o BitBucket.
• Webhooks: crea automáticamente imágenes al hacer un push a un repositorio.
En Docker Hub podemos tener nuestro propio repositorio de imágenes, público o privado.
Ahora veremos cómo usar los repositorios desde el sitio web. Para mayor información ingrese
a este link: https://hub.docker.com/explore/
21
Una vez descargado las imágenes necesarias e instaladas dentro del contenedor, se observará
cómo empaquetar un micro-servicio de un proyecto de Spring Boot en Java dentro de un
contenedor docker, para ello se usará el plugin de maven y posterior descargar el proyecto
ejemplo de github.
Compilar y empaquetar con el comando para generar los .jar: mvn clean compile package
FROM openjdk:8-jdk-alpine
COPY target/spring-boot-web-0.0.1.jar .
EXPOSE 8080
Con EXPOSE:
● Se expone un puerto del contenedor al host.
-p [<host_port>:]<cont_port>
22
Verificar que el servicio está corriendo abriendo en el navegador lo siguiente: (Nickoloff,
2016, p. 29)
http://localhost:1999/swagger-ui.html
O también:
http://<IP_DEL_CONTEDOR_DOCKER>:1999/swagger-ui.html
6 Docker Compose
Docker Compose es una herramienta que permite simplificar el uso de Docker, generando
scripts que facilitan el diseño y la construcción de servicios, se puede crear diferentes
contenedores y al mismo tiempo, en cada contenedor, diferentes servicios.
Las aplicaciones basadas en micro servicios se prestan a usar múltiples contenedores cada uno
con un servicio, uno puede contener Java, otro puede contener una base de datos Postgresql,
Mysql, SqlServer, etc., otro puede contener una base de datos clave/valor Redis o de
documentos como Elasticsearch para hacer búsquedas, otro un servidor Tomcat y un servidor
web como Nginx o NodeJ.
Al tener múltiples contenedores; usar el comando docker run para cada uno de ellos resultará
complejo. En este punto entra Docker Compose el cual permite definir una aplicación multi-
contenedor en un archivo con las mismas propiedades que el comando docker
run individualmente. Con un único comando se podrá iniciar todos los contenedores y en el
orden que fueron especificados.
El archivo descriptor puede servir no solo como forma de iniciar los contenedores en un
entorno de desarrollo sino como de documentación de la aplicación en la que se observara
contenedores, imágenes, volúmenes, enlaces y demás propiedades tienen.
23
6.1 Instalación de Docker Compose
Se cuenta con varias formas de instalar Docker Compose. A continuación se mostrara una
forma de instalar y la que recomiendo por ser sencilla, podrá encontrar las instrucciones paso
a paso para la instalación en el siguiente enlace:
https://docs.docker.com/compose/install/#install-compose
Puede ejecutar Compose en MacOS, Windows y Linux de 64 bits, para el presente caso se
realizará en Linux.
docker-compose --version
24
6.2 Iniciar los contenedores con Docker Compose
Básicamente se puede indicar las mismas propiedades que se realizarán al arrancar los
contenedores individualmente con el comando docker run.
Figura 8: Docker-Compose
En el fichero .yml se puede definir, entre otras cosas, la imagen o imágenes que se quieren
utilizar, la exposición de puertos o los volúmenes, etc.
25
En el siguiente ejemplo se cuenta con varios contenedores, un contenedor para redis y un
contenedor para la conexión a la base de datos postgresql, un contenedor para el servicio
usando tomcat enlazado con los contenedores de redis y postgresql definidos previamente.
26
Primeramente, se crea un directorio de trabajo y se crea el archivo de contenedores y se lo
nombra docker-compose.yml.
Segundo, se edita y configura el archivo docker-compose.yml con los datos como se muestra
en la imagen.
Los contenedores de datos, redisdb y posgresqldb, usan la propiedad volumes con los
datos que guardarán y la imagen de busybox (se suele usar esta para los contenedores de
datos porque es muy pequeña).
Con volumes_from se puede usar volúmenes, con links enlazar contenedores y con ports
asociar puertos entre los contenedores y la propia máquina anfitrión.
En el ejemplo se ha usado los puertos por defecto de cada uno de los servicios.
Con la opción –help se puede ver la lista completa de comandos que podemos usar.
27
Indicando la opción -d los contenedores se iniciarán en segundo plano.
Con docker-compose stop detiene los servicios del contenedor.
Con docker-compose restart reiniciamos los contenedores.
Con docker-compose rm eliminamos completamente los contenedores.
Con docker-compose logs muestra información registrada por todos los contenedores que
participan en un servicio.
REST es cualquier interfaz entre sistemas que usen HTTP para obtener datos o generar
operaciones sobre esos datos en todos los formatos posibles, como XML y JSON.
Protocolo cliente/servidor sin estado: cada petición HTTP contiene toda la información
necesaria para ejecutarla, lo que permite que ni cliente ni servidor necesiten recordar ningún
estado previo para realizar una petición. Aunque esto es así, algunas aplicaciones HTTP
incorporan memoria caché.
Las operaciones más importantes relacionadas con los datos en cualquier sistema REST y
la especificación HTTP son cuatro: POST (crear), GET (leer y consultar), PUT (editar)
y DELETE (eliminar).
Los objetos en REST siempre se manipulan a partir de la URL. La URL facilita acceder
a la información para su modificación o borrado.
una API REST elaborado con Spring boot y Java para la parte de backend, Angular y NodeJ
28
7.1 Crear Archivo yml
contenedores, por ejemplo, no se puede configurar nuestro servicio de spring boot para que se
levante antes que el servicio de base de datos, pues existe una dependencia, el cual generará un
comportamiento de un Proyecto.
29
7.3 Levantar el archivo yml
Una vez teniendo listo la configuración del archivo yml, se podrá iniciar los contenedores
con el comando docker-compose up –d, que levantará todos los servicios configurados en el
30
8 Conclusiones
En esta investigación se ha explicado Docker desde el nivel más básico para realizar
configuraciones, la instalación y la automatización de contenedores.
Ahora se podrá utilizar Docker como entorno de desarrollo, en el cual se podrá crear y probar
las aplicaciones en distintos entornos teniendo la ventaja de que por ninguna razón el host
(maquina local) se dañe. De esta forma con Docker se logra un trabajo más libre para
configurar cualquier entorno de cualquier sistema operativo y luego destruirlo en segundos.
Con Docker se tiene ambientes robustos y ligeros para emular el comportamiento de una
máquina virtual, por lo que ya no se necesita hacer uso de herramientas de virtualización donde
se alojen nuestros servicios.
El proceso de Dockerizar y contenerizar servicios, hace que el trabajo de nuestro DevOp sea
más eficiente, mejorando el rendimiento de los entornos, el tiempo el cual conlleva realizar un
despliegue y automatizar nuestras configuraciones, para cubrir y satisfacer las exigencias por
parte del equipo de desarrolladores que requieran de nuevas herramientas, tecnologías, etc.,
para el desarrollo de proyectos.
31
Bibliografía
https://guiadev.com/introduccion-a-docker/
https://docs.docker.com/install/linux/docker-ce/ubuntu/
https://docs.docker.com/compose/install/#install-compose
32