Probando (y ejecutando ) Software de la forma correcta


Durante todos estos años como programador, mi mayor problema siempre ha sido la instalación de software y si es Open Source con mayor razón. Si eres un programador me entenderás que eso de fijar variables de entorno, copiar archivos, modificarlos es una jarana criolla en Barrios Altos. Incluso, hasta hace unos años era cool decir “voy a hacer una partición linux” para probar ciertos programas. Hoy eso queda huachafo.

La solución hasta hace un par de años, o incluso menos, era la de hacer máquinas virtuales con tu VMWare o Virtual Box si eras misio (pero no por eso con menos funciones). Simple, cuando querías algún otro sistema operativo prendías la máquina virtual y listo, instalabas ahí todo lo que querías probar. Para los que enseñaban Oracle, esta era la opción pues comenzaban la clase, hacían destrozos en su VM y luego regresaban a la versión original y listo para el siguiente turno.

Para las empresas, también las máquinas virtuales ayudaron a aprovechar el hardware mucho mejor. La lección aprendida es que una PC, Servidor o cualquier tipo de computador no utiliza el hardware a plenitud a menos que se lo exijas, y con una sola aplicación no lo vas a lograr a menos que estés programando a bajo nivel. Con las máquinas virtuales eso se hizo más simple y  permitió ahorrar mucha plata a pesar de que aún hay gente que les tiene miedo.

La cosa no queda ahí. El año pasado de la nada recibí un correo presentando un proyecto llamado Dockers que no tiene nada que ver con pantalones. Después de muchas pruebas puedo decir ahora que es lo que faltaba tanto para programadores como para administradores: La posibilidad de crear entornos aislados donde una aplicación pueda correr, casi como una VM pero para una aplicación en particular. El día de hoy ya veo porque tiene cada vez mas empresas apoyando esta tecnología incluso grandes como Google.

Primero tratemos de ver en forma simple de que se trata Dockers. Primero pensemos en una app que puede ser Java. Para que funcione bien hemos aprendido todos estos años que hay que fijar primero el Entorno, es decir, las rutas y variables indicando donde están los archivos principales y los valores que indiquen que version de Java estamos usando. Para muchos esto queda oculto pues le dan al instalador en Windows y no hacen nada mas. Los verdaderos programadores de Java en cualquier plataforma han tenido que fijar su entorno para lograr trabajar sin problema. Con el entorno fijado, ahora hay que asegurar que estamos usando la versión correcta del SDK  para compilar los programitas y también verificar la versión del runtime. Y, finalmente para casos extremos ya teníamos que fijarnos que ciertos puertos estuvieran disponibles para cosas raras como JMX o JMS o probar un servidor HTTP. Todo esto era algo que tomaba casi 1 día en configurar y probar para recién empezar a programar o para publicar nuestra aplicación en producción.

En resumen: Entorno, Archivos y Red.

En una VM no hay problema porque es como tener una máquina limpia para una sola aplicación, pero ya vemos que es casi un desperdicio a pesar de que podemos controlar la asignación de recursos. Aquí es donde entra Dockers. ¿Qué tal si en lugar de 1 máquina nos dan 1 usuario totalmente limpio para nuestra aplicación? Ya sabemos que los entornos de ejecución de cada usuario son totalmente independientes con excepción de los servicios y la configuración de red. Lo principal aquí es que una app ejecutada bajo el usuario Juan no se puede tumbar a otra app que se ejecuta bajo el usuario Andrés a menos de que se trate de un bug muy feo.

Docker hace eso, crea una máquina virtual en tu máquina y crea un usuario para cada “VM” que quieras usar y le agrega un administrador de archivos y de configuración de red de tal forma que tu solo tienes que acceder a tu app a través del un IP virtual en tu máquina y un puerto. Genial. Esto significa que si quieres jugar con entornos como Nginx, Yii2, Node.js y demás que están fuertemente ligados a entornos ya no necesitas tener un entorno con variables PATH gigantes, pero lo mas importante, ya no vas a configurar tu entorno nunca mas.

La cosa no queda ahí nomás. Docker provee un registro o biblioteca de “Contenedores” que no son más que aplicaciones ya configuradas listas para usar. Por ejemplo, por alguna razón Couchbase no me funciona en Windows, después de varios días de prueba me puse Dockers y bajé un contenedor con Couchbase ya listo y funcionando en menos de 5 minutos, en un par de comandos. Lo mismo en Mac OSX, pues como saben viene con su propio PHP y hay casos como YII2 que requiere de un PHP mas reciente, después de meses de fallar, le puse Docker al Mac y el contenedor Yii2 y listo en 5 minutos. Para un entorno productivo el proceso tendría que ser mas o menos igual, con la diferencia que habría que fijar los volúmenes de seguridad y configurar un poco mas a medida la maquina virtual host y todo eso, pero lo mas pesado ya no sería problema.

Ahora, Docker no es para todo tipo de aplicaciones. Básicamente, Docker es para servicios del lado del servidor que puedan ser publicados de forma “headless”. En cristiano, si tu app del lado de servidor se instala tipo Windows, ya fuiste. La cosa es que la instalación del servicio se pueda hacer mediante la simple copia y configuración de archivos, algo que para el mundo UNIX es algo normal. Además, se debe tener en cuenta que Docker utiliza un sólo “HOST” virtual donde pone a todos los contenedores, y por ahora ese HOST corre Linux. No creo que pase mucho para que Microsoft haga algo al respecto.

Por mientras, hay una serie de funciones adicionales que tiene Docker que hay que revisar como es la gestión de volúmenes a fin de hacer cosas interesantes como “Contenedores” redundantes apuntando a un mismo espacio en disco. Cool.

Mientras tanto, para ser superficial, Docker es un “must have” si es que eres programador y estas con el tema de desarrollo de aplicaciones basadas en el mundo Open Source. Y si eres un “hard core” hay otra cosa mágica llamada Vagrant pero ya será tema de otro post.

Dense una vuelta por Docker.com y dejen de perder el tiempo fijando variables de entorno y compatibilizando versiones.




    Leave a Reply

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / Change )

    Twitter picture

    You are commenting using your Twitter account. Log Out / Change )

    Facebook photo

    You are commenting using your Facebook account. Log Out / Change )

    Google+ photo

    You are commenting using your Google+ account. Log Out / Change )

    Connecting to %s



%d bloggers like this: