How to deploy Java apps with Docker (it's pretty awesome!)

¿Te gustaría aprender Microservicios con Spring Cloud y Docker?
Tenemos los Diplomados que necesitas. ¡Haz clic aquí!

El desarrollo con instancias de Docker está cada vez más extendido entre los equipos de desarrollo de software porque simplifica el proceso de programación, despliegue y entrega de aplicaciones.

Docker es una de las palabras más de moda en el mundo del software. Si alguna vez te has preguntado por qué, la respuesta principal es por el valor que los contenedores y el desarrollo con instancias de Docker aporta tanto a los programadores como a los administradores de software, y especialmente a aquellos que hayan adoptado un flujo de trabajo centrado en DevOps. Docker permite que estos equipos de desarrollo alcancen una eficiencia muy alta en la entrega y el despliegue de software, al solucionar muchos de los retos que presenta la virtualización tradicional.

En este artículo intentaremos explicar por qué las instancias de Docker han resultado tener un grado de aceptación tan grande entre los equipos de desarrollo de software y como los contenedores aportan ventajas a los desarrolladores que no pueden obtener usando máquinas virtuales de toda la vida.

La adopción de Docker según estadísticas

¿Qué es lo que hace Docker?

Para entender por qué Docker es tan valioso para los desarrolladores de software, primero hay que comprender cómo es que Docker aporta (o no) cambios a la hora de desarrollar y desplegar software.

En la mayoría de las empresas, el desarrollo, despliegue y la entrega de software es un proceso con varios pasos bien diferenciados:

  1. El primer paso es el diseño de la aplicación.
  2. El segundo es el desarrollo de la misma, escribiendo el código.
  3. El tercer paso es montar el código en un entorno de pruebas y probarlo.
  4. El cuarto y último paso consiste en empaquetar la aplicación probada, desplegarla y entregarla a los usuarios.

Desde un punto de vista de desarrollo y despliegue, los contenedores pueden hacer todo lo que hacen las máquinas virtuales, pero mejor.

La única parte del proceso de desarrollo de software con contenedores Docker que realmente supone un gran cambio es en el último paso. Los contenedores no suponen necesariamente un cambio en el diseño o a la hora de programar el código (aunque, en algunos casos, migrar software heredado a contenedores exige algunas modificaciones para que la app se pueda ejecutar como un conjunto de microservicios). Los contenedores tampoco hacen variar en lo fundamental la forma en la que se prueban las aplicaciones, aunque si facilitan el hecho de mantener un entorno de pruebas consistente. De todos modos, las herramientas para hacer pruebas son las mismas.

Pero a la hora de empaquetar y desplegar una aplicación de desarrollo a producción, las instancias de Docker cambian mucho la cosa. Permiten a los desarrolladores colocar la app dentro de un contenedor, que es un entorno definido por software fácilmente portable. Este entorno, además, está abstraído del sistema host.

Qué es Docker y cómo funciona, introducción a Docker |

El valor de desplegar aplicaciones como instancias de Docker

¿Qué beneficios obtienen los equipos de desarrollo desplegando sus aplicaciones como contenedores? La lista puede llegar a ser muy larga, pero las ventajas principales asociadas a los contenedores se pueden resumir así:

  • Solo se tiene que programar la aplicación una sola vez. Dado que una app en Docker se ejecuta dentro de un contenedor, y el contenedor se puede ejecutar en cualquier sistema operativo que tenga Docker instalado, no se tiene que programar y configurar el software para diferentes tipos de plataformas hardware o sistemas operativos en los que tiene que poder ejecutarse. Solo tienes que programarlo una sola vez para Docker.
  • Se obtiene una mayor consistencia entre los entornos de prueba y los entornos de producción. Cuando se desarrolla con Docker, se hacen pruebas de la app dentro de un contenedor, y la despliegas dentro de un contenedor. Eso significa que el entorno de pruebas es idéntico al entorno en el que se va a ejecutar el software. En consecuencia, los desarrolladores ganan en tranquilidad y en confianza pues saben que los usuarios finales no se van a topar con problemas que el equipo que probó el software hubiera pasado por alto.
  • Se obtiene mayor modularidad. El desarrollo con contenedores es ideal para un enfoque basado en microservicios para el diseño de aplicaciones. Bajo este modelo, las aplicaciones complejas se dividen en unidades más discretas y pequeñas. Por ejemplo, y sin llegar a cambiar la arquitectura tradicional de la app, la base de datos quizás se ejecute en un contenedor mientras que el front-end de la misma se ejecuta en otro distinto. Este enfoque hace que la aplicación sea modular, reduciendo la complejidad de tener que mantener y actualizar la aplicación, dado que un error o un cambio relacionado con una parte de la app no requiere que se revise la aplicación completa.

Si un desarrollador se dedica a escribir código, hacer pruebas y desplegar el software, estas funciones de Docker le facilitan la vida y le harán más productivo.

Introducción a Docker para principiantes - Guiadev

El desarrollo con instancias Docker versus la virtualización tradicional

Revisando la lista anterior, uno se puede preguntar en qué se diferencian los contenedores de las máquinas virtuales. Y es que después de todo, si despliegas tu app en una imagen de una máquina virtual para una plataforma tipo VMware o KVM, también se obtiene la ventaja de programar una vez y desplegar donde sea (o al menos casi donde sea). Los entornos virtuales, además, ofrecen un nivel relativamente alto de consistencia entre el entorno de pruebas y el entorno de producción.

Todo eso es verdad. Sin embargo, los contenedores duplican de varias formas las ventajas de las máquinas virtuales, por ejemplo:

  • Las instancias de Docker son más ligeras. Para desplegar una app como imagen de una máquina virtual, lo más probable es que tengas que incluir un sistema operativo entero en la imagen. Con un contenedor, solo la app y unas cuantas capas de base tienen que ir dentro del contenedor. Esto se traduce en un proceso de montaje más sencillo, y, encima, la capacidad de poder de alojar muchos más contenedores en un servidor físico único. Además, arrancan mucho más rápido (en centésimas de segundo) y te puedes permitir el lujo de lanzarlos y cerrarlos automáticamente según las necesidades.
  • Los contenedores son muy, muy, muy consistentes. La imagen de una máquina virtual ofrece una consistencia bastante razonable entre el entorno de pruebas y el entorno de producción de una aplicación. Aún así, existe una variación mayor que en el caso de los contenedores. Las imágenes de las máquinas virtuales contienen diferentes tipos de sistemas operativos, y esos sistemas operativos tienen muchas más variables de entorno que Docker. Por ejemplo, puedes montar dos máquinas virtuales Linux con dos meses de diferencia, que tienen un nivel de parches o cierto software pre-instalado diferentes, y que pueden variar el resultado final. Con un contenedor Docker hay mucho menos margen para las variaciones: usando la misma versión de las imágenes te aseguras que son idénticos, lo que implica una consistencia mayor que el de las máquinas virtuales.
  • Los contenedores son gratuitos y de código abierto. Algunas plataformas de virtualización, como KVM, son gratis y de código abierto. Pero otras, incluyendo VMware, requieren generalmente una licencia comercial para uso empresarial. Docker es totalmente gratis para que cualquiera lo descargue e instale. Puedes pagar, eso sí, por servicios adicionales y soporte, pero el producto base es gratuito y de código abierto.

Utilizando algún orquestador de contenedores, sobre todo Kubernetes, puede crear despliegues automáticos todo lo complejos que necesites, con balanceado de carga automático, monitorización de salud y muchas otras características avanzadas, para las cuales tendrías que hacer encaje de bolillos su usases máquinas virtuales.

Desde el punto de vista del desarrollo y despliegue, los contenedores hacen lo mismo que las máquinas virtuales, pero mejor.

Docker Enterprise 2.1 ya está disponible - Hopla! software

El desarrollo con instancias Docker y DevOps

Pero aún no hemos terminado con toda la explicación de por qué Docker está causando tan buena sensación entre los equipos de desarrollo de software. El otro factor en juego es el cambio a DevOps.

DevOps es un enfoque de desarrollo y de despliegue de software que pone el énfasis en la colaboración transparente y fluida entre las personas encargadas de desarrollar el código («Dev»), las personas que administran las operaciones en producción («Ops», de operations), y todas las personas que realizan tareas intermedias (como las personas encargadas de probar el software, por ejemplo). El objetivo de DevOps es el de tirar abajo las parcelas que tradicionalmente han separado o dividido cada parte del proceso de desarrollo de software y permitir la entrega constante de actualizaciones en las apps.

Si uno se quiere dedicar a desarrollar apps siguiendo el enfoque de DevOps, Docker es muy útil porque te ofrece consistencia en los entornos de desarrollo que usa todo el equipo (sin andar moviendo máquinas virtuales pesadísimas: con un simple archivo de texto), y la naturaleza tan ligera de los contenedores, que ya hemos descrito arriba. Docker hace posible que los equipos de desarrollo programen y desplieguen software actualizado rápidamente. Por esa razón Docker y DevOps van tan bien de la mano.

Habiendo dicho lo anterior, Docker no es la única herramienta dentro del ecosistema de DevOps. Servidores de integración continua, frameworks de programación flexible y una infraestructura escalable también son componentes importantes de un flujo de trabajo DevOps para la mayoría de las empresas de desarrollo. El movimiento DevOps es anterior a Docker y no hay ninguna norma que diga que tienes que usar contenedores si quieres hacer DevOps. Por lo tanto, Docker y DevOps guardan alguna relación, pero no están ligados de manera congénita.

Aún así, si se quiere modernizar la forma en la que se desarrolla software en la empresa adoptando los principios de DevOps, Docker muy probablemente hará mucho por ayudarte a conseguir tus objetivos.

Qué es Docker y para qué sirven los contenedores

10 Beneficios de usar Docker y contenedores a la hora de programar desde una óptica empresarial

¿Por qué será que grandes empresas como INGPaypal, o Spotify usan Docker a día de hoy? ¿Qué otras razones contribuyen al crecimiento exponencial de Docker? Además de las razones explicadas arriba, repasaremos los beneficios de usar Docker teniendo en cuenta un punto de vista empresarial.

1. Retorno de la inversión y ahorro de costes

La primera ventaja empresarial de usar Docker es el ROI (el retorno de la inversión). Uno de los factores más importantes desde el punto de vista empresarial para optar por una u otra tecnología es el retorno de la inversión de cada una de ellas. Cuanto más pueda minimizar una solución los costes a la par que aumenta los beneficios, mejor solución es desde esta perspectiva, y más aún en empresas grandes que necesitan generar una facturación estable a largo plazo.

En este sentido, Docker puede ayudar a facilitar este tipo de ahorro reduciendo costes en recursos de infraestructura. La naturaleza de Docker permite que se necesiten menos recursos para ejecutar la misma aplicación. Dado que Docker tiene unos requisitos de infraestructura tan reducidos, las empresas son capaces de ahorrar en costes de mantenimiento y de servidores. Incluso si los llevas a la nube, ya que todos los principales actores (Azure, AWS, Google Cloud…) ofrecen contenedores Docker y Kubernetes y les sacan partido para sus propios servicios. Docker permite, además, como hemos visto, que los equipos de desarrollo sean más eficientes, lo cual constituye otro ahorro de costes por aumento de productividad y disminución de problemas. Y hablando de eso…

2. Estandarización y productividad

Los contenedores Docker garantizan consistencia a lo largo del proceso de desarrollo y despliegue de una aplicación, estandarizando el entorno en el que se ejecuta. Una de las principales ventajas de una arquitectura basada en Docker es precisamente la estandarización. Docker permite desarrollos, compilaciones, pruebas y entornos de producciones repetibles y replicables y sin necesidad de compartir enormes archivos. Poder hacer que toda la infraestructura de servicios a lo largo de todo el proceso de desarrollo sea estándar, permite a cada miembro del equipo de desarrollo trabajar en un entorno de producción paritario. Así los desarrolladores están más equipados para analizar y corregir errores dentro de la aplicación. Esto reduce la cantidad de tiempo que se pierde encontrando bugs y aumenta el tiempo disponible para programar mejores y más funcionalidades.

Los contenedores Docker permiten hacer cambios a tus imágenes Docker y hacerles un control de versión. Por ejemplo, si se realiza la actualización de un componente que rompe todo el entorno, es muy fácil retroceder a la versión anterior de una imagen Docker ya que la configuración no es más que un pequeño archivo de texto. Todo este proceso se puede probar en cuestión de minutos. Docker es rápido y permite hacer replicaciones y lograr redundancia ágilmente. Además, lanzar imágenes Docker es igual de rápido que ejecutar un proceso cualquiera de la máquina.

3. Eficiencia de imágenes de contenedor

Docker te permite crear una imagen de contenedor y usar esa misma imagen a lo largo de todo el proceso de despliegue. Una gran ventaja de esto es la capacidad de separar pasos no dependientes del proceso y ejecutarlos en paralelo. El tiempo que va desde la compilación a la producción se puede acelerar bastante.

4. Compatibilidad y mantenimiento más fácil

Erradica el problema de «en mi máquina funciona» de una vez por todas. Una de las ventajas de las que se beneficia todo el equipo de desarrollo es del de la paridad. La paridad en Docker significa que las imágenes se ejecutan igual independientemente del servidor de la máquina física en la se ejecutan. Para un equipo de desarrollo esto supone tener que dedicar menos tiempo configurando servidores, depurando errores específicos de problemas del entorno, y una base de código más portable y más fácil de configurar. La paridad también implica que la infraestructura de producción es más fiable y fácil de mantener.

5. Simplicidad y configuraciones más rápidas

Una de las ventajas principales de Docker es la forma en la que simplifica las cosas. Los desarrolladores pueden coger su propia configuración, transformarlo en código y desplegarlo sin problemas. Como Docker se puede usar en una amplia variedad de entornos, los requisitos de la infraestructura ya no quedan vinculados al entorno de la aplicación.

Creando servidores docker con Docker Machine - PLEDIN 3.0

6. Despliegue y escalabilidad rápidos

Docker consigue reducir el despliegue a cuestión de segundos. Esto se debe al hecho de que crea un contenedor para cada proceso y no arranca un sistema operativo. Los datos se pueden crear y eliminar sin temer que el coste de tenerlo que arrancarlo todo otra vez sea mayor de lo que se pueda permitir.

7. Pruebas continuas

Docker garantiza entornos consistentes desde la fase de desarrollo hasta la fase de producción. Los contenedores Docker se configuran para que conserven todas las configuraciones y dependencias internamente. Así, se puede usar el mismo contenedor desde desarrollo a producción con la seguridad de que no hay discrepancias ni intervención manual.

Si se necesita llevar a cabo una mejora durante el ciclo de lanzamiento de un producto, se pueden hacer los cambios necesarios a los contenedores Docker, probarlos, e implementar los mismos cambios a los contenedores que ya existen de antes. Este tipo de flexibilidad es otra ventaja clave de usar Docker. Docker verdaderamente permite compilar, probar y liberar imágenes que se pueden desplegar a través de múltiples servidores. Incluso si está disponible un nuevo parche de seguridad, el proceso es el mismo. Puedes aplicar el parche, probarlo y acto seguido liberarlo a producción.

8. Plataformas multi-cloud

Esta es posiblemente una de las grandes ventajas de Docker. En los últimos años, todos los proveedores principales de computación en la nube incluyendo Amazon Web Services (AWS), Microsoft Azure o Google Compute Platform (GCP), han adoptado la disponibilidad de Docker y Kubernetes, y han añadido soporte individual. Los contenedores Docker se pueden ejecutar dentro de una instancia de Amazon EC2, una instancia de Google Compute Engine, un servidor Rackspace server o VirtualBox, siempre y cuando el sistema operativo host soporte Docker. Si este es el caso, un contenedor que se ejecute en una instancia de Amazon EC2 se puede portar fácilmente a un entorno de la competencia. Además Docker funciona muy bien con otros proveedores como OpenStack, y se puede usar con varios gestores de configuración como Chef, Puppet, y Ansible, etc.

9. Aislamiento

Docker garantiza que las aplicaciones estén aisladas y segregadas. Se asegura de que cada contenedor tenga sus propios recursos y que estén aislados de otros contenedores. Se pueden tener varios contenedores para aplicaciones separadas ejecutando stacks completamente distintos. Docker, además, garantiza que la desinstalación de aplicaciones sea completa ya que cada aplicación se ejecuta en su propio contenedor. Si ya no se necesita una aplicación, lo único que hay que hacer es borrar su contenedor. No dejará atrás ningún fichero temporal o de configuración en el sistema operativo.

A todas estas ventajas habría que añadir que Docker también se encarga de que cada aplicación utilice solo los recursos que le han sido asignados. Una aplicación determinada no tirará de todos los recursos disponibles, que normalmente hace que baje el rendimiento o directamente dejen de funcionar otras aplicaciones.

10. Seguridad

Una última ventaja en este apartado de usar Docker es la de la seguridad. Desde el punto de vista de la seguridad Docker garantiza que las aplicaciones que se están ejecutando en los contenedores estén totalmente segregadas y aisladas las unas de las otras, como ya hemos comentado, otorgando un control total sobre la gestión y el tráfico de flujos. Ningún contenedor Docker puede entrar a ver los procesos que se están ejecutando dentro de otro contenedor. Desde un punto de vista de arquitectura del software, cada contenedor obtiene su propio conjunto de recursos que van desde las pilas de procesamiento hasta las de red.

Para Finalizar

Para concluir cabe destacar que los contenedores Docker comparten sus sistemas operativos para ser ejecutados como procesos aislados independientemente del sistema operativo de la máquina host. Docker se enorgullece, según sus propias palabras, de que sus contenedores se «pueden ejecutar en cualquier máquina, en cualquier infraestructura y en cualquier nube». La portabilidad, flexibilidad y simplicidad que esto permite son las razones fundamentales que explican por qué Docker ha sido capaz de crear tanta captación en tan poco tiempo.

Te esperamos en los próximos artículos en donde hablaremos más acerca de estos temas que hoy en día son de importancia e interés en el mundo de la tecnología.

¿Te gustaría aprender Microservicios con Spring Cloud y Docker?
Tenemos los Diplomados que necesitas. ¡Haz clic aquí!

About Author

NGuerrero

0 0 votos
Article Rating
Suscribir
Notificar de
guest
0 Comments
Comentarios.
Ver todos los comentarios
0
¿Te gusta este articulo? por favor comentax