Bienvenido, les saluda Luis y hoy les traigo un nuevo artículo.
Índice
¿Qué es Docker?
Docker es una herramienta que se puede utilizar para empaquetar una aplicación y sus dependencias en un único contenedor desplegable, que alberga todo lo necesario para ejecutar correctamente la aplicación.
Al implementar la contenedorización, aísla la aplicación del sistema host
en el que se ejecuta; proporcionando una experiencia consistente durante todo el proceso de desarrollo, prueba e implementación.
Le permite crear su entorno, en forma de imagen, y ejecutarlo en cualquier lugar. Las máquinas ya no necesitan aprovisionamiento; si la máquina tiene Docker instalado, la aplicación se ejecutará, ya que la imagen tiene todo lo que necesita.
Docker es completamente de código abierto y tiene una gran cantidad de colaboradores de alto perfil; como Microsoft, IBM y RedHat.
Prerrequisitos
Esta guía no asume ningún conocimiento previo de Docker, con el objetivo de ayudarlo a comenzar su viaje con Docker.
Deberá tener una aplicación disponible para usar con esta guía, y los siguientes pasos contienen todo lo necesario para comenzar a usar la contenedorización con Docker.
Le animo a experimentar a lo largo del camino y personalizar la configuración para que se ajuste a sus propios requisitos.
Obtener la configuración
Para comenzar con Docker, deberá descargar Escritorio Docker para Windows. Cuando haya descargado y ejecutado la instalación, tendrá la configuración de Docker en su máquina.
Algunos pasos de instalación pueden requerir que reinicie su máquina y posiblemente habilite la virtualización en el menú de su BIOS
si aún no lo es.
Recomiendo el uso de Código de Visual Studio junto con la extensión Docker; esto proporcionará resaltado de sintaxis y una GUI
para interactuar con imágenes, contenedores y registros.
Imágenes de Docker
Las imágenes de Docker se crean usando un Dockerfile, dentro de este archivo creará capas que definirán su imagen.
Las imágenes de Docker generalmente se basan en una imagen base, que se declara en la parte superior de su dockerfile:
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019
FROM
Docker Hub para imágenes de Microsoft.Una vez que tenga una imagen base, todo lo demás se construirá sobre ella. Cada comando definido en su Dockerfile es una nueva capa de su imagen de Docker.
Las capas de su imagen se apilan esencialmente en la dirección opuesta a la declarada en su Dockerfile.
Crear una imagen
Dentro de la raíz de su solución agregue un directorio llamado docker. Dentro de este directorio cree un archivo llamado Dockerfile sin extensión de archivo y agregue la imagen base definida en la sección anterior a la primera línea.
Esta imagen es para .NET Framework, necesitará encontrar la imagen base que corresponde al tipo de aplicación con la que está trabajando. Ahora puede comenzar a construir sobre esta base para crear su propia imagen.
Puede establecer un shell predeterminado para los comandos RUN
, lo agregaremos directamente después de la declaración de la imagen base:
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
Ahora podemos ejecutar scripts de PowerShell desde nuestro Dockerfile, utilizando el comando RUN
. Recomiendo mantener los scripts más grandes en archivos separados, para garantizar que Dockerfile esté limpio y sea fácil de mantener.
Cree una variable de entorno para la raíz de la aplicación utilizando el comando ENV
; también puede usar ARG
para pasar parámetros, pero esto solo está disponible en el momento de la compilación.
ENV APP_ROOT="c:\application"
Agregue el directorio a nuestra imagen usando powershell
:
RUN New-Item -Type Directory -Path $env:APP_ROOT
Ahora configure el directorio de trabajo de nuestro dockerfile usando el comando WORKDIR
, luego puede usar el comando COPY
para agregar la aplicación a un directorio en la imagen.
Por lo general, usará COPY
para copiar archivos locales en su imagen, también hay un comando ADD
que generalmente está reservado para agregar recursos externos.
Los siguientes comandos copiarán su directorio src al directorio de la aplicación en la unidad C
de su imagen, aprovecharemos la ventaja de encadenar los archivos para copiarlos agregando un script de PowerShell
para usarlo más tarde con el ENTRYPOINT
que se describe a continuación:
WORKDIR $APP_ROOT COPY ./src ./docker/Start.ps1 .
Puedes usar el EXPOSE
palabra clave para definir los puertos a publicar, esto actúa como una instrucción con respecto a qué puertos se espera que sean expuestos por el usuario de la imagen.
Si desea publicar los puertos definidos por EXPOSE
puedes usar -p
al ejecutar su imagen en un contenedor.
EXPOSE 443
Agregar un ENTRYPOINT
y definir un archivo de secuencia de comandos que se ejecutará cuando se cree una instancia del contenedor. Esto se puede usar para cosas como verificaciones de estado, configuración y mantener el contenedor en ejecución.
ENTRYPOINT ["powershell.exe", ".\Start.ps1"]
Nuestro script de inicio puede contener cualquier funcionalidad que se ejecutará durante el comando docker run
.
Mantendremos la secuencia de comandos de inicio básica con el fin de realizar la configuración rápidamente; puede ampliarla de la forma que desee. Crea el archivo Start.ps1
dentro del directorio de Docker y agregue lo siguiente dentro:
Import-Module WebAdministration$Sitename = "application" $HostName = "localhost" $SiteFolder = "$ENV:APP_ROOT" $IISSite = "IIS:Sites$SiteName"New-WebSite -Name $SiteName -PhysicalPath $SiteFolder -Force Set-ItemProperty $IISSite -name Bindings -value @protocol="http";bindingInformation="*:80:$HostName" $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS_IUSRS", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow") $acl = Get-ACL $SiteFolder $acl.AddAccessRule($accessRule) Set-ACL -Path $SiteFolder -ACLObject $acl Start-Service W3SVC Start-Website -Name $Sitename$healthy = $true while($healthy) try $Request = Invoke-WebRequest -uri 'http://localhost/' -UseBasicParsing $Status = $Request.statuscode Write-Host "Status: $Status" catch Write-Output $_ $healthy = $false; start-sleep -seconds 120
Este script configura IIS
para nuestra aplicación y recorre una verificación de estado. Este contenedor sólo se detiene si falla la verificación de estado. Deberá actualizar la variable Sitename
si no ha utilizado "aplicación"
.
Nuestro Dockerfile completo:
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019 SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"] ENV APP_ROOT="c:\application" RUN New-Item -Type Directory -Path $env:APP_ROOT WORKDIR $APP_ROOT COPY ./src ./docker/Start.ps1 ./ EXPOSE 80 ENTRYPOINT ["powershell.exe", ".\Start.ps1"]
Almacenamiento en caché
Las capas de su imagen de Docker se almacenan en caché individualmente, lo que, cuando se aprovecha correctamente, puede acelerar significativamente sus compilaciones. Esto puede ser muy beneficioso, especialmente cuando se trabaja con contenedores de Windows.
Una vez que una capa ha cambiado, todas las capas encima de ella no pueden usar la versión previamente almacenada en caché.
Por lo tanto, es mejor ordenar su Dockerfile de modo que las partes que cambian con menos frecuencia estén en la parte superior y las partes que cambian con más frecuencia estén en la parte inferior.
Ignoren Docker
En el directorio raíz de su aplicación agregue un archivo llamado .dockerignore
. En el archivo de ignorar de la ventana acoplable, agregará las rutas y los archivos que no desea incluir en su compilación.
Al eliminar archivos innecesarios, reducirá en gran medida el tiempo que le toma a Docker escanear el directorio raíz.
Este es un paso importante, ya que ejecutará la compilación de la ventana acoplable con bastante frecuencia a medida que configure las cosas y reducirá en gran medida los tiempos de compilación.
Al comenzar, me sorprendió no tener un .dockerignore
, y estaba escaneando miles de archivos de paquetes de nodos, lo que hizo que cada compilación fuera dolorosamente lenta.
Puede ignorar archivos específicos dentro de su docker ignorar archivo, o ignorar todo e incluir solo las cosas que desea usar:
** !/docker !/src
Contenedores Docker
Los contenedores son simplemente el entorno desacoplado en el que se ejecutan las imágenes de Docker.
Abra su terminal y cree su imagen de Docker:
docker build --file "C:applicationdockerDockerfile" "C:application"
El parámetro de archivo apunta al destino de su Dockerfile, mientras que el segundo parámetro es el contexto en el que se ejecuta Dockerfile.
Salida:
Sending build context to Docker daemon 97.04MB Step 1/8 : FROM mcr.microsoft.com/windows/servercore:ltsc2019 ---> e43347a4426d Step 2/8 : SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"] ---> Using cache ---> 73fbd46fd406 Step 3/8 : ENV APP_ROOT="c:/application" ---> Using cache ---> 4d6d191bc23f Step 4/8 : RUN New-Item -Type Directory -Path $env:APP_ROOT ---> Using cache ---> 88d88747fedc Step 5/8 : WORKDIR $APP_ROOT ---> Running in 4b088fd84b0b Removing intermediate container 4b088fd84b0b ---> 599fab8491f0 Step 6/8 : COPY ./src ./docker/Start.ps1 ./ ---> 230ce3dcae9c Step 7/8 : EXPOSE 443 ---> Running in b2f713a5ecda Removing intermediate container b2f713a5ecda ---> c5ba3d36527d Step 8/8 : ENTRYPOINT ["powershell.exe", ".\Start.ps1"] ---> Running in fae82c28a6a0 Removing intermediate container fae82c28a6a0 ---> d91e30fdac0b Successfully built d91e30fdac0b
El final de la compilación generará su ID de imagen, puede encontrar la imagen más tarde usando:
docker image ls
Ahora que tenemos una imagen con su aplicación y todas sus dependencias integradas, simplemente podemos ejecutarla en un contenedor:
docker run d91e30fdac0b
Esto ejecutará la imagen en un contenedor y llegará al punto de entrada que definimos anteriormente para configurar IIS
para la aplicación y realizar una verificación de estado simple. La verificación de estado debe mostrar un estado de 200
al terminal.
Para obtener la identificación del contenedor en ejecución, use
:
docker ps
Ahora puede usar la identificación del contenedor para obtener la dirección IP
de su contenedor:
docker inspect -f " .NetworkSettings.Networks.nat.IPAddress " 0b3307372853
Ahora que tiene la dirección IP
, puede usarla para alojar la cabeza en su aplicación y cargarla en un navegador.
Si lo ha seguido, ahora debería tener una aplicación que funcione en un contenedor Docker. Con suerte, habrá obtenido suficiente información para comprender qué es Docker y cómo podría beneficiarlo potencialmente.
Trabajar con contenedores de Windows puede resultar complicado, especialmente con .NET Framework, pero todavía tiene algunos beneficios sorprendentes.
Si sigue experimentando con los contenedores de Linux y .NET Core, verá lo rápido que puede ser construir e implementar con Docker.
¿Qué sigue?
Ahora puede crear sus imágenes de Docker y ejecutarlas dentro de un contenedor, pero ¿a dónde va desde aquí? Docker por sí solo no proporcionará grandes beneficios a sus implementaciones, deberá buscar en un contenedor o una herramienta de búsqueda para administrar la automatización, el escalado y la administración de las implementaciones de aplicaciones.
Algunas herramientas populares para esto son:
-
Kubernetes:
esta es, con mucho, la herramienta más popular, fue creada por Google y ahora es mantenida por Cloud Native Computing Foundation. Esta es la mejor opción para la portabilidad. -
ECS:
el servicio de contenedor elástico de Amazon para la búsqueda de contenedores en la plataforma AWS. -
ACI:
instancias de contenedores de Azure de Microsoft para orchastrar contenedores en la plataforma Azure. -
Marathon:
esto es Kubernetes, pero para procesos de larga ejecución en Apache Mesos.
Otras lecturas
Gracias por leer este artículo.
Añadir comentario