DevOps para desarrolladores web con Visual Studio y Docker

Si hay una tendencia que se está tomando mucha fuerza en nuestro mundo son los contenedores de aplicaciones, la nueva forma de desplegar servicios en cloud para conseguir mucha más densidad que con máquinas virtuales. Los sistemas de contenedores tienen algunas características que a los desarrolladores como yo, acostumbrados a desplegar sobre servicios cloud que funcionan en máquinas virtuales, nos despistan un poco.

  1. La primera característica que tiene Docker es que los contenedores comparten el núcleo del sistema operativo con el host, de manera que no podemos ejecutar un contenedor Linux en Windows y viceversa.
  2. El aislamiento, aunque es mayor que a nivel de proceso, es menor que a nivel de máquina virtual y algunas cosas a las que estábamos acostumbrados no son posibles o se complican bastante; por ejemplo tener nuestra propia IP como en una VM. Esto implica que si queremos desplegar múltiples instancias de un servicio web, sólo una de las instancias puede estar en el puerto 80 y tendremos que utilizar un puerto diferente para cada nueva instancia. Para poder simular que tenemos múltiples webs en el mismo puerto dentro de un mismo servidor Docker necesitaremos configurar un balanceador de carga. Por ejemplo, podemos usar nginx que nos permite hacer de reverse-proxy y está disponible como imagen de contenedor.
  3. La tercera característica es el concepto de paquete, la navaja suiza de los Devops. Es muy interesante pues nos ayudará en el despliegue de nuestras aplicaciones. Al desplegar nuestra aplicación, especificaremos todas las necesidades en el paquete de contenedor. Existe un amplio repositorio de paquetes a través del Docker Hub, o podemos crear el nuestro propio. Este concepto es el que hará que nuestra aplicación se despliegue correctamente dentro de un contenedor, pues dentro del paquete se especifican todas las necesidades de la aplicación y durante el despliegue garantizaremos que todas las librerías, ejecutables o configuración que necesite nuestra aplicación esté disponible. Si somos cuidadosos se acaba el típico “It works on my machine” y conseguiremos replicar fácilmente y de forma confiable el entorno de ejecución de nuestra aplicación.

Y he aquí el concepto de DevOps, desarrolladores y profesionales de IT colaborando para que todo funcione como la seda. La especificación del entorno de ejecución la podemos hacer los propios desarrolladores o de forma conjunta con IT, pero de una manera formal y repetible mediante plantillas, lo que ahora llamamos la infraestructura como código. Se acabó pelearse con los profesionales de IT para que nos provisionen una máquina virtual con nuestras especificaciones vagas e imprecisas, de esta forma todos viviremos en un mundo mejor y con más tiempo para disfrutar y vivir en armonía.

La teoría es muy bonita, pero hasta ahora tampoco era tan fácil para nosotros los desarrolladores. Para que un entorno de contenedores funcione necesitamos desplegar un servidor de contenedores (Docker Server), un repositorio de paquetes, el cliente para ejecutar los montones de comandos que necesitaremos, algún sistema de balanceo, un sistema de orquestación, etc.

La buena noticia es que ya tenemos en Azure unas cuantas imágenes con todo lo necesario para ejecutar contenedores Docker tanto en Linux como en Windows Server 2016 (https://msopentech.com/blog/2014/08/15/getting_started_docker_on_microsoft_azure/) y gracias a una extensión de Visual Studio podremos crear el servidor, configurar y desplegar nuestra aplicación, todo desde Visual Studio.

Despliegue de una aplicación ASP.Net 5 en un contenedor Docker en Azure

Tenemos una nueva extensión para Visual Studio 2015 que integra todo lo necesario para utilizar Docker en Azure durante el desarrollo de nuestra aplicación: Visual Studio 2015 Tools for Docker. Tal como indican las instrucciones de la extensión, para que todo funcione bien también tenemos que instalar las últimas Web Tools y las herramientas de Azure:

1,

Una vez instalada la extensión podremos desplegar fácilmente nuestras aplicaciones en contenedores de Docker en Azure, de forma directa desde el propio Visual Studio.

Aplicación ASP.NET 5 básica

Durante este ejercicio, vamos a desplegar desde Visual Studio una aplicación ASP.Net en un contenedor Docker en Linux (aunque también tenemos una preview para contenedores con Windows Server). Para ello crearemos una aplicación ASP.Net 5 que ahora es multiplataforma.

Creamos una aplicación Web ASP.NET:

2

Y usamos la plantilla de ASP.NET 5 para una aplicación Web:

3

Para comprobar dónde se está ejecutando nuestra aplicación, sustituimos en la página index.cshtml de las vistas de Home el código del primer carousel-caption para que nos muestre el sistema operativo sobre el que se está ejecutando:

4

Despliegue del sitio web sobre un contenedor Docker

Una vez tenemos nuestra aplicación podemos publicarla desde el menú Publish, donde, gracias a la extensión que hemos instalado anteriormente, tendremos una nueva opción en el asistente de publicación para desplegar en contenedores Docker:

5

A partir de este paso podremos elegir entre utilizar una máquina de docker ya instalada en nuestra cuenta de Azure, crear un nuevo servidor o utilizar un servidor personalizado:

6

Si elegimos crear una nueva máquina virtual podremos elegir entre todas las posibilidades que tenemos en el Marketplace de Azure, incluida la nueva preview de Windows Server 2016 con contenedores:

7

En esta ocasión crearemos un servidor con Ubuntu. Esto creará y ejecutará una serie de scripts de powershell sobre resource manager para crear el servidor de docker donde podremos desplegar nuestra aplicación.

Una vez ejecutado ya podremos empezar de nuevo el proceso de publicación, esta vez directamente a nuestra docker machine:

image

Esto ejecutará los scripts de publicación que se han generado y tenemos disponibles dentro de nuestra solución. Instalará todo lo necesario en nuestra imagen docker para que nuestra aplicación pueda funcionar.

8

¿Qué hemos creado con todo esto?

La extensión de Visual Studio 2015 para Docker nos ha generado una plantilla de Resource Manager para la creación de la máquina virtual y toda la infraestructura necesaria (red, disco, etc…) en Azure. Esta plantilla estará dentro de la solución de Visual Studio, de forma que podremos modificarla para poder desplegar un servidor parecido en producción, pero con las características que necesitemos en ese momento:

image

Y para realizar el despliegue en Docker, el asistente de publicación crea un archivo DockerFile con las especificaciones de nuestro despliegue, en nuestro caso se especifica la imagen de ASP.NET multiplataforma usando el servidor Kestrel:

 FROM microsoft/aspnet:1.0.0-beta5
ADD . /app
WORKDIR /app
ENTRYPOINT ["./kestrel"]

Una vez creada podemos utilizar el cliente de Docker para ver la información de nuestro servidor, sólo lo podremos hacer desde una máquina que tenga instalado el certificado adecuado. Este certificado se instala durante el despliegue:

image

También podemos ejecutar el comando PS de Docker para listar los contenedores activos, en nuestro caso sólo tenemos uno en el puerto 80:

image

Y ejecutar el comando TOP para ver qué se está ejecutando en ese contenedor:

image

A partir de aquí ya podremos continuar con nuestro desarrollo y a la hora de entregar nuestra aplicación podremos proporcionar el paquete de Docker que asegura que nuestra aplicación funcionará tal como nosotros hemos especificado.

¿Qué necesito?

Tambien podemos desarrollar ASP.NET en otros sistemas operativos utilizando Visual Studio Code y usar las herramientas xcli y el cliente de Docker. Si queréis conocer más sobre Docker en Azure, os recomiendo la serie de artículos de mi compañero José Ángel.

 

Juan Manuel Servera

@jmservera

IoT & Cloud Technical Evangelist