Cómo crear una imagen de Docker para Windows con la etiqueta Docker Build

¿Eres nuevo en las imágenes de Docker para Windows? ¿Estás trabajando actualmente en un entorno Windows y tienes curiosidad por aprender sobre la construcción de imágenes de contenedor con Docker? Has llegado al lugar correcto. ¡La mejor manera de aprender algo nuevo es haciéndolo con los comandos docker build y docker build "etiqueta"!

En este artículo, aprenderás cómo crear tu primera imagen de Docker para Windows desde un Dockerfile usando el comando docker build.

¡Comencemos!

Entendiendo las imágenes de contenedor de Docker

Durante años, la única forma de probar o desarrollar en múltiples sistemas operativos (SO) era tener varias máquinas físicas o virtuales dedicadas con la imagen de la versión del SO que eligieras. Esta metodología requería más hardware y esfuerzo para aprovisionar nuevas máquinas para cada especificación de software y SO.

Sin embargo, en la actualidad el uso de imágenes de contenedor de Docker ha crecido en parte debido a la popularidad de la arquitectura de microservicios. En respuesta al aumento en la popularidad de Docker, Microsoft ha comenzado a apoyar públicamente las imágenes de Docker para varios productos emblemáticos en su página de Docker Hub. ¡Incluso han agregado soporte nativo para imágenes para Windows como una característica del producto en Windows 10 y Windows Server 2016!

A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable.  As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Source: Docker

Entendiendo la construcción de Docker e imágenes

El comando docker build se puede aprovechar para automatizar la creación de imágenes de contenedores, adoptar una práctica de DevOps de contenedor como código e integrar la contenerización en el ciclo de desarrollo de tus proyectos. Los Dockerfiles son simplemente archivos de texto que contienen instrucciones de construcción utilizadas por Docker para crear una nueva imagen de contenedor que se basa en una imagen existente.

El usuario puede especificar la imagen base y la lista de comandos que se ejecutarán cuando se implemente una imagen de contenedor o se inicie por primera vez. En este artículo, aprenderás cómo crear una imagen de Docker basada en Windows a partir de un Dockerfile usando un contenedor de Windows.

Este proceso tiene varios beneficios sobre el uso de una imagen de contenedor precompilada:

  1. Puedes reconstruir una imagen de contenedor para varias versiones de Windows, lo cual es genial para probar cambios de código en varias plataformas.
  2. Tendrás más control sobre lo que se instala en el contenedor. Esto te permitirá mantener el tamaño del contenedor al mínimo.
  3. Por razones de seguridad, es posible que desees verificar el contenedor en busca de vulnerabilidades y aplicar endurecimiento de seguridad a la imagen base.

Prerrequisitos/Requisitos

Este artículo es una guía sobre cómo aprender a construir una imagen de Docker usando un Dockerfile. Si deseas seguirlo, asegúrate de tener los siguientes requisitos previos en su lugar.

Nota: Asegúrese de habilitar la Configuración de Contenedores de Windows al instalar Docker.

Preparándose

Primero, necesitará una carpeta para almacenar todas las imágenes y contenedores de Docker que construirá a partir de esas imágenes. Para hacerlo, abra una terminal de PowerShell o cmd (se utilizará PowerShell en todo este artículo) y cree un nuevo directorio llamado C:\Containers.

Una vez creada la carpeta, cambie a ese directorio. Esto establece el directorio de trabajo actual de la consola en C:\Containers para que todas las descargas se guarden en este directorio por defecto.

PS51> mkdir C:\Containers
PS51> cd C:\Containers

En este artículo, obtendrás una ventaja inicial. La mayoría de los archivos necesarios para trabajar en este proyecto ya están disponibles. Una vez que se haya creado la carpeta, realiza un Git pull para copiar los archivos necesarios para este artículo desde el repositorio de Github de TechSnips a la carpeta C:\Containers. Una vez completado, verifica que la carpeta C:\Containers se vea como se muestra a continuación.

Tutorial files

Descargando la imagen de Docker de IIS para Windows

La primera tarea a realizar es descargar una “plantilla” o imagen base. Más adelante construirás tu propia imagen de Docker, pero primero necesitas una imagen para comenzar. Descargarás las últimas imágenes de IIS y Windows Server Core necesarias para este tutorial. La lista actualizada de imágenes se puede encontrar en la página de la imagen del centro de Docker de Microsoft oficial.

Revisando las imágenes base actuales de Docker

Antes de descargar la imagen del repositorio de imágenes, revisemos las imágenes base de Docker que tienes actualmente en tu sistema local. Para hacerlo, ejecuta una consola de PowerShell como administrador y luego escribe docker images. Este comando devuelve todas las imágenes en tu sistema local.

Como puedes ver a continuación, las imágenes disponibles están inicialmente vacías.

PS51> docker images
Docker Build Tag : Listing available Docker images

Descargando la imagen base

Ahora es el momento de descargar la imagen base de IIS desde Docker Hub. Para hacerlo, ejecuta docker pull como se muestra a continuación. Este proceso puede llevar algún tiempo dependiendo de la velocidad de tu conexión a Internet.

PS51> docker pull mcr.microsoft.com/windows/servercore/iis
Downloading an image from the Docker Hub

Ahora ejecuta docker images y deberías tener la última imagen de Microsoft Windows Core IIS disponible para este tutorial.

PS51> docker images
Viewing available Docker images

Inspeccionando el Dockerfile

En un paso anterior, descargaste un Dockerfile existente para este tutorial. Ahora echemos un vistazo a exactamente en qué consiste.

Abre el archivo C:\Containers\Container1\Dockerfile en tu editor favorito. El contenido de este Dockerfile se utiliza para definir cómo se configurará la imagen del contenedor en el momento de la construcción.

Puedes ver una explicación de lo que hace cada parte de este archivo en los comentarios en línea.

# Especifica que se usará la última imagen de microsoft/iis como imagen base
# Se utiliza para especificar qué imagen de contenedor base se usará en el proceso de compilación.

# Observa que la convención de nomenclatura es "**nombre del propietario/nombre de la aplicación : nombre de la etiqueta**"
# (mostrado como microsoft/iis:latest); así que en nuestro caso el propietario de la imagen es
# Microsoft y la aplicación es IIS con el nombre de la etiqueta "latest" siendo usado
# para especificar que se va a extraer la versión de imagen más reciente disponible.
FROM microsoft/iis:latest

# Copia el contenido de la carpeta wwwroot a la carpeta inetpub/wwwroot en la nueva imagen de contenedor
# Se utiliza para especificar que quieres copiar la carpeta WWWroot al WWWroot de inetpub de IIS
# en el contenedor. No necesitas especificar la ruta completa de tus archivos locales
# porque docker ya tiene la lógica incorporada para hacer referencia a archivos y carpetas
# relativas a la ubicación del archivo docker en tu sistema. Además, ten en cuenta que
# docker solo reconocerá barras inclinadas hacia adelante para las rutas de archivos, ya que este es un
# contenedor basado en Windows en lugar de Linux.
COPY wwwroot c:/inetpub/wwwroot

# Ejecuta algunos comandos de PowerShell dentro del nuevo contenedor para configurar la imagen

# Ejecuta los comandos de PowerShell para eliminar los archivos predeterminados de IIS y crear un nuevo
# grupo de aplicaciones llamado TestPool
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.htm -force
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.png -force
RUN powershell Import-Module WebAdministration
RUN powershell New-WebAppPool -Name 'TestPool'

# Expone el puerto 80 en la nueva imagen de contenedor
# Se utiliza para abrir el puerto TCP 80 para permitir una conexión http al sitio web.
# Sin embargo, esta línea está comentada, porque el contenedor de IIS ya tiene este puerto
# abierto por defecto.
#EXPOSE 80

# Establece el comando principal de la imagen del contenedor
# Esto indica que la imagen ejecutará un monitor de servicio para el servicio w3svc.
# Cuando se especifica esto, el contenedor se detendrá automáticamente
# si el servicio w3svc se detiene. Esta línea está comentada debido a que el
# contenedor de IIS ya tiene este punto de entrada configurado por defecto.
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

Construyendo una Nueva Imagen de Docker

Ya tienes el Dockerfile listo y has descargado una imagen base de IIS. Ahora es el momento de construir tu nueva imagen de Docker utilizando el Dockerfile.

Para construir una nueva imagen, utiliza el comando docker build "etiqueta". Este comando crea la imagen. En este artículo, puedes observar que también estás utilizando la opción -t **, que reemplaza la parte de “etiqueta”. Esta opción te permite asignarle a tu nueva imagen un nombre amigable y también hacer referencia al Dockerfile especificando la ruta de la carpeta donde se encuentra.

A continuación, puedes ver un ejemplo de cómo asegurarte de que la consola esté en el directorio C:\Containers y luego construir una nueva imagen a partir del Dockerfile en el directorio C:\Containers\Container1.

PS51> cd C:\Containers
PS51> docker build -t container1 .\Container1

Una vez iniciado, puedes seguir el progreso del comando mientras recorre cada instrucción en el archivo docker línea por línea:

Building a progress of the command as it traverses each instruction in the docker filenew Docker image

Una vez hecho, ¡deberías tener ahora una nueva imagen de Docker!

Ahora ejecuta el comando docker images para ver las imágenes disponibles. Puedes ver a continuación un ejemplo de la imagen container1 creada.

Viewing available Docker images

Nota: El comando docker build —help es un parámetro útil para mostrar información detallada sobre el comando docker que se está ejecutando.

Ejecutando el Contenedor de Docker

En este punto, deberías tener una nueva imagen creada. Es hora de poner en marcha un contenedor utilizando esa imagen. Para iniciar un nuevo contenedor, utiliza el comando docker run.

El comando docker run iniciará un nuevo contenedor Docker basado en la imagen container1 que creaste anteriormente. Puedes ver un ejemplo de esto a continuación.

Observa que se utiliza el parámetro -d. Esto indica al tiempo de ejecución de Docker que inicie la imagen en modo desvinculado y luego salga cuando el proceso raíz utilizado para ejecutar el contenedor finalice.

Cuando docker run finaliza, devuelve el ID del contenedor creado. El ejemplo a continuación captura este ID en una variable $containerID para que podamos hacer referencia a él fácilmente más tarde.

PS51> $containerID = docker run -d container1
PS51> $containerID
Running a Docker container

Una vez que se inicia el contenedor, ahora ejecuta el comando docker ps. Este comando te permite ver qué contenedores se están ejecutando actualmente utilizando cada imagen. Observa a continuación que la imagen en ejecución automáticamente genera un apodo (busy_habit en este caso). Este apodo a veces se utiliza en lugar del ID del contenedor para gestionar el contenedor.

Listing running Docker containers

Ejecutar código dentro de un contenedor Docker

A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec command.

En este ejemplo, ejecuta docker exec para ver la salida de PowerShell para el comando Get-ChildItem en el contenedor utilizando la sintaxis de comando a continuación. Esto asegurará que las instrucciones en el Dockerfile para eliminar los archivos IIS predeterminados hayan tenido éxito.

PS51> docker exec $containerID powershell Get-ChildItem c:\inetpub\wwwroot

Puedes ver a continuación que el único archivo que existe es index.html, lo que significa que los archivos predeterminados fueron eliminados.

Running PowerShell commands in a Docker container

Ahora ejecuta el comando ipconfig en el contenedor para obtener la dirección IP local de la imagen del contenedor para que puedas intentar conectarte al sitio web de IIS.

PS51> docker exec $containerID ipconfig

Puedes ver a continuación que se ejecutó ipconfig en el contenedor como si se ejecutara en tu computadora local y ha devuelto toda la información de IP.

Running ipconfig in a Docker container

Inspeccionando el Sitio Web de IIS

¡Ahora es el momento de revelar los frutos de tu trabajo! Es hora de ver si el servidor IIS que se está ejecutando en el contenedor Docker está sirviendo correctamente la página index.html.

Abre un navegador y pega la Dirección IP4 encontrada a través de ipconfig en la barra de direcciones. Si todo está bien, deberías ver un mensaje de ¡Hola Mundo! como se muestra a continuación.

IIS webpage running in a Docker container

Revisando el Historial de Docker

Un comando útil para usar al trabajar con contenedores de Docker es el comando docker history. Aunque no esté necesariamente relacionado con la creación de una imagen o contenedor en sí mismo, el comando docker history es un comando útil que te permite revisar los cambios realizados en la imagen del contenedor.

PS51> docker history container1

Puedes ver a continuación que docker history devuelve toda la actividad de Dockerfile y PowerShell realizada en el contenedor1 con el que has estado trabajando.

Inspecting container changes with docker history

Limpiando las Imágenes de Docker en Ejecución

Los pasos a continuación se utilizan para limpiar todos los contenedores detenidos que se están ejecutando en tu máquina. Esto liberará espacio en disco y recursos del sistema.

Ejecuta el comando docker ps para ver una lista de los contenedores que se están ejecutando en tu sistema:

PS51> docker ps
Viewing available Docker containers

Ahora detén los contenedores en ejecución usando el comando docker stop:

PS51> docker stop <image nick name: busy_haibt in my case>
PS51> docker stop <image nick name: unruffled_driscoll in my case>
Stopping Docker containers

Finalmente, puedes eliminar permanentemente los contenedores detenidos usando el comando docker system prune.

PS51> docker system prune
Removing Docker images

Lecturas Adicionales

Source:
https://adamtheautomator.com/docker-build-tag/