¿Cómo resolver problemas de desarrollo con Docker?

Escrito por Connie Vargas

docker-bogota-desarrollo-bonitasoft-partner

¿Has tenido algún problema de desarrollo? Con Docker podrás disminuir e incluso eliminar los errores que puedas tener. Por ejemplo: te ha ocurrido que cuando envías aplicaciones o algún desarrollo a otro ambiente / máquina dejan de funcionar, pero sí lo hace en tu máquina? Zachary Williams nos cuenta la importancia de Docker y de qué manera podemos evitar esta situación.

Es algo usual que ocurra esta situación. Cuando se ejecutan aplicaciones dentro de diferentes entornos, es probable que existan problemas y dependencias que cambiarán el funcionamiento del desarrollo en un entorno u otro, donde si funcionen y en otros no.

Problemas al cambiar de entorno de desarrollo

Sucede cuando una aplicación requiere una configuración adecuada, un archivo no coincide o no se encuentra dentro del nuevo entorno. Se espera que llevar la aplicación, de un entorno de desarrollo, a uno de prueba a la de producción, las transiciones se hagan sin problemas. Sin embargo, existen múltiples problemas que pueden impedirlo: lenguajes con diferentes configuraciones o cualquier otra dependencia que pueda tener la aplicación.

docker-trycore

¿Cómo puedo solucionarlo con Docker?

Sin duda, hacerlo de la forma convencional llevará a que el mismo problema continúe ocurriendo. Para solucionar este tipo de impedimentos, la mejor solución es usar Docker. Con esta herramienta puedes crear imágenes que contengan lo necesario para que tu aplicación se ejecute correctamente; desde el código, bibliotecas o cualquier dependencia que se requiera para que corra sin errores.

Es posible tomar estas imágenes de Docker llevarlas a otros entornos e implementarlas para no tener preocupaciones por dependencias que causan problemas, puedes empaquetarlas e incluirlas en una imagen.

¿Qué es Docker?

A través de Docker puedes construir y compartir tus imágenes para luego ejecutarlas en los contenedores. Para esto deberás configurar el Docker Daemon que se conecta al corazón de tu sistema operativo host; esto te permitirá crear y administrar tus imágenes y contendedores de Docker.

El ABC de Docker

Pero, ¿qué son contenedores? Pongamos un ejemplo, ¿en dónde guardas el almuerzo para llevar al trabajo? Claro, en una taza. Podríamos llamarla contenedor. Cuando lo empacas tu almuerzo queda protegido, compacto y seguro mientras lo llevas a tu oficina.

Si no es así, cambia de contenedor, pues la idea de usarlo sería en vano, todo afuera se ensuciaría y ya no estaría ejerciendo su función.  Tu contenedor o taza debe tener todo lo necesario para mantener tu almuerzo a salvo para cuando vayas a comer. Debe cumplir su tarea en cualquier escenario: en tu casa, trabajo, en todos lados. 

En programación, los contenedores son muy parecidos a los de tu almuerzo. Nada debe salir de ellos y arruinar el ambiente que hay fuera de él. Dentro del contenedor debe existir un entorno óptimo, adecuado y específico para poner nuestra comida en él y que a esta no le pase nada.

En este caso, el almuerzo hace las veces de una aplicación, que puede requerir plugins, alguna versión de PHP para ejecutarlos y quizás otras cosas necesarias para que la app web corra de la misma manera en la que fue desarrollada. Para que se ejecute sin problemas en cualquier entorno, todos los anteriores se pueden añadir al contenedor, lo que facilita el desarrollo, movimiento y la implementación de aplicaciones.

Imágenes de Docker

Las imágenes de Docker son algo que construimos que se pueden implementar como contenedores. Dentro de estas tenemos la aplicación y las dependencias necesarias para ejecutarlas. Una imagen es una versión inactiva de un contenedor. “Es análogo a una clase en Java, mientras que los contenedores son análogos a los objetos”.

Las imágenes de Docker se cargan en servicios de alojamiento denominados registros, que albergan y distribuyen las imágenes. Estos registros incluyen repositorios de imágenes a los que se cargan nuevas versiones estas; las cuales pueden ser alojadas públicamente o en servidores privados, locales, como en la nube. Es decir, puedes extraer versiones actuales o antiguas de una imagen de Docker desde adentro del repositorio. “Si quisiera una imagen con PHP, por ejemplo, podría extraer de un registro con un repositorio de PHP y extraer cualquier versión de PHP que necesite para hacer que mi aplicación funcione”.

¿Qué ventajas obtengo al usar Docker?

Tanto Docker, como las máquinas virtuales pueden desempeñar funciones similares; aquí es bueno preguntarse por qué usar contenedores en lugar de máquinas virtuales para aislar las aplicaciones… bueno, es simple.

La ventaja de usar Docker, en vez de máquinas virtuales, es que los contenedores son mucho más ligeros que estas, lo cual tiene mucho sentido. “Como sabrás, cuando ejecutas una máquina virtual, esta tiene el host OS, el hipervisor y varios sistemas operativos invitados; esto ocupa una gran cantidad de memoria, incluso si no lo estás utilizando todo al tiempo. Se trata de memoria desperdiciada que podría utilizarse para ejecutar más aplicaciones y procesos”

Cuando ejecutas un contenedor Docker se libra del hipervisor y lo reemplazas con el Daemon Docker, para que todas las aplicaciones se ejecuten sobre el OS host.  Todos los contenedores tienen sistemas operativos ligeros que cuentan con los archivos necesarios para ejecutar correctamente la aplicación; muy diferente de todo el sistema operativo que corre en una máquina virtual.

docker-development

Lo ligero de los contenedores lo hacen una mejor opción que las máquinas virtuales, pues permiten ejecutar más que en una virtual y usar menos recursos.  Si lo comparamos en tamaños, en ocasiones los sistemas operativos que se usan en máquinas virtuales pesan alrededor de 100 gigabytes; mientras que los contenedores suelen ser de 100MB o incluso menos.

Los contenedores tardan solo segundos para entrar en funcionamiento, lo que no ocurre con una máquina virtual, que, según el tamaño de los archivos del sistema operativo, hace que se demore minutos en iniciar.

En conclusión, el primero ofrece agilidad para los desarrolladores; en una máquina virtual la sobrecarga es más alta que la de un contenedor, lo cual hace que el avance sea lento y ocupe más espacio. Docker resuelve mucho de estos problemas, sin embargo, tampoco creemos que esto deba reemplazar a las virtuales. Al final, ambas se pueden usar y aplicar en diferentes casos.

De igual forma, usar contenedores frente a las máquinas virtuales también tiene ciertas ‘desventajas’ como: algunos problemas de seguridad que pueden surgir, “el contenedor comparte el kernel del sistema operativo host. Si se ejecutan varios contenedores en un sistema y la seguridad del kernel se ve comprometida, podría significar una mala noticia para todos los demás contenedores que se ejecutan en él”.

 ¿Cómo podría beneficiarme al usar Docker?

Como mencionamos anteriormente, los contenedores son tan grandes como podría necesitarse y aun así causar una sobrecarga muy baja. Con estos puedes estar seguro de que solo usará los recursos necesarios para la ejecución de los procesos.

Mientras que la máquina tenga instalado Docker, sus imágenes y los contenedores funcionarán a la perfección, puesto que las dependencias se mantendrán dentro del contenedor. El mejor ejemplo es el anterior: una aplicación que trabaja en un entorno de desarrollo, pero no en uno prueba o de producción funcionará en todos los entornos de nuevo. “Este es un gran beneficio, ya que ya no necesita averiguar qué dependencias están causando problemas entre los entornos cada vez que mueve la aplicación”.

El hecho de que los contenedores Docker sean compatibles con plataformas en la nube es esencial porque promueve la portabilidad y escalabilidad de las aplicaciones.  Si estas no soportaran los contenedores, no se obtendrían todos los beneficios de usarlos; por ello es importante resaltar que su funcionamiento es apto para todas ellas.

Las imágenes de Docker facilitan el ciclo de vida del desarrollo de software (SDLC) con plataformas de integración continua CI/CD, compatibles con Docker. (véase: Bonita, herramienta de Transformación Digital)

Con Docker, puedes crear contenedores que tienen lo que requieres para ejecutar tu aplicación, facilitando la transferencia del producto en diferentes entornos. Ahorrando dinero y reduciendo el uso de la máquina virtual; y así una gran cantidad de memoria.  Estos contenedores son compatibles con los servicios de nube múltiple e implementaciones de CI / CD, lo que facilita la transición de estas herramientas.