Migration d’applications ASP.NET MVC vers des conteneurs WindowsMigrating ASP.NET MVC Applications to Windows Containers

L’exécution d’une application .NET Framework existante dans un conteneur Windows ne nécessite aucune modification de votre application.Running an existing .NET Framework-based application in a Windows container doesn't require any changes to your app. Pour exécuter votre application dans un conteneur Windows, vous créez une image Docker contenant votre application et lancez le conteneur.To run your app in a Windows container you create a Docker image containing your app and start the container. Cette rubrique décrit comment prendre une application ASP.NET MVC existante et la déployer dans un conteneur Windows.This topic explains how to take an existing ASP.NET MVC application and deploy it in a Windows container.

Vous partez d’une application ASP.NET MVC existante, puis générez les ressources publiées à l’aide de Visual Studio.You start with an existing ASP.NET MVC app, then build the published assets using Visual Studio. Vous utilisez Docker pour créer l’image qui contient et exécute votre application.You use Docker to create the image that contains and runs your app. Vous allez accéder au site en cours d’exécution dans un conteneur Windows et vérifier que l’application fonctionne.You'll browse to the site running in a Windows container and verify the app is working.

Cet article suppose une connaissance élémentaire de Docker.This article assumes a basic understanding of Docker. Pour en savoir plus sur Docker, consultez la présentation de Docker.You can learn about Docker by reading the Docker Overview.

L’application que vous allez exécuter dans un conteneur est un site web simple qui répond à des questions de manière aléatoire.The app you'll run in a container is a simple website that answers questions randomly. Cette application est une application MVC de base sans authentification ni stockage de base de données, qui vous permet de vous concentrer sur le déplacement de la couche web vers un conteneur.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. Des rubriques futures montreront comment déplacer et gérer le stockage persistant dans des applications en conteneur.Future topics will show how to move and manage persistent storage in containerized applications.

Le déplacement de votre application implique les étapes suivantes :Moving your application involves these steps:

  1. Création d’une tâche de publication pour générer les ressources d’une imageCreating a publish task to build the assets for an image.
  2. Génération d’une image Docker destinée à exécuter votre applicationBuilding a Docker image that will run your application.
  3. Démarrage d’un conteneur Docker qui exécute votre imageStarting a Docker container that runs your image.
  4. Vérification de l’application à l’aide de votre navigateurVerifying the application using your browser.

L’application terminée se trouve sur GitHub.The finished application is on GitHub.

PrérequisPrerequisites

La machine de développement doit avoir le logiciel suivant :The development machine must have the following software:

Important

Si vous utilisez Windows Server 2016, suivez les instructions indiquées dans Déploiement d’un hôte de conteneurs – Windows Server.If you are using Windows Server 2016, follow the instructions for Container Host Deployment - Windows Server.

Après l’installation et le démarrage de Docker, cliquez avec le bouton droit de la souris sur l’icône de la barre d’état, puis sélectionnez Switch to Windows containers (Basculer vers les conteneurs Windows).After installing and starting Docker, right-click on the tray icon and select Switch to Windows containers. Cette action est nécessaire pour exécuter des images Docker basées sur Windows.This is required to run Docker images based on Windows. Cette commande prend quelques secondes :This command takes a few seconds to execute:

Conteneur WindowsWindows Container

Script de publicationPublish script

Regroupez toutes les ressources que vous avez besoin de charger dans une image Docker à un seul emplacement.Collect all the assets that you need to load into a Docker image in one place. Vous pouvez utiliser la commande Publier de Visual Studio pour créer un profil de publication pour votre application.You can use the Visual Studio Publish command to create a publish profile for your app. Ce profil placera toutes les ressources dans une arborescence de répertoires que vous copierez dans votre image cible plus loin dans ce didacticiel.This profile will put all the assets in one directory tree that you copy to your target image later in this tutorial.

Étapes de la publicationPublish Steps

  1. Cliquez avec le bouton droit sur le projet web dans Visual Studio et sélectionnez Publier.Right click on the web project in Visual Studio, and select Publish.
  2. Cliquez sur le bouton profil personnalisé, puis sélectionnez système de fichiers comme méthode.Click the Custom profile button, and then select File System as the method.
  3. Choisissez le répertoire.Choose the directory. Par convention, l’exemple téléchargé utilise bin\Release\PublishOutput.By convention, the downloaded sample uses bin\Release\PublishOutput.

Connexion pour la publicationPublish Connection

Ouvrez la section Options de publication des fichiers de l’onglet Paramètres. Sélectionnez Précompile lors de la publication.Open the File Publish Options section of the Settings tab. Select Precompile during publishing. Cette optimisation signifie que, quand vous compilez les vues dans le conteneur Docker, vous copiez les vues précompilées.This optimization means that you'll be compiling views in the Docker container, you are copying the precompiled views.

Publier les paramètresPublish Settings

Cliquez sur Publier ; Visual Studio copie alors toutes les ressources nécessaires dans le dossier de destination.Click Publish, and Visual Studio will copy all the needed assets to the destination folder.

Créer l’imageBuild the image

Créez un nouveau fichier nommé Dockerfile pour définir votre image Docker.Create a new file named Dockerfile to define your Docker image. Dockerfile contient des instructions pour construire l’image finale et inclut tous les noms d’images de base, les composants requis, l’application que vous souhaitez exécuter, et d’autres images de configuration.Dockerfile contains instructions to build the final image and includes any base image names, required components, the app you want to run, and other configuration images. Dockerfile est l’entrée à la docker build commande qui crée l’image.Dockerfile is the input to the docker build command that creates the image.

Pour cet exercice, vous construireez microsoft/aspnet une image basée sur l’image située sur Docker Hub.For this exercise, you will build an image based on the microsoft/aspnet image located on Docker Hub. L’image de base, microsoft/aspnet, est une image Windows Server.The base image, microsoft/aspnet, is a Windows Server image. Il contient Windows Server Core, IIS et ASP.NET 4.7.2.It contains Windows Server Core, IIS, and ASP.NET 4.7.2. Quand vous exécutez cette image dans votre conteneur, elle démarre automatiquement IIS et tous les sites web installés.When you run this image in your container, it will automatically start IIS and installed websites.

Le fichier Dockerfile qui crée votre image ressemble à ceci :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

Il n’existe aucune commande ENTRYPOINT dans ce fichier Dockerfile.There is no ENTRYPOINT command in this Dockerfile. Vous n’en avez pas besoin.You don't need one. Lors de l’exécution de Windows Server avec IIS, le processus IIS est le point d’entrée, qui est configuré pour démarrer dans l’image de base aspnet.When running Windows Server with IIS, the IIS process is the entrypoint, which is configured to start in the aspnet base image.

Exécutez la commande de génération Docker pour créer l’image qui exécute votre application ASP.NET.Run the Docker build command to create the image that runs your ASP.NET app. Pour ce faire, ouvrez une fenêtre PowerShell dans l’annuaire de votre projet et tapez la commande suivante dans le répertoire de la solution :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 .

Cette commande construira la nouvelle image en utilisant les instructions dans votre Dockerfile, nommant (-t marquage) l’image comme mvcrandomanswers.This command will build the new image using the instructions in your Dockerfile, naming (-t tagging) the image as mvcrandomanswers. Celles-ci peuvent inclure l’extraction de l’image de base du Hub Docker, puis l’ajout de votre application à cette image.This may include pulling the base image from Docker Hub, and then adding your app to that image.

Une fois cette commande terminée, vous pouvez exécuter la commande docker images pour afficher des informations sur la nouvelle image :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

L’ID de l’image sera différent sur votre ordinateur.The IMAGE ID will be different on your machine. À présent, exécutons l’application.Now, let's run the app.

Démarrer un conteneurStart a container

Démarrez un conteneur en exécutant la commande docker run suivante :Start a container by executing the following docker run command:

docker run -d --name randomanswers mvcrandomanswers

L’argument -d indique à Docker de démarrer l’image en mode détaché.The -d argument tells Docker to start the image in detached mode. Cela signifie que l’image Docker s’exécute déconnectée de l’interpréteur de commandes actuel.That means the Docker image runs disconnected from the current shell.

Dans de nombreux exemples de dockers, vous pouvez voir -p pour cartographier le conteneur et les ports hôtes.In many docker examples, you may see -p to map the container and host ports. L’image aspnet par défaut a déjà configuré le conteneur pour écouter sur le port 80 et l’exposer.The default aspnet image has already configured the container to listen on port 80 and expose it.

La portion --name randomanswers donne un nom au conteneur en cours d’exécution.The --name randomanswers gives a name to the running container. Vous pouvez utiliser ce nom au lieu de l’ID de conteneur dans la plupart des commandes.You can use this name instead of the container ID in most commands.

mvcrandomanswers est le nom de l’image à démarrer.The mvcrandomanswers is the name of the image to start.

Vérifier dans le navigateurVerify in the browser

Une fois le conteneur démarre, http://localhost connectez-vous au conteneur en marche à l’aide de l’exemple indiqué.Once the container starts, connect to the running container using http://localhost in the example shown. Tapez cette URL dans votre navigateur ; vous devriez voir le site en cours d’exécution.Type that URL into your browser, and you should see the running site.

Note

Certains logiciels VPN ou proxy peuvent vous empêcher d’accéder à votre site.Some VPN or proxy software may prevent you from navigating to your site. Vous pouvez les désactiver temporairement pour vérifier que votre conteneur fonctionne.You can temporarily disable it to make sure your container is working.

Le répertoire d’exemples sur GitHub contient un script PowerShell qui exécute ces commandes pour vous.The sample directory on GitHub contains a PowerShell script that executes these commands for you. Ouvrez une fenêtre PowerShell, accédez au répertoire de votre solution et tapez la commande suivante :Open a PowerShell window, change directory to your solution directory, and type:

./run.ps1

La commande ci-dessus construit l’image, affiche la liste des images sur votre machine, et démarre un conteneur.The command above builds the image, displays the list of images on your machine, and starts a container.

Pour arrêter le conteneur, exécutez une commande docker stop :To stop your container, issue a docker stop command:

docker stop randomanswers

Pour supprimer le conteneur, exécutez une commande docker rm :To remove the container, issue a docker rm command:

docker rm randomanswers