101 COSAS QUE PUEDES HACER CON CLOUD OS: Cosa 99

Hola amigos, en una entrega anterior les hablé acerca de la plataforma Docker, la cual permite trabajar con contenedores. Es una plataforma de un tercero –no es una empresa de Microsoft- que permite tener micro Sistemas Operativos o contenedores listos para ejecutar aplicaciones. En esa ocasión trabajé con la plataforma Linux CoreOS, que está diseñada especialmente para trabajar con contenedores y en Microsoft Azure existe una imagen predefinida con CoreOS instalado.

Pueden ver ese post Aquí.

Pues bien, resulta que Windows Server 2016 que está próximo a salir y el cual se encuentra en modo Preview también tiene tecnología de contenedores incorporada. Si quieren descargar Windows Server 2016 Preview lo pueden hacer Aquí.

Además en Microsoft Azure existe una imagen predefinida de Windows Server 2016 que se denomina Windows Server Container Preview y está hecha especialmente para trabajar con contenedores.

En este post voy a usar esa máquina que ya viene predefinida en Microsoft Azure y es la última de las máquinas Windows Server que aparecen en la lista de máquinas disponibles Microsoft en el portal., tal como se muestra en la imagen:

image

Esta funcionalidad de contenedores se encuentra en Windows Server 2016 Preview tal como ya lo mencioné al principio de este post. Para poner en marcha los contenedores en esta plataforma hay que hacer unas labores especiales.

Pero en este documento voy a trabajar con la máquina que ya viene en Microsoft Azure lista para su uso. Yo creé una máquina con esta imagen predefinida y simplemente ingreso con el cliente de Remote Desktop (Terminal Services Client):

image

¿Sorprendidos? Bienvenidos al nuevo Microsoft… Esta es la máquina lista para su uso, no esperen modo gráfico o Server Manager, lo que sí funciona en esta plataforma es el SCONFIG para configurar parámetros como el hostname, IP, o Remote Desktop entre otros parámetros.

Aquí hice un SCONFIG para mostrárselo a ustedes:

image

Simplemente escribí 15 para salir de SCONFIG.

Ahora voy a invocar a Powershell, para ello basta con escribir powershell. Observen que ya me encuentro en el prompt PS:

image

Ejecuté IPCONFIG | MORE y observo que esta máquina tiene la IP 192.168.0.4/24 asociada al adaptador Ethernet 3 debido a que yo creé una red virtual previamente con este rango de IP’s. Además tiene la IP 172.16.0.1/12 en el adaptador vEthernet.

image

¿Por qué es importante lo que acabo de mencionar? En esta máquina en particular hay una interface adicional (vEthernet) que se va a usar para asignar IP’s a los contenedores.

Bueno, como esta versión de Windows se encuentra lista con Docker y con imágenes Windows predefinidas, puedo ejecutar el siguiente comando: docker images

image

Aquí hay 3 imágenes de contenedores con Windows, 2 de estos contenedores estaban predefinidos en la imagen de la máquina de Microsoft Azure que creé de la galería (los denominados windowsservercore) y uno de ellos lo creé yo, el que se denomina nginx_windows.

Si quiero ejecutar uno de esos contenedores basta con escribir

docker run -it --name dockertest00 windowsservercore cmd

En donde dockertest00 es el nombre con el que voy a ejecutar mi contenedor basado en windowsservercore

image 

Ya estoy adentro del contenedor:

image

Esta es una máquina Windows Server Core en donde puedo invocar Powershell por ejemplo o crear directorios, no perdamos de vista que está corriendo dentro de una máquina virtual de Azure que se denomina core00.

Voy a crear directorios y a hacer cambios sobre este contenedor:

image

Creé 5 archivos de prueba rápidamente usando el comando echo.

Observen que al ejecutar IPCONFIG la IP de este contenedor es 172.16.0.2/12 que está dentro del rango de IP’s del cual les hablé al principio, ¿Se acuerdan?

image

Puedo salirme del contenedor usando el comando EXIT, en este caso hay que escribir EXIT 2 veces, la primera vez para salir de Powershell y la segunda vez para salir del contenedor en sí:

image

Ya estando en mi máquina Windows Server Container Preview puedo ejecutar el comando docker ps –a para ver la lista de contenedores en ejecución en esta máquina:

image

Observen que cada contenedor tiene un ID único que lo identifica, como por ejemplo dc9eadae3c33

Si quiero eliminar un contenedor puedo usar el comando docker rm <ID Contenedor> , por ejemplo docker rm "dc9eadae3c33"

image

Si verifico con docker ps –a ya el contenedor con el ID dc9eadae3c33 fue eliminado:

image

Uno no se debe preocupar en este momento por haber eliminado este contenedor, lo que hicimos fue crearlo a partir de una imagen (¿Recuerdan el comando docker images?), de modo que si necesitamos más contenedores simplemente los creamos.

Voy a ejecutar un contenedor a partir de las imágenes disponibles como y alo hice anteriormente, por ejemplo voy a usar

docker run -it --name dockerbarba00 windowsservercore cmd

image

Ahora voy a verificar que esté en ejecución

image

Estos contenedores están disponibles y me puedo conectar a ellos usando el comando docker attach <ID> , por ejemplo docker attach ad0c0b3a9792

image

Pero observen que el contenedor aparece disponible y a pesar de ello no es posible establecer la conexión y lo que se me indica es que debo iniciarlo primero, por lo tanto debo iniciarlo usando docker start <ID> , en este ejemplo voy a usar el comando 

docker start ad0c0b3a9792

image

Ahora sí me puedo conectar al contenedor usando docker attach ad0c0b3a9792

image

De nuevo estando en este contenedor creé una carpeta con varios de archivos de prueba, con el propósito de usarlos en el despliegue de futuros contenedores basados en esta imagen. Es como si fueran los archivos de mi aplicación, por ejemplo:

image

Me salgo con EXIT y si uso de nuevo docker ps –a veo a dockerbarba00

image

Pero dockerbarba00 no es una imagen que pueda usar como base para crear contenedores:

image

Si quiero usar dockerbarba00 como una imagen base para crear contenedores puedo usar el comando docker commit dockerbarba00 newcontainerimage

image

Observen que ya tengo en mi lista una nueva imagen denominada newcontainerimage. Ahora puedo crear un contenedor basado en esta imagen usando

docker run –it --name nuevocontainerbarba00 newcontainerimage cmd

¿Se acuerdan de la carpeta Test1? Es la que contiene los archivos de nuestra aplicación y cada vez que use esa imagen voy a tener el mismo contenido

image

Puedo crear múltiples contenedores para mi aplicación, por ejemplo si es un sitio web puedo crear varias instancias con el mismo contenido y a través de un balanceador publicar mi sitio… puedo tener incluso cientos de esos contenedores exactamente iguales, son más livianos…. la verdad hay muchas posibilidades.

Este tema está recién salido del horno, hay muchos usos de los contenedores como por ejemplo para ambientes de prueba, reuso de componentes de aplicaciones, seguimiento de versiones de aplicaciones, entre otros.

Espero les haya gustado y sigan investigando más al respecto.

¡Nos vemos pronto!