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:
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):
¿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:
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:
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.
¿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
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
Ya estoy adentro del contenedor:
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:
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?
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í:
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:
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"
Si verifico con docker ps –a ya el contenedor con el ID dc9eadae3c33 fue eliminado:
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
Ahora voy a verificar que esté en ejecución
Estos contenedores están disponibles y me puedo conectar a ellos usando el comando docker attach <ID> , por ejemplo docker attach ad0c0b3a9792
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
Ahora sí me puedo conectar al contenedor usando docker attach ad0c0b3a9792
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:
Me salgo con EXIT y si uso de nuevo docker ps –a veo a dockerbarba00
Pero dockerbarba00 no es una imagen que pueda usar como base para crear contenedores:
Si quiero usar dockerbarba00 como una imagen base para crear contenedores puedo usar el comando docker commit dockerbarba00 newcontainerimage
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
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!