101 COSAS QUE PUEDES HACER CON CLOUD OS: COSA 54

COSA #54: DOCKER

image

Hola amigos, hoy les voy a hablar de Docker, que es una plataforma abierta que nos permite construir y distribuir aplicaciones de una manera muy rápida y eficiente.

Ustedes se preguntarán por qué estoy hablando de aplicaciones cuando este Blog está orientado a profesionales de IT. Pues bien con la nueva tendencia a integrar Desarrollo y Operaciones (DevOps) tecnologías como Docker nos ayudan a cerrar la brecha entre estas 2 áreas, que en un tiempo fueron consideradas muy disímiles y tenían muchos conflictos entre sí pero que hoy en día deben trabajar en equipo para desplegar aplicaciones y servicios en una compañía.

Docker no es una tecnología de Microsoft pero puede ser usada en nuestra plataforma sin inconvenientes.

Existe una distribución de Linux que denomina CoreOS (https://coreos.com/) que se encuentra disponible en la galería de imágenes de Microsoft Azure y que es una distribución de Linux lista para manejar “contenedores” Linux que en la práctica son pequeñas máquinas Linux con aplicaciones ejecutándose. En pocas palabras puedo tener una máquina con CoreOS y dentro de ella ejecutar pequeñas máquinas Linux por ejemplo con Ubuntu.

Recuerden que las máquinas de Azure son virtuales, de modo que dentro de una máquina virtual Linux (CoreOS) voy a tener en ejecución otras máquinas o contenedores Linux, por ejemplo Ubuntu. Este es un concepto nuevo y muy revolucionario que se basa en el hecho de que estas pequeñas máquinas –contenedores- tienen bastantes librerías en común, de modo que comparten de alguna manera estas librerías y sólo usan los componentes que requieren para su funcionamiento individual.

Bueno, con esa breve introducción ¡A lo que vinimos! para este ejercicio voy a usar una VM de Azure con CoreOS. Las opciones disponibles en la galería son las siguientes:

image

En este ejercicio voy a usar la versión estable (CoreOS Stable). Para crear una VM en Azure pueden referirse a este Post de la documentación de Azure, sólo deben cambiar la imagen Windows por una una imagen del tipo Linux CoreOS.

Una vez creada la máquina vamos a ver cómo trabajar con contenedores y usar la plataforma

image.

Ya estoy dentro de mi máquina CoreOS –me conecté con putty- con el usuario abarba y para hacer cualquier operación debo usar la siguiente estructura sudo <comando>

En el caso de Docker, vamos a ejecutarlo siempre con sudo y un comando o parámetro, es decir:

sudo docker <comando/parámetro>

Si quiero lanzar un contenedor basta con ejecutar el siguiente comando:

sudo docker run -t -i ubuntu /bin/bash

Y voy a ver algo similar a lo siguiente:

image

Observen que antes me encontraba en CoreOS con el usuario abarba y ahora me encuentro en un Linux Ubuntu que es un contenedor con el ID 8ce70e96e4c1 con el usuario root, de hecho tengo que abrir otra sesión de putty para conectarme a CoreOS puesto que ya no me encuentro en CoreOS sino en el contenedor de Ubuntu. En este contenedor puedo ejecutar comandos como los de cualquier LinuxUbuntu en este caso-:

image

Este contenedor es un contenedor denominado interactivo, por la manera en que fue invocado.

De nuevo en mi sesión, puedo preguntarle a Docker por el estado de mi contenedor usando el siguiente comando: sudo docker ps

image

Ahí se ve el contenedor en ejecución con el ID 8ce70e96e4c1 que previamente había lanzado. Si lanzo otros contenedores se verán ejecución con el mismo comando:

image 

Observen la cantidad de información valiosa que me arroja el comando sudo docker ps como por ejemplo el ID de cada contenedor, la versión y el momento de creación y el status de cada uno de ellos.

Yo también puedo ejecutar imágenes de otras distribuciones como CentOS usando

sudo docker run -i -t -d centos /bin/bash

Observen ahora cuántos contenedores están en ejecución luego de lanzar el contenedor de CentOS:

image

¿Y si quiero detener un contenedor? Es tan simple como ejecutar sudo docker stop <ID> como se ve en el siguiente gráfico:

image

También hay que decir que si quiero ejecutar un contenedor en background y no de modo interactivo puedo usar el parámetro –d al lanzar el contenedor, por ejemplo:

sudo docker run -i -t -d centos /bin/bash

image

Y observen que me mantengo en el prompt de CoreOS a pesar de que lancé un nuevo contenedor.

Todo muy bien hasta ahora ¿Cierto? Ahora hablemos de la ejecución de aplicaciones en los contenedores.

Para este ejercicio vamos a usar una aplicación escrita en el lenguaje Python y que se encuentra en el Docker Hub que es un repositorio de contenedores y aplicaciones que pueden ser reutilizados por otros usuarios. Es posible que yo como usuario publique allí mis contenedores y/o aplicaciones y los haga públicos si así lo deseo.

Para este ejemplo voy a usar la imagen training/webapp que es una aplicación de ejemplo que contiene un Hola Mundo, como ya lo dije esta aplicación se encuentra en el Docker Hub y además usa Python Flask que es un mini-servidor web

Voy a ejecutarla con sudo docker run -d -P training/webapp python app.py

image

Si la aplicación no se encontraba descargada se descarga.

Ahora voy a verificar el estado de mis contenedores y aplicaciones (sudo docker ps)

image

O si uso –l con el comando puedo ver el último contenedor lanzado, que en efecto fue nuestra aplicación:

image

Observen que mi aplicación tiene su respectivo ID y además aparecen unos puertos. Pues bien, al publicar la aplicación fue necesario usar el parámetro –P para exponer los puertos que se van a usar al hacer la conexión a dicha aplicación para que muestre el “Hello world!” u “Hola mundo!”.

En este caso Docker expuso el puerto TCP 5000 (El puerto por defecto de Python Flask) en el contenedor, a través del puerto TCP 49153 en nuestro host CoreOS.

También hubiese sido posible levantar la aplicación usando el mismo puerto 5000 tanto para el contenedor como para nuestro host local pero ello hubiera limitado el uso de otra aplicación con Python Flask puesto que el puerto TCP 5000 ya hubiera estado en uso en el host CoreOS. Para usar el mismo puerto hubiese bastado con usar el siguiente comando:

sudo docker run -d -p 5000:5000 training/webapp python app.py

Yo volví a lanzar otro contenedor de la aplicación usando:

sudo docker run -d -P training/webapp python app.py

image

Lo más seguro es que al preguntarle por la ejecución de este último contenedor use un puerto distinto en el host CoreOS pero el mismo TCP 5000 en el contenedor… Observen que en efecto el nuevo contenedor usa otro puerto.

Blog00-CoreOS

Y si verifico los puertos que el host (nuestro CoreOS) está escuchando, aparecen los puertos de nuestros 2 contenedores, es decir los puertos 49153 y 49154

image

Si establezco conexión al puerto 49153 con un navegador puedo ver que aparece el “Hello world!” de la aplicación, aquí usé wget que en la práctica tiene el mismo efecto, pues guarda el index.html de la aplicación y si veo el contenido de este archivo veo “Hello world!”

image

O usando un navegador

image

image

Tanto el puerto 49153 como el 49154 funcionan para mostrar la aplicación web.

También pude haber usado el comando sudo docker port 675a24b4384c 5000 para ver el puerto que se está usando

image

O incluso pude haber usado sudo docker port nostalgic_wilson 5000 en donde nostalgic_wilson es el alias en el Docker Hub de alguien que publicó la aplicación.

Si quiero detener un contenedor en ejecución puedo usar en nuestro ejemplo:

sudo docker stop nostalgic_wilson

image

Y si quiero reiniciar un contenedor uso sudo docker start nostalgic_wilson

image

Observen que conserva el mismo ID que tenía antes. Si lo quiero eliminar de manera permanente debo usar sudo docker rm nostalgic_wilson

Blog01-CoreOS

Debo haberlo detenido antes de eliminarlo

image

¡Espero que lo que han visto hasta ahora les haya abierto la mente a nuevas posibilidades y a toda la potencia de esta plataforma para un despliegue muy rápido de aplicaciones! Si se necesitan más contenedores se pueden crear o destruir según las necesidades, además es posible crear clusters o pods de contenedores para una mayor disponibilidad.

Y lo mejor de todo es que ¡Microsoft anunció que en la próxima versión de Windows Server 2016 va a incorporar tecnología de contenedores! (Más información Aquí) Así que debemos estar preparados para todo lo que se viene.

Espero que les haya gustado este contenido y los invito a que prueben Docker y estén listos para todo lo que se viene con Windows Server 2016.

¡Nos vemos en la próxima! un abrazo.