Windows Server 2016: Crear un “Container” con IIS en Core Server

Continuando con notas sobre las nuevas capacidades de Windows Server 2016 en esta desarrollaré un ejemplo de la creación de “Containers” (Contenedores), donde crearé una imagen con un servidor web con IIS (“Internet Information Service”)

Decidí hacer esta nota porque he visto que aunque hay varias demostraciones en la web sobre el procedimiento, en casi todos los casos se han hecho sobre versiones “Technical Preview”, y ya estando disponible la versión final del sistema operativo hay mejoras y cambios que facilitan su implementación

Para poder aprovechar esta nota es necesario conocer la terminología de esta tecnología ya que en algún caso puede resultar confusa. Creo que lo mejor es “recurrir a las fuentes”, y aunque está en inglés recomiendo el siguiente enlace; “Windows Containers Quick Start

Lo que me he propuesto es la creación y configuración de un “Container” sobre una instalación de Windows Server 2016 sin interfaz gráfica (“Core”) por dos motivos:

  1. Independiente de si el sistema tiene interfaz gráfica o no, la configuración de “Containers” se hace prácticamente toda desde línea de comandos
  2. Uno de los objetivos del uso de “Containers” es justamente economizar en el consumo de recursos, así que nada mejor que sobre “Server Core”

Las máquinas que utilizaré en esta demostración son solamente dos:

  • DC1.ad.guillermod.com.ar: Controlador de Dominio
  • SRV4-CORE1.ad.guillermod.com.ar (Versión Core)

Lo primero que debemos hacer es asegurarnos que SRV4-CORE1 tenga instaladas las últimas actualizaciones, ya que es algo necesario para el funcionamiento de “Containers” por lo menos hasta el día de hoy

Por lo anterior, y por las configuraciones que haremos durante la nota, es necesario que esta máquina tenga conectividad a Internet

Así que usando SCONFIG con las opciones 5 y 6 configuro y descargo las actualizaciones. Si están en un ambiente virtual, como es mi caso, recomiendo que luego de esto crear un “Checkpoint” para que en caso de problemas no tener que repetir todo desde el principio

Algo más a tener en cuenta si SRV4-CORE1 es una máquina virtual, yo le he asignado 8GB de RAM, no dinámica, y además he habilitado “Enable MAC Address Spoofing”. También he permitido la virtualización anidada (Set-VMProcessor -VMName 05-SRV4-Core1
-ExposeVirtualizationExtensions $True
)

Entonces comencemos a instalar las últimas actualizaciones con las opciones mostradas más abajo, no capturaré las pantallas, ya que lo supongo conocido y además cambiarán con el tiempo

Entonces, y siempre en la máquina SRV4-CORE1 desde el CMD debemos ejecutar PowerShell y ejeuctaremos los siguientes comandos

Primero cargaremos el módulo de PowerShell correspondiente, y por supuesto confirmando la instalación correspondiente con Y”

Install-Module -Name DockerMsftProvider -Repository PSGallery –Force

Luego debemos instalar Docker, lo cual haremos con el siguiente comando y seleccionando ”A” para que instale todos los componentes:

Install-Package -Name docker -ProviderName DockerMsftProvider

Luego y para finalizar hay que reiniciar la máquina, y ya que estamos en PowerShell podemos utilizar

Restart-Computer –Force

Si todo ha funcionado correctamente ya podemos ver que Docker se ha instalado y tenemos tanto el cliente como el servidor, esto lo podemos ver con el comando

docker version

Para comenzar necesitamos una o más “Container OS Images”, podemos ver que no disponemos aún ninguna usando:

docker images (cuidado que es sensible a mayúsculas y minúsculas)

También podemos usar para ver los “Containers” creados con el comando

docker ps

Y si quisiéramos ver los que se están ejecutando, entonces el comando es

docker ps –a

Por supuesto que todavía no hay nada. Así que debemos comenzar descargando una “Container OS Image”. En mi caso descargaré una versión de Server Core, utilizando el comando

docker pull microsoft/windowsservercore

En forma similar si quisiéramos descargar la versión NanoServer, utilizaría

docker pull microsoft/nanoserver

Dependiendo del ancho de banda que tengan a Internet esto puede demorarse su tiempo, hay que descargar aproximadamente 4GB

Luego lo veremos más adelante, pero para no tener que hacer la descarga en varios servidores, la podemos guardar y luego copiarla a otro servidor

Observen lo siguiente si ejecutamos IPCONFIG, ha aparecido una nueva interfaz de red. Esta interfaz de red virtual es creada automáticamente y corresponde a direccionamiento privado donde se ejecutarán los “Containers”

Esta dirección IP sólo puede ser accedida por el “host” por lo que debemos configurar NAT para que sea accesible desde otras máquinas reales. Si luego esas máquinas externas quisieran acceder a diferentes sitios web que creemos en el “Container” deberán usar diferentes puertos

Para este caso debemos hacer una regla de NAT para que todo lo que llegue a la dirección IP real del host, sea redirigido a la dirección del “Container”, que al ser nuestro caso para acceso web, podemos redirigir TCP-80 del host a TCP-80 del “Container”

Y esto lo conseguimos con el comando:

docker run –it –p 80:80 microsoft/windowsservercore powershell

El parámetro “-it” permite acceso a la consola interactiva. el “-p 80:80” es el que hace el mapeo, el nombre del “Container”, y por último la aplicación que usará

Y atención con la pantalla que sigue porque no es fácil darse cuenta rápidamente. La consola ahora es PowerShell, pero ejecutándose dentro del “Container”, lo cual podemos confirmar si ejecutamos IPCONFIG

Como lo que vamos a instalar en este “Container” es un servidor web, simplemente debemos agregar el rol desde línea de comandos con:

Install-WindowsFeature web-server

Para no salir de la consola del “Container”, que lo apagaría,  pero poder ejecutar comandos en el host (SRV4-CORE1) ejecutamos CTRL+ALT+SUPR para arrancar el administrador de tareas, desde donde ejecutaremos una nueva “tarea”: CMD

Donde con IPCONFIG podemos ver cuál es la dirección real de SRV4-CORE1; en este caso 192.168.1.104

Desde esta consola podemos verificar la conectividad con el “Container”

Entonces resumiendo lo hecho hasta ahora: En SRV4-CORE1 hemos creado un “Container” con IIS, ambos conectados a través de una red interna. Pero además hemos hecho una regla de NAT para que todo lo que llegue a la dirección IP externa de SRV4-CORE1 puerto 80 sea reenviado a la dirección IP del “Container”

Si todo fue bien, desde una máquina diferente, usaré DC1, para conectarme al sitio web del “Container” pero accediéndolo desde la dirección IP externa de SRV4-CORE1 (192.168.1.104)

¿Funcionará? ;)

Sí, por supuesto si todo fue hecho correctamente

Inclusive si queremos una prueba demostrable que estamos en el “Container” podemos hacer algo más, como crear una página web personalizada, y accederla desde una máquina externa

Para no ser original, simplemente crearé una nueva página con el siguiente comando desde la consola del “Container”:

echo “Hola desde el mundo de los Containers” > C:\Inetpub\wwwroot\hola.html

Que puede ser accedida desde otras máquinas, igual que la página por omisión de IIS, sólo que indicando la página

Nuevamente, como hicimos al principio, podemos ver los “Containers” creados, y los que están en funcionamiento

Si deseo apagar el “Container” simplemente salgo de su sesión remota de PowerShell con el comando “Exit

 

Si quiero ponerlo en marcha lo haré con el siguiente comando

docker start <ID-Container>

Apaguemos ahora el “Container” como hicimos antes, con “Exit” en la consola PowerShell y luego

docker stop <ID-Container>

Y ahora viene algo muy importante con el tema “Containers”, una vez que tengo una imagen creada y personlizada es muy simple y rápido duplicarla con la configuración ya hecha, sin necesidad de comenzar todo desde el principio

Con el “Container” apagado debemos guardar la configuración hecha, lo cual haremos con el comando

docker commit <ID Container> <NombreDeMiImagen>

Podemos ver las imágenes que disponemos y verificar que está creada la nueva, con el comando

docker images

Y entonces ya podemos fácilmente duplicar la imagen personalizada; lo que sí debemos tener en cuenta es que como el host tiene una única dirección IP (192.168.1.104), para que el tráfico vaya a esta segunda imagen debemos cambiar el puerto de escucha en host, por ejemplo con 81

El comando es:

docker run –it –p 81:80 guillermod/webserver powershell

[Me he saltado de copiar esta pantalla] :(

De todas formas podemos verificar que se trata de un nuevo “Container” por ejemplo usando IPCONFIG y viendo que es diferente dirección que el anterior

Y podemos probarlo, ingresando al sitio web de este nuevo “Container” simplemente apuntando al puerto 81

Y de esta forma podremos crear rápidamente a partir de la imagen configurada y personalizada cuantas necesitemos

Simplemente debemos repetir el comando de creación, sólo teniendo en cuenta que debemos seleccionar un puerto diferente ya que todas compartirán la dirección IP del host. El modificador “-d” es para que quede funcionando en “background” y en este momento no abra la consola Powershell

docker run –it –d –p 82:80 guillermod/webserver powershell

docker run –it –d –p 83:80 guillermod/webserver powershell

Por supuesto que al estar todas funcionando sobre la misma dirección IP, para balancear carga, en este caso se necesitaría un balanceador que reparta por puerto a los diferentes “Containers”

Luego podemos detener los que no necesitemos simplemente con el comando

docker stop <ID-Container>

Si alguno no lo necesitáramos más podríamos eliminarlo fácilmente con el comando:

docker rm <ID-Container>

 

Detengámonos unos momentos a pensar :)

Hemos partido de una imagen “liviana” como es Core Server, a esta le hemos agregado una aplicación y personalizado. Con esto hemos creado otra imagen, de la que podemos implementar rápidamente cuantas copias necesitemos. Y además cada una de estas se podría a su vez agregar o personalizar para hacer nuevas implementaciones

¿Se dan cuenta lo poderoso de todo esto? Es algo análogo a “ladrillos” muy livianos, que podemos adaptar a nuestras necesidades para construir lo que sea necesario

Y sin contar, que aunque no se ve en la captura, los tiempos de encendido son infinitamente más chicos que cualquier máquina virtual

Algo que había dejado pendiente antes en la nota como es la capacidad de exportar e importar estas imágenes, para no tener que volver a hacer todo el proceso en otro servidor, o no tener que descargar imágenes nuevamente

Podemos exportar una imagen con el comando

docker save –o <Path/NombreArchivo.tar> <NombreImagen>

Entoces creamos una carpeta

Y ejecutamos el comando de exportación, lógicamente correspondientes a nuestro entorno, en este caso:

docker save –o C:\Imagenes\guillermodweb.tar guillermod/webserver

Y podemos verificar que se ha creado el archivo correspondiente

 

Como hemos podido ver, esto es nuevo y tiene cierto grado de complejidad por lo menos para los que no estamos muy familiarizados con el tema, ya que Docker existe desde hace tiempo, lo nuevo es la incorporación a Windows. Por lo tanto esta nota ha servido como una introducción al tema, y que nos servirá seguramente a futuro ya que es muy importante

Anuncios
Post a comment or leave a trackback: Trackback URL.

Comentarios

  • Nacho  On 06/12/2016 at 07:44

    Pero que bueno que es este tutorial.

    Tenia mucho miedo y dudas sobre los container pero me has aclarado todo perfectamente.

    Gracias Guillermo

    • Guillermo Delprato  On 06/12/2016 at 09:05

      ¡Gracias Nacho! Pero si realmene no te han quedado dudas entonces voy a comenzar a hacerte preguntas, porque a mí me quedan varias Ja ja ja

Este espacio es para comentarios sobre la nota. No es un sitio de soporte

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: