En este video se presenta un breve resumen de qué son los contenedores, cómo se ejecutan en un servidor con Windows Server y para qué se pueden utilizar. Un contenedor es un entorno aislado en el que se puede ejecutar una aplicación.
El contenedor, la aplicación y todas sus dependencias se construyen con partes de los recursos del host, como un sistema operativo kernel, una CPU y una memoria. Cada uno se encuentra separado lógicamente de otros contenedores y del propio host.
Este diagrama ilustra cómo un contenedor rojo y uno amarillo coexisten dentro del mismo host utilizando los mismos recursos de hardware y el mismo sistema operativo del kernel, pero están contenidos dentro de su espacio individual, lo que les permite ejecutar sus aplicaciones sin interferencias externas.
El mismo hardware y el sistema operativo instalado en ese hardware pueden ejecutar sus propias aplicaciones y servicios, también independientemente de lo que sucede en cada contenedor.
De manera predeterminada, este contenedor es desechable. Cuando se detiene, todo el software y los archivos se eliminan. Lo mismo sucede cuando el host se reinicia.
Los contenedores también aprovechan el firewall del equipo host. Comparemos todo eso con una máquina virtual. En primer lugar, es posible ejecutar un contenedor en una máquina virtual, pero no al revés.
Una máquina virtual simula una computadora completa. Por lo tanto, debe ejecutar su propio sistema operativo. Esto aumenta la seguridad, pero también los requisitos de configuración y mantenimiento, lo que a menudo da como resultado recursos inactivos.
Existen varias formas de trabajar con contenedores, como Visual Studio, Azure, Kubernetes y Windows. En este video, hablaremos sobre Docker.
Docker es un producto de plataforma como servicio que asume el trabajo de combinar una aplicación, todas sus dependencias y la información de configuración en un solo paquete llamado contenedor.
Por lo tanto, Docker se puede utilizar para enviar, ejecutar o eliminar ese contenedor. Volveremos a este diagrama en un momento. Veamos algunos de estos elementos en acción y analicemos otros detalles durante el proceso. Esta es una nueva instalación de Windows Server 2022.
Iniciaré el asistente de “Server Manager” para agregar “Roles” y “Features”. Tenga en cuenta que este asistente permite agregar la característica “Containers”. Sin embargo, esta no instala Docker.
Debemos hacerlo por separado. Para eso, cancelaré este asistente y abriré “PowerShell” para ejecutar la siguiente línea y primero instalar un proveedor requerido.
Install-Module, "DockerMsftProvider" y "PSGallery" como fuente. Presionaré Intro. En este símbolo del sistema, indique “Yes” para instalar NuGet y espere a que se complete el proceso.
Ahora, ejecutaré la segunda línea para instalar Docker. Install-Package, "docker" y, a continuación, especifique el "DockerMsftProvider" que instalamos anteriormente. Presione Intro. En el símbolo del sistema que se mostrará, indique “Yes” para continuar.
Observe el mensaje para reiniciar la computadora. Para hacerlo, escriba “Restart-Computer”. Una vez que haya realizado el respaldo de la computadora, volveré a abrir el "Asistente para agregar funciones y características" en el "Administrador del servidor".
Advertirá que la característica “Containers” ya se instaló. Lo hicimos con las dos líneas de PowerShell que ejecutamos anteriormente. En “PowerShell”, la ejecución de un comando como “docker” nos dará una idea de todo lo que podemos hacer.
La versión de Docker, por ejemplo, nos dirá que estamos ejecutando la versión del motor 20.10.9. Otro comando, “docker info”, nos indicará que todavía debemos crear nuestro primer contenedor.
Y este cuadro también nos proporciona detalles como la cantidad de CPU y RAM disponibles para los contenedores, el "método de aislamiento predeterminado" y los tipos de "red" que se crearon, que no vamos a analizar por ahora.
Solo ejecutaremos los pasos para crear y ejecutar nuestro primer contenedor en este cuadro de Windows en el que acabamos de instalar Docker. Volvamos a este diagrama. Recordemos que Docker es una herramienta para empaquetar varios elementos en un contenedor. Por lo tanto, si, por ejemplo, tuviéramos que incluir una aplicación web en un contenedor, necesitaremos colocar varios elementos dentro de ese contenedor.
En primer lugar, necesitamos un “Dockerfile”. Este archivo tendrá la información de configuración y las instrucciones necesarias para crear un nuevo contenedor. Un archivo Dockerfile se ve así. Puede ser muy complejo o muy simple.
Crearemos uno en un momento. También necesitamos una imagen de contenedor. Una imagen es como una plantilla de solo lectura. Puede crear un contenedor con la plantilla de "Windows Server Core" o usar una plantilla de "Nano Server", por ejemplo.
Esta imagen o plantilla también proporciona algunas de las dependencias que la aplicación web necesitará, como el servicio “IIS” y la infraestructura de desarrollo. Por último, necesitamos la aplicación web en sí.
Docker permite unir todo esto para crear un contenedor. Veamos esto en acción. En la computadora en la que acabamos de instalar Docker en PowerShell, iré a la raíz de la unidad C y crearé un nuevo directorio llamado "containers".
Iré a este nuevo directorio “containers”. Para crear nuestro primer contenedor, necesitamos el archivo Dockerfile que analizamos anteriormente. Recuerde, este es un archivo de texto con un conjunto de instrucciones para el contenedor.
Para utilizar ese archivo, escribiré “New-Item” y especificaré el nombre “dockerfile”. Tenga en cuenta que este Dockerfile no tiene ninguna extensión. Podemos ver este archivo creado en el Explorador de Windows. Lo abriremos con el Bloc de notas.
Para mantener este primer contenedor simple, solo agregaremos tres líneas a este Dockerfile. Las explicaré una por una. En primer lugar, la instrucción “From” indica a Docker qué imagen de contenedor se utilizará para crear el contenedor.
Recuerde, una imagen es como una plantilla. En este caso, indicaremos a Docker que utilice una imagen del registro de contenedor de Microsoft que se basa en Windows Server Core y también tiene instalada la función “IIS”.
La segunda línea especifica qué comandos se ejecutarán en la nueva imagen de contenedor una vez que se esté ejecutando. Podríamos incluir comandos para instalar software o crear archivos y directorios.
Pero, en este caso, solo indicaremos a Docker que ejecute PowerShell en el contenedor una vez que se encuentre en ejecución. Por último, la instrucción “Copy” copia archivos o directorios del equipo host al sistema de archivos del contenedor.
En este caso, indicaremos a Docker que copie un nombre de archivo "index.html" que se creará en un momento y que sirve como nuestra aplicación web de ejemplo desde el equipo host a esta carpeta en el contenedor, que resulta ser la ruta de directorio virtual predeterminada para IIS.
Eso es todo. Guardaré este archivo Dockerfile. Ahora regrese a PowerShell para crear la página web que se ejecutará en ese contenedor. Para esto, utilizaré el comandlet “New-Item” nuevamente y especificaré “index.html” como el nombre del archivo.
Abriré este archivo en el Explorador de Windows con el Bloc de notas. Y para simplificar esto, solo agregaremos tres líneas a esta aplicación HTML de muestra, una página web básica de "Hola mundo".
Guardaré esto. Ahora tenemos todos los componentes necesarios para crear un contenedor. Docker se instaló en este cuadro de Windows Server.
Tenemos el archivo Dockerfile que creamos anteriormente con las instrucciones para utilizar la imagen de Server Core del registro de Microsoft que contiene IIS.
Además, en ese Dockerfile incluimos las instrucciones para copiar la página web HTML en el nuevo contenedor una vez que se haya creado. Pero todo lo que tenemos es un conjunto de instrucciones. No se ejecuta nada todavía.
Por eso, regresamos a PowerShell para crear una imagen basada en esas instrucciones. Ejecutaremos “docker”, “build” y, a continuación, asignaremos el nombre o la etiqueta “webserver”.
Y este punto final al final indica que vamos a trabajar en este directorio de contenedores, donde tenemos nuestro Dockerfile y nuestra página web "index.html". Presionaré Intro.
Esta línea crea la imagen base a partir de la cual se crearán nuestros contenedores mediante las instrucciones especificadas en ese Dockerfile. Debido a que es la primera vez que invocamos esta imagen en este servidor, debe descargarla del registro de contenedor de Microsoft.
Con todo esto terminado, la ejecución de un comando como docker images mostrará una imagen descargada recientemente junto con el nombre o la etiqueta que le asignamos. Recuerde, ahora tenemos una imagen de contenedor que es igual a una plantilla. Pero todavía no existen contenedores en ejecución.
Solo para mostrar que aún no es posible acceder a nuestra aplicación web de muestra, abriré un navegador web y escribiré "localhost". Se producirá un error esperado, ya que el host no tiene IIS y no puede alojar una página web.
Para ejecutar finalmente el contenedor con la plantilla de imagen descargada, regrese a PowerShell, escriba “docker run” y especifique el nombre de ese contenedor.
Aquí, usaremos el nombre “container1”. Usaremos este switch para indicar que el contenedor se ejecutará en segundo plano. Y esta otra para especificar que "port 80" en el contenedor se asignará a "port 80" en el host. Además, especificamos que este contenedor se debe ejecutar mediante la imagen de servidor web que descargamos y creamos anteriormente.
Ahora, presionaré Intro. Eso es todo. Gracias a esto se creará y ejecutará un contenedor denominado “container1” según la imagen de servidor web que acabamos de preparar.
Tenga en cuenta que no tuvimos que asignar ninguna memoria a este contenedor. Ni CPU o discos duros virtuales a este contenedor, como es el caso de las máquinas virtuales.
Esto se debe a que no es necesario asignar estos recursos a un contenedor. Simplemente se usa lo que se necesita. Regresemos al navegador y volvamos a escribir “localhost”.
Como se puede ver, la aplicación web de muestra se encuentra activa. No se encuentra en el host. En su lugar, el host reenvía el puerto 80 al contenedor, que se creó con la configuración especificada en la imagen de servidor web y en el que se copió la página web HTML como se indicó en el archivo Dockerfile.
Podemos interactuar con este contenedor recién creado a través de la línea de comandos. Por ejemplo, abriré una nueva ventana de PowerShell e ingresaré el comando “docker exec -ti” para especificar que nos conectaremos a este contenedor de forma interactiva.
El nombre del contenedor, “container1” y, a continuación, “powershell”. Este comando de Docker abre PowerShell en container1 recién creado y muestra un símbolo del sistema.
En este caso, si escribimos “hostname”, por ejemplo, veremos que se asignó un nombre de computadora a este contenedor. Si escribe un comando como "ipconfig", también verá que a este contenedor se le asignó una dirección IP que utiliza la traducción de direcciones de red para comunicarse con el host y más allá.
Haré un pequeño cambio en la página web HTML que creamos anteriormente. Editaré esto en el Bloc de notas y cambiaré este encabezado aquí para indicar “container #2” en lugar de “container #1”. Guardaré este archivo. Nuevamente en PowerShell, usaré las mismas dos líneas que utilizamos con anterioridad para crear y ejecutar nuestro primer contenedor.
En primer lugar, la línea “docker build” permanecerá sin cambios. Observe que, al presionar Intro, esto se realiza casi en un instante Esto se debe a que ya descargamos la imagen de Server Core que tiene instalada la función IIS desde el registro de contenedores de Microsoft.
Editaremos la segunda línea “docker run” para crear un nuevo contenedor llamado “container2” y haremos que este contenedor escuche en “port 8080”, en lugar de “port 80”, que es el puerto asignado a “container1”.
Presionaremos “Intro” y, una vez completado esto, regresaremos al navegador y volveremos a “localhost”, pero esta vez especificaremos “port 8080”. Podemos ver que la página web que escucha en el puerto 8080 se hospeda en el "contenedor #2" que acabamos de crear. Mientras que el que escucha en el puerto 80, el predeterminado para HTTP, está alojado en "container #1".
También podemos ver lo mismo en PowerShell mediante la ejecución de “docker ps”. El contenedor #1 escucha en el puerto 80, mientras que "container #2" escucha en el puerto 8080. container #1 y "container #2" tienen su propio nombre de host, direcciones IP y alojan sus propios sitios web.
Cualquier cambio que se realice en “container #1” no afectará a “container #2”. Tenga en cuenta que pudimos hacer todo esto sin necesidad de instalar la función "IIS" o la función "Hyper V" en el servidor host.
Tampoco tuvimos que asignar recursos como RAM, CPU o discos duros virtuales, ni configurar redes. Una vez que la imagen de plantilla base es local, la creación del contenedor nos tomó entre dos y tres segundos.
Por último, me gustaría hablar brevemente sobre lo que se puede ejecutar en un contenedor. En primer lugar, los contenedores en Windows se soportaron primero en Windows Server 2016 y Windows 10. Por lo tanto, lo ideal es que la aplicación alojada sea compatible con estos sistemas operativos y versiones posteriores.
Si una aplicación necesita una interfaz gráfica de usuario o controladores, no es adecuado implementarla en un contenedor. Sin embargo, puede utilizar un contenedor para alojar marcos de aplicaciones como "Asp.net" o "Apache", lenguajes de programación como "Python", incluso bases de datos en forma de servicios como sqlserver-express, "mongodb" o "mysql".
Actualmente, no se admite el alojamiento de funciones de infraestructura de Windows, como "controladora de dominio", "DNS" o "DHCP" en contenedores, pero quién sabe lo que puede deparar el futuro.
Este ha sido un breve resumen de qué son los contenedores, cómo se ejecutan en un cuadro de Windows Server y para qué se pueden utilizar. Espero que esta información le resulte útil, y me gustaría agradecerle mucho por su atención.