Ausführen von Konsolenanwendungen in Windows-ContainernRunning console applications in Windows containers

Konsolenanwendungen werden für verschiedene Zwecke verwendet – vom einfachen Abfragen eines Status bis hin zu Aufgaben zur Verarbeitung von Dokumentbildern mit langer Laufzeit.Console applications are used for many purposes; from simple querying of a status to long running document image processing tasks. In allen Fällen wird die Möglichkeit, diese Anwendungen zu starten und zu skalieren, durch Hardwarekäufe, Startzeiten oder die Ausführung mehrerer Instanzen eingeschränkt.In any case, the ability to start up and scale these applications are met with limitations of hardware acquisitions, startup times or running multiple instances.

Indem Sie Ihre Konsolenanwendungen in Docker- und Windows Server-Container verlagern, können diese Anwendungen mit einem fehlerfreien Status gestartet werden, den Vorgang ausführen und dann ordnungsgemäß beendet werden.Moving your console applications to use Docker and Windows Server containers allows for starting these applications from a clean state, enabling them to perform the operation and then shutdown cleanly. Dieses Thema erläutert die Schritte, die erforderlich sind, um eine Konsolenanwendung in einen Windows-basierten Container zu verlagern und mithilfe eines PowerShell-Skripts zu starten.This topic will show the steps needed to move a console application to a Windows based container and start it using a PowerShell script.

Als Beispiel dient eine einfache Konsolenanwendung, die ein Argument akzeptiert – in diesem Fall eine Frage – und eine zufällige Antwort zurückgibt.The sample console application is a simple example which takes an argument, a question in this case, and returns a random answer. Die Anwendung könnte auch eine customer_id akzeptieren und die entsprechenden Steuern berechnen oder eine Miniaturansicht für ein image_url-Argument erstellen.This could take a customer_id and process their taxes, or create a thumbnail for an image_url argument.

Zusätzlich zur Antwort wurde der Antwort auch der Environment.MachineName hinzugefügt, um den Unterschied zwischen der Ausführung der Anwendung im lokalen System oder in einem Windows-Container zu zeigen.In addition to the answer, the Environment.MachineName has been added to the response to show the difference between running the application locally and in a Windows container. Wenn die Anwendung lokal ausgeführt wird, wird der Name des lokalen Computers zurückgegeben. Bei Ausführung in einem Windows-Container wird die ID der Containersitzung zurückgegeben.When running the application locally, your local machine name should be returned and when running in a Windows Container; the container session id is returned.

Das vollständige Beispiel finden Sie im dotnet/docs-Repository auf GitHub.The complete example is available in the dotnet/docs repository on GitHub. Anweisungen zum Herunterladen finden Sie unter Beispiele und Lernprogramme.For download instructions, see Samples and Tutorials.

Sie müssen sich mit einigen Docker-Begriffen vertraut machen, bevor Sie damit beginnen, Ihre Anwendung in einen Container zu verlagern.You need to be familiar with some Docker terms before you begin working on moving your application to a container.

Ein Docker-Image ist eine schreibgeschützte Vorlage, die die Umgebung für einen ausgeführten Container definiert, einschließlich Betriebssystem, Systemkomponenten und Anwendung(en).A Docker image is a read-only template that defines the environment for a running container, including the operating system (OS), system components, and application(s).

Ein wichtiges Merkmal der Docker-Images ist es, dass Images aus einem Basisimage zusammengestellt werden.One important feature of Docker images is that images are composed from a base image. Jedes neue Image fügt einen kleinen Satz an Funktionen zu einem vorhandenen Image hinzu.Each new image adds a small set of features to an existing image.

Ein Docker-Container ist eine ausgeführte Instanz eines Images.A Docker container is a running instance of an image.

Sie skalieren eine Anwendung, indem Sie das gleiche Image in mehreren Containern ausführen.You scale an application by running the same image in many containers. Vom Konzept her ähnelt dieses Vorgehen der Ausführung der gleichen Anwendung auf mehreren Hosts.Conceptually, this is similar to running the same application in multiple hosts.

Weitere Informationen zur Docker-Architektur finden Sie auf der Docker-Website unter Docker Overview (Übersicht über Docker).You can learn more about the Docker architecture by reading the Docker Overview on the Docker site.

Die Verlagerung Ihrer Konsolenanwendung erfordert nur einige wenige Schritte.Moving your console application is a matter of a few steps.

  1. Erstellen der AnwendungBuild the application
  2. Erstellen einer Dockerfile-Datei für das ImageCreating a Dockerfile for the image
  3. Erstellen und Ausführen des Docker-ContainersProcess to build and run the Docker container

Erforderliche KomponentenPrerequisites

Windows-Container werden unter Windows 10 Anniversary Update oder Windows Server 2016 unterstützt.Windows containers are supported on Windows 10 Anniversary Update or Windows Server 2016.

Hinweis

Wenn Sie Windows Server 2016 verwenden, müssen Sie Container manuell aktivieren, da das Installationsprogramm für Docker für Windows die Funktion nicht aktiviert.If you are using Windows Server 2016, you must enable containers manually since the Docker for Windows installer will not enable the feature. Stellen Sie sicher, dass alle Updates für das Betriebssystem ausgeführt wurden, und folgen Sie dann den Anweisungen des Artikels Containerhostbereitstellung, um die Container und Docker-Funktionen zu installieren.Make sure all updates have run for the OS and then follow the instructions from the Container Host Deployment article to install the containers and Docker features.

Sie müssen über Docker für Windows, Version 1.12 Beta 26 oder höher, verfügen, um Windows-Container zu unterstützen.You need to have Docker for Windows, version 1.12 Beta 26 or higher to support Windows containers. Standardmäßig arbeitet Docker mit Linux-basierten Containern. Wechseln Sie zu Windows-Containern, indem Sie in der Taskleiste mit der rechten Maustaste auf das Docker-Symbol klicken und Zu Windows-Containern wechseln auswählen.By default, Docker enables Linux based containers; switch to Windows containers by right clicking the Docker icon in the system tray and select Switch to Windows containers. Docker führt den Änderungsprozess aus. Möglicherweise ist ein Neustart erforderlich.Docker will run the process to change and a restart may be required.

Windows-Container

Erstellen der AnwendungBuilding the application

Konsolenanwendungen werden üblicherweise über ein Installationsprogramm, einen FTP-Speicherort oder eine Dateifreigabe verteilt.Typically console applications are distributed through an installer, FTP, or File Share deployment. Wenn Sie eine Anwendung in einem Container bereitstellen, müssen die Assets kompiliert und an einem Speicherort bereitgestellt werden, der beim Erstellen des Docker-Images verwendet werden kann.When deploying to a container, the assets need to be compiled and staged to a location that can be used when the Docker image is created.

In build.ps1 verwendet das Skript MSBuild, um die Anwendung zu kompilieren und so die Erstellung der Assets abzuschließen.In build.ps1, the script uses MSBuild to compile the application to complete the task of building the assets. Es werden einige Parameter an MSBuild übergeben, um die benötigten Assets zu finalisieren.There are a few parameters passed to MSBuild to finalize the needed assets. Der Name der Projektdatei oder Projektmappe, die kompiliert werden soll, der Speicherort der Ausgabe und schließlich die Konfiguration („Release“ oder „Debug“).The name of the project file or solution to be compiled, the location for the output and finally the configuration (Release or Debug).

Im Aufruf von Invoke-MSBuild ist der OutputPath auf publish festgelegt und die Configuration auf Release.In the call to Invoke-MSBuild the OutputPath is set to publish and Configuration set to Release.

function Invoke-MSBuild ([string]$MSBuildPath, [string]$MSBuildParameters) {
    Invoke-Expression "$MSBuildPath $MSBuildParameters"
}

Invoke-MSBuild -MSBuildPath "MSBuild.exe" -MSBuildParameters ".\ConsoleRandomAnswerGenerator.csproj /p:OutputPath=.\publish /p:Configuration=Release"

Erstellen der Dockerfile-DateiCreating the Dockerfile

Das für eine .NET Framework-Konsolenanwendung verwendete Basisimage ist microsoft/windowsservercore, öffentlich verfügbar im Docker-Hub.The base image used for a console .NET Framework application is microsoft/windowsservercore, publicly available on Docker Hub. Das Basisimage umfasst eine Minimalinstallation mit Windows Server 2016 und .NET Framework 4.6.2 und dient als grundlegendes Betriebssystemimage für Windows-Container.The base image contains a minimal installation of Windows Server 2016, .NET Framework 4.6.2 and serves as the base OS image for Windows Containers.

FROM microsoft/windowsservercore
ADD publish/ /
ENTRYPOINT ConsoleRandomAnswerGenerator.exe

Die erste Zeile der Dockerfile-Datei gibt mithilfe der FROM-Anweisung das Basisimage an.The first line in the Dockerfile designates the base image using the FROM instruction. Danach kopiert ADD in der Datei die Anwendungsassets aus dem Ordner publish in den Stammordner des Containers, und zum Schluss wird mit ENTRYPOINT der Befehl oder die Anwendung festgelegt, der bzw. die beim Starten des Containers ausgeführt wird.Next, ADD in the file copies the application assets from the publish folder to root folder of the container and last; setting the ENTRYPOINT of the image states that this is the command or application that will run when the container starts.

Erstellen des ImagesCreating the image

Um das Docker-Image zu erstellen, wird dem Skript build.ps1 folgender Code hinzugefügt.In order to create the Docker image, the following code is added to the build.ps1 script. Wenn das Skript ausgeführt wird, wird das console-random-answer-generator-Image mithilfe der Assets erstellt, die aus dem im Abschnitt Erstellen der Anwendung definierten MSBuild kompiliert wurden.When the script is run, the console-random-answer-generator image is created using the assets compiled from MSBuild defined in the Building the application section.

$ImageName="console-random-answer-generator"

function Invoke-Docker-Build ([string]$ImageName, [string]$ImagePath, [string]$DockerBuildArgs = "") {
    echo "docker build -t $ImageName $ImagePath $DockerBuildArgs"
    Invoke-Expression "docker build -t $ImageName $ImagePath $DockerBuildArgs"
}

Invoke-Docker-Build -ImageName $ImageName -ImagePath "."

Führen Sie das Skript unter Verwendung von .\build.ps1 in der PowerShell-Befehlszeile aus.Run the script using .\build.ps1 from the PowerShell command prompt.

Wenn der Build abgeschlossen ist, verwenden Sie den Befehl docker images in einer Befehlszeile oder PowerShell-Eingabeaufforderung. Damit wird das Image erstellt und ist bereit zur Ausführung.When the build is complete, using the docker images command from a command line or PowerShell prompt; you'll see that the image is created and ready to be run.

REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
console-random-answer-generator   latest              8f7c807db1b5        8 seconds ago       7.33 GB

Ausführen des ContainersRunning the container

Sie können den Container mithilfe der Docker-Befehle in der Befehlszeile starten.You can start the container from the command line using the Docker commands.

docker run console-random-answer-generator "Are you a square container?"

Ausgabe:The output is

The answer to your question: 'Are you a square container?' is Concentrate and ask again on (70C3D48F4343)

Wenn Sie den docker ps -a-Befehl in PowerShell ausführen, können Sie sehen, dass der Container immer noch vorhanden ist.If you run the docker ps -a command from PowerShell, you can see that the container still exists.

CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS                          
70c3d48f4343        console-random-answer-generator   "cmd /S /C ConsoleRan"   2 minutes ago       Exited (0) About a minute ago      

Die Statusspalte zeigt bei „About a minute ago“, dass die Anwendung vor ungefähr einer Minute abgeschlossen wurde und beendet werden kann.The STATUS column shows at "About a minute ago", the application was complete and could be shut down. Wenn der Befehl hundert Mal ausgeführt wurde, würden hundert Container in statischem Zustand ohne Aufgabe zurückbleiben.If the command was run a hundred times, there would be a hundred containers left static with no work to do. Im Anfangsszenario bestand der ideale Vorgang darin, die erforderlichen Funktionen auszuführen und dann zu beenden oder zu bereinigen.In the beginning scenario the ideal operation was to do the work and shutdown or cleanup. Um diesen Workflow vollständig durchzuführen, fügen Sie die Option --rm zum docker run-Befehl hinzu, um den Container zu entfernen, sobald das Signal Exited empfangen wurde.To accomplish that workflow, adding the --rm option to the docker run command will remove the container as soon as the Exited signal is received.

docker run --rm console-random-answer-generator "Are you a square container?"

Führen Sie den Befehl mit dieser Option aus, und betrachten Sie dann die Ausgabe des docker ps -a-Befehls. Sie werden feststellen, dass sich die Container-ID (Environment.MachineName) nicht mehr in der Liste befindet.Running the command with this option and then looking at the output of docker ps -a command; notice that the container id (the Environment.MachineName) is not in the list.

Ausführen des Container mithilfe von PowerShellRunning the container using PowerShell

In den Beispielprojektdateien befindet sich auch die Datei run.ps1. Diese ist ein Beispiel dafür, wie Sie PowerShell verwenden, um die Anwendung auszuführen, wobei die Argumente akzeptiert werden.In the sample project files there is also a run.ps1 which is an example of how to use PowerShell to run the application accepting the arguments.

Um die Datei auszuführen, öffnen Sie PowerShell, und verwenden Sie folgenden Befehl:To run, open PowerShell and use the following command:

.\run.ps1 "Is this easy or what?"

ZusammenfassungSummary

Sie können Ihre .NET Framework-Konsolenanwendungen in Containern ausführen, indem Sie einfach eine Dockerfile-Datei hinzufügen und die Anwendung veröffentlichen. So können Sie mehrere Instanzen ausführen, sauber starten und beenden und von mehr Windows Server 2016-Funktionen profitieren, ohne den Anwendungscode selbst in irgendeiner Weise zu ändern.Just by adding a Dockerfile and publishing the application, you can containerize your .NET Framework console applications and now take the advantage of running multiple instances, clean start and stop and more Windows Server 2016 capabilities without making any changes to the application code at all.