Migrieren von ASP.NET MVC-Anwendungen zu Windows-ContainernMigrating ASP.NET MVC Applications to Windows Containers

Wird eine vorhandene .NET Framework-basierte Anwendung in einem Windows-Container ausgeführt, sind keine Änderungen an der Anwendung erforderlich.Running an existing .NET Framework-based application in a Windows container doesn't require any changes to your app. Um die Anwendung in einem Windows-Container auszuführen, erstellen Sie ein Docker-Image, das die Anwendung enthält, und starten Sie den Container.To run your app in a Windows container you create a Docker image containing your app and start the container. In diesem Thema wird erläutert, wie eine vorhandene ASP.NET MVC-Anwendung übernommen und in einem Windows-Container bereitgestellt wird.This topic explains how to take an existing ASP.NET MVC application and deploy it in a Windows container.

Sie beginnen mit einer vorhandenen ASP.NET MVC-Anwendung und erstellen dann mit Visual Studio die veröffentlichten Objekte.You start with an existing ASP.NET MVC app, then build the published assets using Visual Studio. Mithilfe von Docker erstellen Sie das Image, in dem die Anwendung enthalten ist und aus dem sie ausgeführt wird.You use Docker to create the image that contains and runs your app. Sie navigieren zu der Website, die in einem Windows-Container ausgeführt wird, und vergewissern sich, dass die Anwendung funktioniert.You'll browse to the site running in a Windows container and verify the app is working.

Dieser Artikel setzt Grundkenntnisse in Docker voraus.This article assumes a basic understanding of Docker. Ausführlichere Informationen zu Docker finden Sie unter Docker Overview.You can learn about Docker by reading the Docker Overview.

Die Anwendung, die Sie in einem Container ausführen, ist eine einfache Website, die Fragen nach dem Zufallsprinzip beantwortet.The app you'll run in a container is a simple website that answers questions randomly. Diese Anwendung ist eine grundlegende MVC-Anwendung ohne Authentifizierung oder Datenbankspeicher. Somit wird es Ihnen ermöglicht, sich auf das Verschieben der Webebene in einen Container zu konzentrieren.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. In zukünftigen Themen wird das Verschieben und Verwalten von beständigem Speicher in Containeranwendungen gezeigt.Future topics will show how to move and manage persistent storage in containerized applications.

Das Verschieben Ihrer Anwendung umfasst folgenden Schritte:Moving your application involves these steps:

  1. Erstellen einer Veröffentlichungsaufgabe, um die Objekte für ein Image zu erstellenCreating a publish task to build the assets for an image.
  2. Erstellen eines Docker-Images, das die Anwendung ausführtBuilding a Docker image that will run your application.
  3. Starten eines Docker-Containers, der das Image ausführtStarting a Docker container that runs your image.
  4. Überprüfen der Anwendung mit Ihrem BrowserVerifying the application using your browser.

Die fertige Anwendung finden Sie auf GitHub.The finished application is on GitHub.

Erforderliche KomponentenPrerequisites

Der Entwicklungscomputer muss funktionsbereit sein.The development machine must be running

Wichtig

Wenn Sie Windows Server 2016 verwenden, gehen Sie entsprechend den Anweisungen für Containerhostbereitstellung: Windows Server vor.If you are using Windows Server 2016, follow the instructions for Container Host Deployment - Windows Server.

Nachdem Sie Docker installiert und gestartet haben, klicken Sie mit der rechten Maustaste auf das Taskleistensymbol, und wählen Sie Switch to Windows containers aus.After installing and starting Docker, right-click on the tray icon and select Switch to Windows containers. Dies ist erforderlich, um Docker-Images unter Windows auszuführen.This is required to run Docker images based on Windows. Die Ausführung dieses Befehls dauert ein paar Sekunden:This command takes a few seconds to execute:

Windows-ContainerWindows Container

Veröffentlichen des SkriptsPublish script

Sammeln Sie alle Objekte, die Sie in ein Docker-Image laden müssen, in einem Speicherort.Collect all the assets that you need to load into a Docker image in one place. Sie können den Visual Studio-Befehl Veröffentlichen verwenden, um ein Veröffentlichungsprofil für Ihre Anwendung zu erstellen.You can use the Visual Studio Publish command to create a publish profile for your app. In diesem Profil sind alle Objekte in einer einzigen Verzeichnisstruktur untergebracht, die Sie später in diesem Tutorial in Ihr Zielimage kopieren.This profile will put all the assets in one directory tree that you copy to your target image later in this tutorial.

VeröffentlichungsschrittePublish Steps

  1. Klicken Sie mit der rechten Maustaste in Visual Studio auf das Webprojekt, und wählen Sie Veröffentlichen.Right click on the web project in Visual Studio, and select Publish.
  2. Klicken Sie auf die Schaltfläche Benutzerdefiniertes Profil, und wählen Sie Dateisystem als Methode aus.Click the Custom profile button, and then select File System as the method.
  3. Wählen Sie das Verzeichnis aus.Choose the directory. Konventionsgemäß verwendet das heruntergeladene Beispiel bin\Release\PublishOutput.By convention, the downloaded sample uses bin\Release\PublishOutput.

VeröffentlichungsverbindungPublish Connection

Öffnen Sie den Abschnitt Dateiveröffentlichungsoptionen der Registerkarte Einstellungen. Wählen Sie Während der Veröffentlichung vorkompilieren.Open the File Publish Options section of the Settings tab. Select Precompile during publishing. Diese Optimierung bedeutet, dass Sie beim Kompilieren von Ansichten im Docker-Container die vorkompilierten Ansichten kopieren.This optimization means that you'll be compiling views in the Docker container, you are copying the precompiled views.

VeröffentlichungseinstellungenPublish Settings

Klicken Sie auf Veröffentlichen, und Visual Studio kopiert alle erforderlichen Objekte in den Zielordner.Click Publish, and Visual Studio will copy all the needed assets to the destination folder.

Erstellen des ImagesBuild the image

Definieren Sie das Docker-Image in einer Dockerfile-Datei.Define your Docker image in a Dockerfile. Die Dockerfile-Datei enthält Anweisungen für das Basisimage, zusätzliche Komponenten, die Anwendung, die Sie ausführen möchten, und weitere Konfigurationsimages.The Dockerfile contains instructions for the base image, additional components, the app you want to run, and other configuration images. Die Dockerfile-Datei ist die Eingabe für den docker build-Befehl, der das Image erstellt.The Dockerfile is the input to the docker build command, which creates the image.

Sie erstellen ein Image auf der Grundlage des microsoft/aspnet-Images, das sich auf dem Docker-Hub befindet.You will build an image based on the microsoft/aspnet image located on Docker Hub. Das Basisimage microsoft/aspnet ist ein Windows Server-Image.The base image, microsoft/aspnet, is a Windows Server image. Es enthält Windows Server Core, IIS und ASP.NET 4.6.2.It contains Windows Server Core, IIS and ASP.NET 4.6.2. Wenn Sie dieses Image im Container ausführen, werden IIS und die installierten Websites automatisch gestartet.When you run this image in your container, it will automatically start IIS and installed websites.

Die Dockerfile-Datei, die das Image erstellt, sieht folgendermaßen aus: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

Es gibt keinen ENTRYPOINT-Befehl in dieser Dockerfile-Datei.There is no ENTRYPOINT command in this Dockerfile. Sie benötigen ihn nicht.You don't need one. Wenn Windows Server mit IIS ausgeführt wird, ist der IIS-Prozess Entrypoint, das in das Aspnet-Basisimage Starten konfiguriert ist.When running Windows Server with IIS, the IIS process is the entrypoint, which is configured to start in the aspnet base image.

Führen Sie den Docker-Erstellungsbefehl aus, um das Image zu erstellen, über das die ASP.NET-Anwendung ausgeführt wird.Run the Docker build command to create the image that runs your ASP.NET app. Zu diesem Zweck öffnen Sie ein PowerShell-Fenster im Verzeichnis des Projekts, und geben Sie den folgenden Befehl in dem Projektmappenverzeichnis: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 .

Mit diesem Befehl wird das neue Abbild mithilfe der Anweisungen in die dockerfile-Datei erstellen naming (-t-Kennzeichnung) das Bild als Mvcrandomanswers.This command will build the new image using the instructions in your Dockerfile, naming (-t tagging) the image as mvcrandomanswers. Dies kann beinhalten, dass Sie das Basisimage aus Docker Hub abrufen und dann Ihre Anwendung zu diesem Image hinzufügen müssen.This may include pulling the base image from Docker Hub, and then adding your app to that image.

Nach Abschluss dieses Befehls können Sie den docker images-Befehl ausführen, um Informationen über das neue Image anzuzeigen: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

Die IMAGE-ID wird auf Ihrem Computer anders lauten.The IMAGE ID will be different on your machine. Führen Sie die Anwendung jetzt aus.Now, let's run the app.

Starten eines ContainersStart a container

Starten Sie mit folgendem docker run-Befehl einen Container:Start a container by executing the following docker run command:

docker run -d --name randomanswers mvcrandomanswers

Das -d-Argument weist Docker an, das Image im getrennten Modus zu starten.The -d argument tells Docker to start the image in detached mode. Das bedeutet, dass das Docker-Image getrennt von der aktuellen Shell ausgeführt wird.That means the Docker image runs disconnected from the current shell.

In vielen Beispielen Docker möglicherweise -p, ordnen Sie die Container und Host-Ports angezeigt.In many docker examples, you may see -p to map the container and host ports. Standard-Aspnet-Image wurde bereits konfiguriert, den Container zum Lauschen an Port 80 und verfügbar gemacht.The default aspnet image has already configured the container to listen on port 80 and expose it.

--name randomanswers gibt dem ausgeführten Container einen Namen.The --name randomanswers gives a name to the running container. Sie können diesen Namen in den meisten Befehlen anstelle der Container-ID verwenden.You can use this name instead of the container ID in most commands.

mvcrandomanswers ist der Name des zu startenden Images.The mvcrandomanswers is the name of the image to start.

Überprüfen im BrowserVerify in the browser

Hinweis

Mit der aktuellen Version von Windows-Container, die Sie zum navigieren können nicht http://localhost.With the current Windows Container release, you can't browse to http://localhost. Dies ist ein bekanntes Verhalten in WinNAT und wird in Zukunft gelöst.This is a known behavior in WinNAT, and it will be resolved in the future. Bis zur Behebung dieses Fehlers müssen Sie die IP-Adresse des Containers verwenden.Until that is addressed, you need to use the IP address of the container.

Nach dem Start des Containers ermitteln Sie dessen IP-Adresse, damit Sie über einen Browser eine Verbindung mit dem ausgeführten Container herstellen können: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

Herstellen einer Verbindung mit dem ausgeführten Container mithilfe der IPv4-Adresse http://172.31.194.61 im dargestellten Beispiel.Connect to the running container using the IPv4 address, http://172.31.194.61 in the example shown. Wenn Sie diese URL in Ihren Browser eingeben, sollte die ausgeführte Website angezeigt werden.Type that URL into your browser, and you should see the running site.

Hinweis

Manche VPN- oder Proxysoftware könnte Ihren Wechsel zu Ihrer Website verhindern.Some VPN or proxy software may prevent you from navigating to your site. Sie können diese Software vorübergehend deaktivieren, um sicherzustellen, dass der Container ausgeführt wird.You can temporarily disable it to make sure your container is working.

Das Beispielverzeichnis auf GitHub enthält ein PowerShell-Skript, das diese Befehle für Sie ausführt.The sample directory on GitHub contains a PowerShell script that executes these commands for you. Öffnen Sie ein PowerShell-Fenster, wechseln Sie in das Projektmappenverzeichnis, und geben Sie ein:Open a PowerShell window, change directory to your solution directory, and type:

./run.ps1

Der vorstehende Befehl erstellt das Image, zeigt die Liste der Images auf dem Computer an, startet einen Container und zeigt die IP-Adresse für diesen Container an.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.

Um den Container zu stoppen, geben Sie einen docker stop-Befehl ein:To stop your container, issue a docker stop command:

docker stop randomanswers

Um den Container zu entfernen, geben Sie einen docker rm-Befehl ein:To remove the container, issue a docker rm command:

docker rm randomanswers