Migrar aplicaciones de ASP.NET MVC a contenedores de WindowsMigrating ASP.NET MVC Applications to Windows Containers

Ejecutar una aplicación existente basada en .NET Framework en un contenedor de Windows no requiere cambios en la aplicación.Running an existing .NET Framework-based application in a Windows container doesn't require any changes to your app. Para ejecutar la aplicación en un contenedor de Windows, crea una imagen de Docker que contenga la aplicación e inicie el contenedor.To run your app in a Windows container you create a Docker image containing your app and start the container. En este tema, se explican cómo realizar una aplicación ASP.NET MVC existente e implementarla en un contenedor de Windows.This topic explains how to take an existing ASP.NET MVC application and deploy it in a Windows container.

Comience con una aplicación existente de ASP.NET MVC y luego compile los recursos publicados mediante Visual Studio.You start with an existing ASP.NET MVC app, then build the published assets using Visual Studio. Puede usar Docker para crear la imagen que contiene y ejecuta la aplicación.You use Docker to create the image that contains and runs your app. Podrá ir al sitio que se ejecuta en un contenedor de Windows y comprobar que la aplicación funciona.You'll browse to the site running in a Windows container and verify the app is working.

En este artículo, se supone un conocimiento básico de Docker.This article assumes a basic understanding of Docker. Para más información sobre Docker, consulte Docker Overview (Introducción a Docker).You can learn about Docker by reading the Docker Overview.

La aplicación que ejecutará en un contenedor es un sitio web sencillo que responde a preguntas de forma aleatoria.The app you'll run in a container is a simple website that answers questions randomly. Esta aplicación es una aplicación MVC básica sin autenticación ni almacenamiento de base de datos; esto le permite centrarse en mover la capa web a un contenedor.This app is a basic MVC application with no authentication or database storage; it lets you focus on moving the web tier to a container. En temas futuros, se le mostrará cómo mover y administrar el almacenamiento persistente en aplicaciones en contenedor.Future topics will show how to move and manage persistent storage in containerized applications.

Al mover la aplicación, se incluyen los siguientes pasos:Moving your application involves these steps:

  1. Crear una tarea de publicación para crear los recursos de una imagen.Creating a publish task to build the assets for an image.
  2. Crear una imagen de Docker que ejecutará la aplicación.Building a Docker image that will run your application.
  3. Iniciar un contenedor de Docker que ejecuta la imagen.Starting a Docker container that runs your image.
  4. Comprobar la aplicación mediante el explorador.Verifying the application using your browser.

La aplicación finalizada se encuentra en GitHub.The finished application is on GitHub.

Requisitos previosPrerequisites

La máquina de desarrollo debe de estar ejecutandoThe development machine must be running

Importante

Si usa Windows Server 2016, siga las instrucciones de Implementación de host de contenedor - Windows Server.If you are using Windows Server 2016, follow the instructions for Container Host Deployment - Windows Server.

Después de instalar e iniciar Docker, haga clic con el botón derecho en el icono de bandeja y seleccione Cambiar a contenedores de Windows.After installing and starting Docker, right-click on the tray icon and select Switch to Windows containers. Esto es necesario para ejecutar imágenes de Docker basadas en Windows.This is required to run Docker images based on Windows. Este comando tarda algunos segundos en ejecutarse:This command takes a few seconds to execute:

Contenedor de WindowsWindows Container

Publicar scriptPublish script

Reúna en un mismo lugar todos los recursos que necesita cargar en una imagen de Docker.Collect all the assets that you need to load into a Docker image in one place. Puede usar el comando Publicar de Visual Studio para crear un perfil de publicación para la aplicación.You can use the Visual Studio Publish command to create a publish profile for your app. Este perfil incluirá todos los recursos en un árbol de directorio que copia en la imagen de destino más adelante en este tutorial.This profile will put all the assets in one directory tree that you copy to your target image later in this tutorial.

Pasos de publicaciónPublish Steps

  1. Haga clic con el botón derecho en el proyecto web en Visual Studio y seleccione Publicar.Right click on the web project in Visual Studio, and select Publish.
  2. Haga clic en el botón Perfil personalizado y después seleccione Sistema de archivos como método.Click the Custom profile button, and then select File System as the method.
  3. Elija el directorio.Choose the directory. Por convención, el ejemplo descargado usa bin\Release\PublishOutput.By convention, the downloaded sample uses bin\Release\PublishOutput.

Conexión de publicaciónPublish Connection

Abra la sección Opciones de publicación de archivos de la pestaña Configuración. Seleccione Precompilar durante la publicación.Open the File Publish Options section of the Settings tab. Select Precompile during publishing. Esta optimización significa que compilará vistas en el contenedor de Docker, está copiando las vistas precompiladas.This optimization means that you'll be compiling views in the Docker container, you are copying the precompiled views.

Configuración de publicaciónPublish Settings

Haga clic en Publicar y Visual Studio copiará todos los recursos necesarios en la carpeta de destino.Click Publish, and Visual Studio will copy all the needed assets to the destination folder.

Compilar la imagenBuild the image

Defina la imagen de Docker en un Dockerfile.Define your Docker image in a Dockerfile. El Dockerfile que contenga instrucciones para la imagen base, componentes adicionales, la aplicación que quiere ejecutar y otras imágenes de configuración.The Dockerfile contains instructions for the base image, additional components, the app you want to run, and other configuration images. El Dockerfile es la entrada al comando docker build, que crea la imagen.The Dockerfile is the input to the docker build command, which creates the image.

Creará una imagen basada en la imagen microsoft/aspnet que se encuentra en Docker Hub.You will build an image based on the microsoft/aspnet image located on Docker Hub. La imagen base, microsoft/aspnet, es una imagen de Windows Server.The base image, microsoft/aspnet, is a Windows Server image. Contiene Windows Server Core, IIS y ASP.NET 4.6.2.It contains Windows Server Core, IIS and ASP.NET 4.6.2. Al ejecutar esta imagen en el contenedor, iniciará de forma automática IIS y los sitios web instalados.When you run this image in your container, it will automatically start IIS and installed websites.

El Dockerfile que crea la imagen tiene el siguiente aspecto:The Dockerfile that creates your image looks like this:

# The `FROM` instruction specifies the base image. You are
# extending the `microsoft/aspnet` image.

FROM microsoft/aspnet

# The final instruction copies the site you published earlier into the container.
COPY ./bin/Release/PublishOutput/ /inetpub/wwwroot

No hay ningún comando ENTRYPOINT en este Dockerfile.There is no ENTRYPOINT command in this Dockerfile. No se necesita ninguno.You don't need one. Cuando se ejecuta Windows Server con IIS, el proceso IIS es el punto de entrada, que está configurado para iniciarse en la imagen base de aspnet.When running Windows Server with IIS, the IIS process is the entrypoint, which is configured to start in the aspnet base image.

Ejecute el comando de compilación Docker para crear la imagen que se ejecuta en la aplicación ASP.NET.Run the Docker build command to create the image that runs your ASP.NET app. Para ello, abra una ventana de PowerShell en el directorio del proyecto y escriba el siguiente comando en el directorio de la solución:To do this, open a PowerShell window in the directory of your project and type the following command in the solution directory:

docker build -t mvcrandomanswers .

Este comando creará la nueva imagen con las instrucciones en el Dockerfile, nomenclatura (-t etiquetado) la imagen como mvcrandomanswers.This command will build the new image using the instructions in your Dockerfile, naming (-t tagging) the image as mvcrandomanswers. Esto puede incluir la extracción de la imagen base de Docker Hub y después agrega la aplicación a esa imagen.This may include pulling the base image from Docker Hub, and then adding your app to that image.

Una vez que el comando finaliza, puede ejecutar el comando docker images para ver información sobre la nueva imagen:Once that command completes, you can run the docker images command to see information on the new image:

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
mvcrandomanswers              latest              86838648aab6        2 minutes ago       10.1 GB

El IDENTIFICADOR DE LA IMAGEN será diferente en su equipo.The IMAGE ID will be different on your machine. Ahora, ejecutará la aplicación.Now, let's run the app.

Iniciar un contenedorStart a container

Inicie un contenedor mediante la ejecución del siguiente comando docker run:Start a container by executing the following docker run command:

docker run -d --name randomanswers mvcrandomanswers

El argumento -d indica a Docker que inicie la imagen en modo desasociado.The -d argument tells Docker to start the image in detached mode. Esto significa que la imagen de Docker se ejecuta desconectada del shell actual.That means the Docker image runs disconnected from the current shell.

En muchos ejemplos de docker, pueden sufrir -p para asignar los puertos de contenedor y el host.In many docker examples, you may see -p to map the container and host ports. La imagen de aspnet predeterminada ya configuró el contenedor para que escuche en el puerto 80 y exponerlo.The default aspnet image has already configured the container to listen on port 80 and expose it.

El argumento --name randomanswers da un nombre al contenedor en ejecución.The --name randomanswers gives a name to the running container. Puede usar este nombre en lugar del identificador del contenedor en la mayoría de los comandos.You can use this name instead of the container ID in most commands.

El argumento mvcrandomanswers es el nombre de la imagen que se iniciará.The mvcrandomanswers is the name of the image to start.

Comprobar en el exploradorVerify in the browser

Nota

Con la versión actual del contenedor de Windows, no puede ir a http://localhost.With the current Windows Container release, you can't browse to http://localhost. Esto se debe a un comportamiento conocido en WinNAT y se resolverá en el futuro.This is a known behavior in WinNAT, and it will be resolved in the future. Hasta que se solucione, debe usar la dirección IP del contenedor.Until that is addressed, you need to use the IP address of the container.

Una vez iniciado el contenedor, encontrará su dirección IP para poder conectarse al contenedor en ejecución desde un explorador:Once the container starts, find its IP address so that you can connect to your running container from a browser:

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" randomanswers
172.31.194.61

Conectar con el contenedor en ejecución con la dirección IPv4, http://172.31.194.61 en el ejemplo mostrado.Connect to the running container using the IPv4 address, http://172.31.194.61 in the example shown. Escriba esa dirección URL en el explorador y debería ver el sitio en ejecución.Type that URL into your browser, and you should see the running site.

Nota

Algún software de proxy o VPN puede impedir que explore su sitio.Some VPN or proxy software may prevent you from navigating to your site. Puede deshabilitarlo de forma temporal para asegurarse de que el contenedor funciona.You can temporarily disable it to make sure your container is working.

El directorio de ejemplo en GitHub contiene un script de PowerShell que ejecuta estos comandos.The sample directory on GitHub contains a PowerShell script that executes these commands for you. Abra una ventana de PowerShell, cambie el directorio por el directorio de la solución y escriba:Open a PowerShell window, change directory to your solution directory, and type:

./run.ps1

El comando anterior crea la imagen, muestra la lista de imágenes del equipo, inicia un contenedor y muestra la dirección IP de ese contenedor.The command above builds the image, displays the list of images on your machine, starts a container, and displays the IP address for that container.

Para detener el contenedor, envíe un comando docker stop:To stop your container, issue a docker stop command:

docker stop randomanswers

Para quitar el contenedor, envíe un comando docker rm:To remove the container, issue a docker rm command:

docker rm randomanswers