Windows Containers

Configuración de Windows Containers paso a paso sobre Hyper-V

En la última Technical Preview de Windows Server, la TP3, una de las novedades incluídas más esperadas era la primera versión de la implementación de contenedores por parte de Microsoft en el sistema operativo. Si queréis conocer más detalles de todo lo relacionado con ello os recomiendo que consultéis la documentación que han hecho pública en MSDN.

Para facilitarnos todo el proceso de evaluación han creado una serie de scripts de PowerShell que automatizan todo el proceso. Desde cómo crear una máquina virtual en nuestro host para evaluarlo, cómo instalar un host en una máquina virtual existente o cómo actualizar uno configurado previamente. Todos los scripts están disponibles en el repositorio de GitHub de Microsoft, otra muestra más de cómo las cosas están cambiando dentro de la compañía.

Dado que me gusta conocer en detalle cómo funcionan las cosas, me he puesto a analizar los scripts para entender mejor los requisitos y la configuración necesaria. En este artículo revisaré el script New-ContainerHost.ps1

¿Qué hace el script?

Si estás trabajando en un equipo que tiene disponible Hyper-V, como puede ser las versión de cliente de Windows 10 o la de servidor 2016TP3, el script se encarga de descargarse una imagen de Windows Server 2016 TP3, generar una nueva máquina virtual de ella, instalar las herramientas necesarias y ponerla a funcionar. El cómo, lo revisaremos en los siguientes apartados.

Requisitos mínimos – Test-Version y Test-Admin

Como comentaba, existen una serie de restricciones de qué sistemas operativos pueden ejecutar el script. Para ello, lo primero que realiza es una verificación de que se cumplen dichos requisitos.

En primer lugar, la build del sistema operativo tiene que ser mayor que la 9600 para que el script funcione y mayor que la 10240 para que pueda emplear una de las novedades de PowerShell conocidas como PowerShell Direct, el acceso directo a las VMs en un host de Hyper-V a través del VMBus.

Tras ello comprobará si Hyper-V está instalado antes de continuar ya que sin él no es posible dejar nuestro entorno preparado.

Dado que para poder interactuar con algunos de los elementos necesarios del sistema es necesario disponer de usuario administrador en la máquina lo siguiente será comprobarlo. Si no ejecutamos el script como administrador, no podremos continuar tampoco.

Requisitos legales – Approve-Eula

A la hora de utilizar cualquier tipo de software necesitamos aceptar las condiciones de uso del mismo establecidas por el fabricante. En este caso, dado que va a descargarse una imagen de Windows Server 2016 TP3 y realizar la instalación, será necesario que leamos y aceptamos las condiciones para continuar con el proceso.

En este fragmento de script tenéis una buena forma de solicitar al usuario confirmación de una acción utilizando el componente de ChoiceDescription de System.Management.Automation.Host.

Configurando el host – New-ContainerHost

Esta es la función que hace prácticamente todo el trabajo del script por lo que analizaremos por partes para hacerlo más fácil. En primer lugar comprobará que no estamos en 8.1 ejecutándolo en modo Developer (nombre que se le da cuando se utilizan ficheros .vhdx no descargados a través del script, en nuestro caso no es importante) y obtendrá el espacio en el volumen donde tenemos configurado la ruta para los Virtual Hard Disks de nuestro host de Hyper-V. Tras ello empezará a obtener los ficheros necesarios para realizar la configuración.

Obtiendo los ficheros necesarios – Cache-HostFiles

Para configurar el host de contenedores con Windows Server 2016 TP3 que se desplegará en el Hyper-V de nuestro equipo como máquina virtual es necesario descargar uan serie de ficheros que ocupan un tamaño razonable (~6GB). Por lo tanto, esta parte será la que más tarde de todo el script si no disponemos de una buena conexión a internet. Los ficheros sólo son descargados si es la primera vez que lo hacemos o si ha habido una nueva versión publicada por parte de Microsoft de la imagen.

En el caso de que haya que descargarlos comprobaré que tenemos al menos 20GB libres en nuestro disco duro ya que necesitaremos los 6GB de la descarga más otros 12GB a la hora de extraer los ficheros para realizar la configuración necesaria.


Si cumplimos con los requisitos el proceso de obtener los ficheros necesarios comienza. En primer lugar, se conectará a los servidores de Microsoft para descargarse la imagen de Windows Server 2016 TP3 y la guardará en nuestro directorio local de Hyper-V. Los pocos minutos pueden convertirse en horas si la velocidad de vuestra conexión no es lo suficientemente rápida como os comentaba anteriormente.

Cuando acabe tendréis un fichero .zip descargado en la ruta de Hyper-V dentro de vuestro equipo. El script generará un fichero temporal donde expandirá el contenido del fichero comprimido descargado. Si el equipo lleva PowerShell 5.0 utilizará el comando disponible de forma nativa, si no, el script llamará a la función personalizada Expand-ArchivePrivate que lo realiza a través del objeto COM de la Shell.

Fichero comprimido y carpeta temporal
Fichero comprimido y carpeta temporal

Finalmente copiará el disco .vhd al directorio final y eliminará el directorio temporal. Deberíamos encontrarnos con algo como lo que podemos ver en la captura. Junto con el fichero .vhd se genera un fichero de texto que indica la versión del sistema operativo que nos hemos descargado. El script lo utiliza para comprobar si estamos o no actualizados.

Disco .vhd y .txt
Disco .vhd y .txt

En el caso de que estemos utilizando el modo desarrollador que comentábamos antes hay un paso previo que es aplicar el parche de seguridad que se descarga de forma automática de la siguiente URL y de generar el fichero .vhd a partir de la imagen. Dado que en nuestro caso no lo estamos empleando podemos continuar ya que tendremos los ficheros necesarios.

Antes de preparar la imagen para ser desplegada a nuestro hipervisor el script comprobará que no existe ninguna máquina virtual con dicho nombre ya desplegada. Por lo tanto, escoged un nombre único para evitar tener que volver a ejecutar el script.

A partir de este momento empezará la preparación del disco duro de nuestra máquina virtual que servirá de host para los contenedores con la imagen de Windows Server 2016 TP3. Ignoraremos la parte que afecta al modo desarrollador y continuaremos centrándonos únicamente en nuestro escenario.

Es necesario contar con al menos 10GB para continuar en el proceso de creación del .vhd. De los 20 que comentábamos en un principio ya hemos ocupado 12GB con la imagen. Tras comprobarlo, revisará que no exista un fichero .vhd anterior y empezará a prepararlo. En el caso de que exista no tiene piedad y lo elimina para realizar la actualización correspondiente.

El proceso de confguración del disco se realiza a través de la función denominada Edit-BootVhd. En esta función se realizará el aprovisionamiento previo para que en el arranque de la máquina virtual termine de configurarse los elementos necesarios. En primer lugar monta de forma sincronizada el disco para evitar que múltiples scripts que se ejecuten de forma simultánea puedan afectar al proceso. Una vez montado instala a través de los comandos DISM de PowerShell la característica de Containers disponible en la TP3.

Imagen montada de forma temporal
Imagen montada de forma temporal

Por defecto, si no se indica lo contrario las herramientas de Docker son instaladas dentro de la máquina virtual para poder ser ejecutadas directamente desde la consola. Junto con ello se instala NSSM, un gestor de servicios para gestionar los fallos de aplicaciones funcionando como servicio dentro de Windows y asegurarse que el servicio si muere se recupera de forma correcta realizando las tareas de recuperación necesarias. En este caso, se emplea para gestionar el servicio de Docker dentro de la máquina virtual ya que al encontrarse en Preview puede tener algún fallo.

Los últimos pasos del proceso de aprovisionamiento es añadirle el fichero de instalación desatendida para nuestra máquina virtual y copiar dentro de la máquina virtual el script Install-ContainerHost.ps1 que configurará el host una vez que la máquina se arranque. Dentro del fichero de aprovisionamiento se incluyen los credenciales de la máquina, las expecpiones en el firewall para permitir la conexión remota al equipo o el idioma por defecto. En el caso de que no esté disponible PowerShell Direct también configurará la ejecucción del script Intall-ContainerHost en el primer arranque.

Una vez que tenemos nuestro fichero .vhd preparado es hora de crear la máquina virtual. Esta máquina se creará de generación 1 con memoria dinámica y sin unidad virtual de DVD.

En el caso de que hayamos especificado un Virtual Switch de Hyper-V a la hora de lanzar el script, éste se le asignará a la máquina virtual para que tenga conectividad al exterior. En el caso contrario únicamente tendremos acceso a nivel local.

A partir de este momento todo está listo para arrancar nuestra máquina virtual y esperar a que todo el proceso de configuración de arranque se complete. El script se encarga de consultar cada segundo si es capaz de recibir el heartbeat de la máquina virtual antes de proceder.

Windows Server 2016 arracando
Windows Server 2016 arracando

Una vez obtenido el heartbeat, gracias a PowerShell Direct el script se conectará a la máquina virtual. Dado que el proceso de especialización tarda un tiempo en completarse esperará hasta diez minutos antes de indicar que un error se ha producido. Si todo va bien, el script iniciará la ejecucción dentro de la VM de Intall-ContainerHost con los parámetros que le hayamos indicado y finalizará.

Ejecucción del script Intall-ContainerHost
Ejecucción del script Intall-ContainerHost

Si no pudiéramos ejecutar la conexión de PowerShell Direct a través del script será necesario que de forma manual configuremos Intall-ContainerHost para empezar a trabajar con los contenedores en Windows Server.

En el caso de que todo vaya bien tendremos nuestra máquina lista para usar.

Máquina virtual configurada
Máquina virtual configurada

Ahora solo queda jugar con ello.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.