Docker es una necesidad en las TI

El desarrollo de aplicaciones hoy en día requiere mucho más que escribir código. Múltiples lenguajes, marcos, arquitecturas e interfaces discontinuas entre herramientas para cada etapa del ciclo de vida crean una enorme complejidad. Docker simplifica y acelera su flujo de trabajo, al tiempo que brinda a los desarrolladores la libertad de innovar con su elección de herramientas, pilas de aplicaciones y entornos de implementación para cada proyecto, lo que lo esta convirtiendo hoy en dia en una necesidad en TI para que nuestros proyectos de software sean competitivos.

¿Qué es Docker?

Docker es una herramienta/utileria de codigo abierto, diseñada para facilitar la creación, implementación y ejecución de aplicaciones usando contenedores que permiten al desarrollador empaquetar una aplicación con todas las partes que necesita, como bibliotecas y otras dependencias, y desplegarla como un solo paquete. Al hacerlo, gracias al contenedor, el desarrollador puede estar seguro de que la aplicación se ejecutará en cualquier otra máquina que soporte Docker, independientemente de cualquier configuración personalizada que pueda tener la máquina que pueda diferir de la máquina utilizada para escribir y probar el código.

¿Qué es un contenedor?

Los contenedores son una unidad estandarizada de software que permite a los desarrolladores aislar su aplicación de su entorno, resolviendo el dolor de cabeza de "funciona en mi máquina". Para millones de desarrolladores de hoy, Docker es el estándar de facto para crear y compartir aplicaciones en contenedores, desde el escritorio hasta la nube. Estamos construyendo sobre nuestra experiencia conectada única desde el código hasta la nube para desarrolladores y equipos de desarrolladores.  Las imágenes de contenedor se convierten en contenedores en tiempo de ejecución y, en el caso de los contenedores de Docker, las imágenes se convierten en contenedores cuando se ejecutan en Docker Engine. Disponible para aplicaciones basadas en Linux y Windows, el software en contenedores siempre se ejecutará de la misma manera, independientemente de la infraestructura. Los contenedores aíslan el software de su entorno y garantizan que funcione de manera uniforme a pesar de las diferencias, por ejemplo, entre el desarrollo y la puesta en escena.

¿Para quién es Docker?

Docker es una herramienta que está diseñada para beneficiar tanto a los desarrolladores como a los administradores de sistemas, lo que la convierte en parte de muchas cadenas de herramientas de DevOps (desarrolladores + operaciones). Para los desarrolladores, significa que pueden concentrarse en escribir código sin preocuparse por el sistema en el que finalmente se ejecutará. También les permite tener una ventaja inicial mediante el uso de uno de los miles de programas ya diseñados para ejecutarse en un contenedor Docker como parte de su aplicación. Para el personal de operaciones, Docker brinda flexibilidad y reduce potencialmente la cantidad de sistemas necesarios debido a su tamaño reducido y sus gastos generales más bajos.
Docker es de código abierto . Esto significa que cualquier persona puede contribuir a Docker y ampliarlo para satisfacer sus propias necesidades si necesita funciones adicionales que no están disponibles de forma inmediata.

¿Que beneficios tiene el uso de docker?

Los beneficios del uso de docker son muchos, que hoy en dia es una necesidad en las TI, tanto en cada desarrollador de software, como en todo el equipo en  la cadena productiva del ciclo de desarrollo de software. Aqui menciono algunos:

Beneficios directos al desarrollador individual

Como desarrollador podemos enfrentarnos a este tipo de problemas:

  • Tengo 2 sistemas operativos en mi entorno, y quiero probar mi aplicacion
  • Mi organizacion me asigna a un proyecto que utiliza otras herramientas
  • Necesito cambiar de equipo de computo y que funcione lo que tenia con poco esfuerzo y en forma rapida.
  • Tengo un equipo de computo, uno en casa y otro en la oficina y pierdo tiempo en configurar cambios en la infraestructura.
  • Necesito probar el manejo sincronizados mis entornos localmente
  • Quiero hacer una rapida prueba de concepto de una tecnologia.
  • Tengo problemas o conflictos en librerias y aplicaciones en mi maquina local.
  • Neceisto automatizar mi despliegue para que lo pruebe el cliente.
  • Necesito tener un ambiente aislado igual al de produccion.

Son muchos y muy buenos beneficios personales el poder con el uso de docker que con la vitualizacion no me permite porque consume muchos recursos. Poder resolver estos problemas, y ademas tener las habilidades para incorporarnos a un equipo que use docker que ya esten familiarizados.

Algunos beneficios en el equipo de desarrollo:

Retorno de la inversión y ahorro de costos

El mayor impulso de la mayoría de las decisiones de gestión al seleccionar un nuevo producto es el retorno de la inversión. Cuanto más una solución pueda reducir los costos y, al mismo tiempo, aumentar las ganancias, mejor será una solución, especialmente para las grandes compañías establecidas que necesitan generar ingresos estables a largo plazo. En este sentido, Docker puede ayudar a facilitar este tipo de ahorro al reducir drásticamente los recursos de infraestructura.

Estandarización y productividad

Cuando se crea una aplicación no contenida en contenedores, generalmente necesita controlar la versión del código fuente y luego buscar implementar este código en múltiples entornos a lo largo de su ciclo de vida. Esto puede ser de prueba, preproducción, UAT o cualquier otro entorno hasta la producción. Este proceso es falible y puede significar que la aplicación se ejecuta en entornos completamente diferentes cada vez. Con una aplicación en contenedor, implementa la aplicación en una imagen, que es una versión empaquetada de todo el entorno y las instrucciones para ejecutar la aplicación en ese entorno. Luego, esta imagen puede controlarse por versión y pasar por los diferentes entornos, lo que significa que muchas de las variables se eliminan de cada entorno, lo que facilita la investigación de cualquier problema. Esta ventaja se extiende a la ejecución local, ya que para probar una aplicación en contenedores localmente, ¡puede obtener la imagen relevante y hacerla operar!

Esto significa que está ejecutando la aplicación exactamente en el mismo entorno en el que se ejecuta en producción.

Docker y seguridad

Docker brinda seguridad a las aplicaciones que se ejecutan en un entorno compartido, aunque los contenedores por sí mismos no son una alternativa para tomar las medidas de seguridad adecuadas, estos nos brindan el mismo potencial que una maquina virtual bien administrada en cuanto a capas de seguridad que se deseen incorporar, balanceando las mejores practicas de seguridad y rendimiento.
En el caso de la virtualización convencional de hardware, las vulnerabilidades del sistema operativo generalmente afectan a una sola máquina virtual, en una virtualización del sistema operativo tienen efecto sobre todos los contenedores, porque son ejecutados sobre el sistema operativo, incluso pueden ser ejecutado "dentro" de otros contenedores (docker-in-docker).

Pruebas de software

En un escenario muy comun (dev, test, uat, prod), tendríamos unas cuantas máquinas virtuales encargadas de hacer todas estas tareas, las cuales demandan tiempo en configuracion, administracion, memoria, cpu, espacio en disco.
Como el tiempo es dinero, nos preguntamos,y ¿cómo hacer un entorno mucho más ligero, más fácil de escalar y más sencillo de portar?. Con el uso de contendores de docker.
¿Que necesitamos para construir un entorno de Integración Continua?:
– Monitorizar el repositorio de código fuente.
– Compilar el producto.
– Pasar los tests automáticos.
– Auditar el código de forma automática.

Recuperación de problemas 

Con aplicaciones estándar, cuando hay un problema, es posible que deba reiniciar la aplicación para recuperarse. En un entorno normal, esto podría causar efectos colaterales como archivos bloqueados, procesos congelados, memoria no liberada, etc. Sin embargo, con una aplicación en contenedor, todo lo que necesita hacer es detener el contenedor e iniciarlo nuevamente. Como todo lo que está dentro de los contenedores está aislado del resto del sistema, también se aíslan los posibles problemas que sucedan dentro del contenedor y poderlos monitoriar.

Retroceder (rolback)

Cuando ocurre un problema en producción con una aplicación no contenida en contenedores, puede ser difícil determinar dónde se introdujo el problema. Idealmente, siempre intentaríamos solucionar los problemas, pero en ciertas empresas, cualquier problema o tiempo de inactividad puede ser muy costoso y la reversión podría ser una solución temporal razonable. Sin embargo, esto puede ser difícil de hacer, especialmente si tiene varias aplicaciones hablando entre sí y dependencias externas como una base de datos.
Pero con una aplicación en contenedor, ¡simplemente puede volver a una imagen anterior de su aplicación y reiniciarla! Si su aplicación tiene almacenamiento externo, es posible que deba considerarlos, pero la reversión de la aplicación en sí es simple. También es más fácil averiguar a qué versión puede revertir de forma segura, ya que cada versión de la aplicación tendrá su propia imagen para que pueda ir a esa imagen específica y probarla localmente o en cualquier entorno antes de realizar cambios en la producción.

Imágenes públicas

La contenerización ya no es una tecnología nueva y ha alcanzado un buen nivel de madurez, lo que significa que algunas de las empresas más grandes del mundo se han sumado. Estas empresas (como IBM, Microsoft, Sun, etc.) han creado cómodamente sus propias imágenes disponibles públicamente para que las utilice localmente.
 
Despliegue simplista

En una canalización de CI normal, para implementar la versión de su aplicación en muchos entornos, necesitaría acceder al código de algún tipo de repositorio en diferentes etapas, compilar ese código y luego intentar implementar los artefactos. Alternativamente, puede compilar la aplicación una vez y pasar los artefactos de compilación que aún deben descomprimirse e implementarse. Qué contenedores puede construir su aplicación una vez, ejecutando la automatización según corresponda y luego empaquetar esto como una imagen y pasarlo a diferentes etapas. Algunas imágenes excelentes estan listas y disponibles para CI y herramientas basadas en pruebas.

Algunos ejemplos que he usado antes son:

  • AlpineLinux: imágenes basadas en Linux, que se han extendido para muchos lenguajes como Java, Python y Javascript.
  • Bases de datos: múltiples tecnologías como Oracle, Cassandra y DB2, así como tecnologías en la nube como DynamoDB de AWS y tecnologías No-SQL como MongoDB
  • Transmisión: las imágenes de la ventana acoplable de Kafka y RabbitMQ son las que he usado, pero otras tecnologías de transmisión también tienen imágenes de la ventana acoplable pública.

Hay miles de muchas otras oficiales por empresas o personalizadas, en www.dockerhub.com

Utilidades y PoC

Otro uso de las imágenes disponibles públicamente es poner en marcha utilidades y servicios sobre los que tiene un control total. En lugar de tener que acceder a un servidor físico en algún lugar, puede descargar y utilizar estas imágenes de forma sencilla y gratuita.  Algunos ejemplos de esto que he usado son:

    Wiremock: si necesita tener algo que se ejecute y simule las llamadas de descanso, hay una imagen de Wiremock que puede descargar y ejecutar
    FTP / SFTP: un conjunto de imágenes muy útil para cualquier momento en el que necesite ejecutar un servidor FTP o SFTP, que luego puede consultar e interrogar para verificar los archivos que se reciben
    SMTP: he usado una imagen llamada MailHog para correos electrónicos antes, lo que significa que puede crear un contenedor a partir de esto y tener su propio servidor SMTP para acceder y recuperar los correos electrónicos, excelente para la automatización.
    HTTP: una imagen simple que ejecuta un servidor http que abre rutas para solicitudes, lo que significa que cualquier lugar donde envíe solicitudes a un servicio externo se puede señalar aquí para verificaciones automáticas para garantizar que esos mensajes se envíen correctamente
    Impresoras Zebra: muy útil para automatizar los cheques hacia y desde las impresoras en las que desea asegurarse de que se envían los datos correctos a una fuente de impresión externa.

Hay cientos más de este tipo de imágenes disponibles y, para mí, esta es la forma más importante en que las pruebas han sido revolucionadas por la contenedorización de dicjer.

Empezando

A continuación, se muestran algunos recursos que lo ayudarán a comenzar a usar Docker en su flujo de trabajo. Docker ofrece un tutorial basado en web con un simulador de línea de comandos con el que puede probar los comandos básicos de Docker y comenzar a comprender cómo funciona. También hay una guía para principiantes de Docker que le presenta algunos comandos básicos y terminología de contenedores. O mira el video a continuación para ver más en profundidad



Fuentes:
https://opensource.com/resources/what-docker

https://www.docker.com/resources/what-container

https://www.javiergarzas.com/2015/07/que-es-docker-sencillo.html

https://apiumhub.com/es/tech-blog-barcelona/beneficios-de-utilizar-docker/

 


 

Comentarios

Entradas más populares de este blog

Herramientas y buenas practicas para desarrolladores frontend profesionales

Contribuir en un proyecto de codigo abierto crea oportunidades y superación

Anatomía de un proyecto de código abierto