Erstellen von Docker-Images für .NET Core-AnwendungenBuilding Docker Images for .NET Core Applications

In diesem Tutorial liegt der Schwerpunkt auf der Verwendung von .NET Core in Docker.In this tutorial, We focus on how to use .NET Core on Docker. Zunächst werden die unterschiedlichen Docker-Images erläutert, die von Microsoft angeboten und verwaltet werden, sowie einige Anwendungsfälle.First, we explore the different Docker images offered and maintained by Microsoft, and use cases. Sie erfahren, wie eine ASP.NET Core-App erstellt und in Docker bereitgestellt wird.We then learn how to build and dockerize an ASP.NET Core app.

Im Verlauf dieses Tutorials lernen Sie Folgendes:During the course of this tutorial, you learn:

  • Allgemeines zu Docker-Images in Microsoft .NET CoreLearn about Microsoft .NET Core Docker images
  • das Abrufen einer ASP.NET Core-Beispiel-App für die Bereitstellung in DockerGet an ASP.NET Core sample app to Dockerize
  • das lokale Ausführen der ASP.NET-Beispiel-AppRun the ASP.NET sample app locally
  • das Erstellen und Ausführen des Beispiels mit Docker für Linux-ContainerBuild and run the sample with Docker for Linux containers
  • das Erstellen und Ausführen des Beispiels mit Docker für Windows-ContainerBuild and run the sample with Docker for Windows containers

Docker-Image-OptimierungenDocker Image Optimizations

Beim Erstellen von Docker-Images für Entwickler standen drei wichtige Szenarios im Mittelpunkt:When building Docker images for developers, we focused on three main scenarios:

  • Images zum Entwickeln von .NET Core-AppsImages used to develop .NET Core apps
  • Images zum Erstellen von .NET Core-AppsImages used to build .NET Core apps
  • Images zum Ausführen von .NET Core-AppsImages used to run .NET Core apps

Warum drei Images?Why three images? Beim Entwickeln, Erstellen und Ausführen von Containeranwendungen gibt es unterschiedliche Prioritäten.When developing, building, and running containerized applications, we have different priorities.

  • Entwicklung: Die Priorität liegt hierbei auf dem schnellen Durchführen von Änderungen sowie auf dem Debuggen der Änderungen.Development: The priority focuses on quickly iterate changes, and the ability to debug the changes. Die Größe des Images ist nicht entscheidend, sondern ob Änderungen am Code vorgenommen und schnell angezeigt werden können.The size of the image isn't as important, rather can you make changes to your code and see them quickly?

  • Build: Dieses Image enthält alle Bestandteile, die zum Kompilieren Ihrer App erforderlich sind. Dazu zählen der Compiler und alle anderen Abhängigkeiten, die zum Optimieren der Binärdateien verwendet werden.Build: This image contains everything needed to compile your app, which includes the compiler and any other dependencies to optimize the binaries. Sie verwenden das Buildimage zum Erstellen der Objekte, die Sie in einem Produktionsimage platzieren.You use the build image to create the assets you place into a production image. Dieses Image wird für die Continuous Integration oder in einer Buildumgebung verwendet.The build image would be used for continuous integration, or in a build environment. Dieser Ansatz ermöglicht einem Build-Agent das Kompilieren und Erstellen der Anwendung (mit allen erforderlichen Abhängigkeiten) in einer Instanz des Buildimages.This approach allows a build agent to compile and build the application (with all the required dependencies) in a build image instance. Der Build-Agent muss nur wissen, wie dieses Docker-Image ausgeführt wird.Your build agent only needs to know how to run this Docker image.

  • Produktion: Wie schnell kann das Image bereitgestellt und gestartet werden?Production: How fast you can deploy and start your image? Da dieses Image klein ist, ist die Netzwerkleistung von Ihrer Docker-Registrierung zu Ihren Docker-Hosts ideal.This image is small so network performance from your Docker Registry to your Docker hosts is optimized. Die Inhalte sind bereit zur Ausführung und ermöglichen in kürzester Zeit nach dem Dockerlauf das Verarbeiten von Ergebnissen.The contents are ready to run enabling the fastest time from Docker run to processing results. Die dynamische Codekompilierung ist im Docker-Modell nicht erforderlich.Dynamic code compilation isn't needed in the Docker model. Die Inhalte, die Sie in diesem Image platzieren, sind auf die Binärdateien und Inhalte beschränkt, die zum Ausführen der Anwendung erforderlich sind.The content you place in this image would be limited to the binaries and content needed to run the application.

    Die dotnet publish-Ausgabe enthält beispielsweise:For example, the dotnet publish output contains:

    • die kompilierten Binärdateienthe compiled binaries
    • JS- und CSS-Dateien.js and .css files

Sie sollten die dotnet publish-Befehlsausgabe Ihrem Produktionsimage hinzufügen, um die Größe so gering wie möglich zu halten.The reason to include the dotnet publish command output in your production image is to keep its size to a minimum.

Einige .NET Core-Images geben die Ebenen zwischen verschiedenen Tags frei, sodass es sich beim Herunterladen der aktuellen Tags um einen einfachen Vorgang handelt.Some .NET Core images share layers between different tags so downloading the latest tag is a relatively lightweight process. Wenn Sie bereits über eine ältere Version auf Ihrem Computer verfügen, verringert diese Architektur den erforderlichen Speicherplatz.If you already have an older version on your machine, this architecture decreases the needed disk space.

Wenn mehrere Anwendungen gemeinsame Images auf demselben Computer verwenden, wird der Arbeitsspeicher zwischen den gemeinsamen Images aufgeteilt.When multiple applications use common images on the same machine, memory is shared between the common images. Hierzu müssen die Images identisch sein.The images must be the same to be shared.

Docker-Image-VariantenDocker image variations

Zum Erreichen der oben genannten Ziele werden unter microsoft/dotnet Imagevarianten bereitgestellt.To achieve the goals above, we provide image variants under microsoft/dotnet.

  • microsoft/dotnet:<version>-sdk (microsoft/dotnet:2.1-sdk) Dieses Image enthält das .NET Core SDK, das die .NET Core- und CLI-Tools (Command Line Interface) enthält.microsoft/dotnet:<version>-sdk(microsoft/dotnet:2.1-sdk) This image contains the .NET Core SDK, which includes the .NET Core and Command Line Tools (CLI). Dieses Image ist dem Entwicklungsszenario zugeordnet.This image maps to the development scenario. Dieses Image wird für die lokale Entwicklung sowie für das Debuggen und für Komponententests verwendet.You use this image for local development, debugging, and unit testing. Dieses Image kann auch für Build-Szenarios verwendet werden.This image can also be used for your build scenarios. Mithilfe von microsoft/dotnet:sdk können Sie jederzeit die aktuelle Version abrufen.Using microsoft/dotnet:sdk always gives you the latest version.

Tipp

Bei Unsicherheiten bezüglich Ihrer Anforderungen sollten Sie das microsoft/dotnet:<version>-sdk-Image verwenden.If you are unsure about your needs, you want to use the microsoft/dotnet:<version>-sdk image. Es wurde als allgemeines Image entwickelt, um als Basiscontainer (zum Einbinden Ihres Quellcodes und Starten des Containers, um die App zu starten) und als Basisimage zum Erstellen von anderen Images verwendet zu werden.As the "de facto" image, it's designed to be used as a throw away container (mount your source code and start the container to start your app), and as the base image to build other images from.

  • microsoft/dotnet:<version>-runtime: Dieses Image enthält die .NET Core-Runtime und -Bibliotheken und wurde für das Ausführen von .NET Core-Apps in der Produktion optimiert.microsoft/dotnet:<version>-runtime: This image contains the .NET Core (runtime and libraries) and is optimized for running .NET Core apps in production.

Alternative ImagesAlternative images

Zusätzliche Images zu den optimierten Szenarios für Entwicklung, Erstellung und Produktion:In addition to the optimized scenarios of development, build and production, we provide additional images:

  • microsoft/dotnet:<version>-runtime-deps: Das Image runtime-deps enthält das Betriebssystem und alle für .NET Core erforderlichen nativen Abhängigkeiten.microsoft/dotnet:<version>-runtime-deps: The runtime-deps image contains the operating system with all of the native dependencies needed by .NET Core. Dieses Image ist für eigenständige Anwendungen vorgesehen.This image is for self-contained applications.

Aktuelle Versionen jeder Variante:Latest versions of each variant:

  • microsoft/dotnet oder microsoft/dotnet:latest (Alias für das SDK-Image)microsoft/dotnet or microsoft/dotnet:latest (alias for the SDK image)
  • microsoft/dotnet:sdk
  • microsoft/dotnet:runtime
  • microsoft/dotnet:runtime-deps

Hilfreiche BeispieleSamples to explore

Ihre erste Docker-App mit ASP.NET CoreYour first ASP.NET Core Docker app

In diesem Beispiel wird eine Docker-Beispielanwendung für ASP.NET-Core für die App verwendet, die in Docker bereitgestellt werden soll.For this tutorial, lets use an ASP.NET Core Docker sample application for the app we want to dockerize. Diese Docker-Beispielanwendung für ASP.NET Core veranschaulicht eine bewährte Methode zum Erstellen von Docker-Images für ASP.NET Core-Apps für die Produktion.This ASP.NET Core Docker sample application demonstrates a best practice pattern for building Docker images for ASP.NET Core apps for production. Das Beispiel funktioniert sowohl mit Linux- als auch mit Windows-Containern.The sample works with both Linux and Windows containers.

Die Dockerfile-Beispieldatei erstellt ein Docker-Image einer ASP.NET Core-Anwendung, das auf dem Docker-Basisimage der ASP.NET Core-Runtime basiert.The sample Dockerfile creates an ASP.NET Core application Docker image based off of the ASP.NET Core Runtime Docker base image.

Dieses verwendet das Docker-Feature für mehrstufige Builds für:It uses the Docker multi-stage build feature to:

  • das Erstellen des Beispiels in einem Container, der auf dem größeren Docker-Basisimage für ASP.NET Core-Builds basiertbuild the sample in a container based on the larger ASP.NET Core Build Docker base image
  • das Kopieren der finalen Buildergebnisse in ein Docker-Image, das auf dem kleineren Docker-Basisimage der ASP.NET Core-Runtime basiertcopies the final build result into a Docker image based on the smaller ASP.NET Core Docker Runtime base image

Hinweis

Das Buildimage enthält im Gegensatz zum Runtimeimage die erforderlichen Tools zum Erstellen von Anwendungen.The build image contains required tools to build applications while the runtime image does not.

Erforderliche KomponentenPrerequisites

Installieren Sie zum Erstellen und Ausführen folgende Elemente:To build and run, install the following items:

.NET Core 2.1 SDK.NET Core 2.1 SDK

  • Installieren Sie das .NET Core SDK 2.1.Install .NET Core SDK 2.1.

  • Installieren Sie Ihren bevorzugten Code-Editor, wenn Sie dies nicht bereits erledigt haben.Install your favorite code editor, if you haven't already.

Tipp

Benötigen Sie einen Code-Editor?Need to install a code editor? Testen Sie Visual Studio.Try Visual Studio!

Installieren des Docker-ClientsInstalling Docker Client

Installieren Sie den Docker-Client Docker 18.03 oder höher.Install Docker 18.03 or later of the Docker client.

Der Docker-Client kann unter folgenden Betriebssystemen installiert werden:The Docker client can be installed in:

Installieren von Git für BeispielrepositorysInstalling Git for sample repository

  • Installieren Sie Git, wenn Sie das Repository klonen möchten.Install git if you wish to clone the repository.

Abrufen der BeispielanwendungGetting the sample application

Sie können das Beispiel am einfachsten abrufen, indem Sie mithilfe der folgenden Anweisungen das .NET Core Docker-Repository mit Git klonen:The easiest way to get the sample is by cloning the .NET Core Docker repository with git, using the following instructions:

git clone https://github.com/dotnet/dotnet-docker

Sie können das Repository ebenfalls als ZIP-Datei (die Datei ist klein) vom Docker-Repository für .NET Core herunterladen.You can also download the repository (it is small) as a zip from the .NET Core Docker repository.

Lokales Ausführen der ASP.NET-AppRun the ASP.NET app locally

Als Bezugspunkt, bevor die Anwendung containerisiert wird, führen Sie die Anwendung zunächst lokal aus.For a reference point, before we containerize the application, first run the application locally.

Sie können die Anwendung mithilfe des .NET Core 2.1 SDK lokal erstellen und ausführen, indem Sie folgende Befehle verwenden (die Anweisungen gehen vom Stamm des Repositorys aus):You can build and run the application locally with the .NET Core 2.1 SDK using the following commands (The instructions assume the root of the repository):

cd dotnet-docker
cd samples
cd aspnetapp // solution scope where the dockerfile is located
cd aspnetapp // project scope

dotnet run

Rufen Sie nach dem Starten der Anwendung http://localhost:5000 im Webbrowser auf.After the application starts, visit http://localhost:5000 in your web browser.

das Erstellen und Ausführen des Beispiels mit Docker für Linux-ContainerBuild and run the sample with Docker for Linux containers

Sie können das Beispiel in Docker mit Linux-Containern erstellen und ausführen, indem Sie folgende Befehle verwenden (die Anweisungen gehen vom Stamm des Repositorys aus):You can build and run the sample in Docker using Linux containers using the following commands (The instructions assume the root of the repository):

cd dotnet-docker
cd samples
cd aspnetapp // solution scope where the dockerfile is located

docker build -t aspnetapp .
docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp

Hinweis

Das docker run-Argument „-p“ ordnet Port 5000 auf Ihrem lokalen Computer zu Port 80 im Container zu (das Format für die Zuordnung von Ports lautet host:container).The docker run '-p' argument maps port 5000 on your local machine to port 80 in the container (the port mapping form is host:container). Weitere Informationen finden Sie unter den Befehlszeilenparametern in der Referenz zu docker run.For more information, see the docker run reference on command-line parameters.

Rufen Sie nach dem Starten der Anwendung http://localhost:5000 im Webbrowser auf.After the application starts, visit http://localhost:5000 in your web browser.

das Erstellen und Ausführen des Beispiels mit Docker für Windows-ContainerBuild and run the sample with Docker for Windows containers

Sie können das Beispiel in Docker mit Windows-Containern erstellen und ausführen, indem Sie folgende Befehle verwenden (die Anweisungen gehen vom Stamm des Repositorys aus):You can build and run the sample in Docker using Windows containers using the following commands (The instructions assume the root of the repository):

cd dotnet-docker
cd samples
cd aspnetapp // solution scope where the dockerfile is located

docker build -t aspnetapp .
docker run -it --rm --name aspnetcore_sample aspnetapp

Wichtig

Sie müssen direkt in Ihrem Browser zur IP-Adresse des Containers navigieren (im Gegensatz zu http://localhost)), wenn Sie Windows-Container verwenden.You must navigate to the container IP address (as opposed to http://localhost) in your browser directly when using Windows containers. Sie können die IP-Adresse Ihres Containers abrufen, indem Sie folgende Schritte ausführen:You can get the IP address of your container with the following steps:

  • Öffnen Sie eine weitere Eingabeaufforderung.Open up another command prompt.
  • Führen Sie docker ps aus, um Ihre ausgeführten Container anzuzeigen.Run docker ps to see your running containers. Der Container „aspnetcore_sample“ sollte angezeigt werden.The "aspnetcore_sample" container should be there.
  • Führen Sie aus docker exec aspnetcore_sample ipconfig.Run docker exec aspnetcore_sample ipconfig.
  • Kopieren Sie die IP-Adresse des Containers (z.B. 172.29.245.43), und fügen Sie diese in Ihrem Browser ein.Copy the container IP address and paste into your browser (for example, 172.29.245.43).

Hinweis

„docker exec“ identifiziert Container per Name oder Hash.Docker exec supports identifying containers with name or hash. In diesem Beispiel wird der Name (aspnetcore_sample) verwendet.The name (aspnetcore_sample) is used in our example.

Im folgenden Beispiel wird dargestellt, wie Sie die IP-Adresse eines ausgeführten Windows-Containers abrufen können.See the following example of how to get the IP address of a running Windows container.

docker exec aspnetcore_sample ipconfig

Windows IP Configuration

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : contoso.com
   Link-local IPv6 Address . . . . . : fe80::1967:6598:124:cfa3%4
   IPv4 Address. . . . . . . . . . . : 172.29.245.43
   Subnet Mask . . . . . . . . . . . : 255.255.240.0
   Default Gateway . . . . . . . . . : 172.29.240.1

Hinweis

„docker exec“ führt einen neuen Befehl in einem ausgeführten Container aus.Docker exec runs a new command in a running container. Weitere Informationen finden Sie unter den Befehlszeilenparametern in der Referenz zu docker exec.For more information, see the docker exec reference on command-line parameters.

Sie können eine Anwendung, die für die Produktion bereitgestellt werden kann, lokal mithilfe des Befehls dotnet publish erstellen.You can produce an application that is ready to deploy to production locally using the dotnet publish command.

dotnet publish -c Release -o published

Hinweis

Das Argument „-c Release“ erstellt die Anwendung im Releasemodus (der Standardwert ist der Debugmodus).The -c Release argument builds the application in release mode (the default is debug mode). Weitere Informationen finden Sie unter den Befehlszeilenparametern in der Referenz zu dotnet run.For more information, see the dotnet run reference on command-line parameters.

Sie können die Anwendung mithilfe des folgenden Befehls unter Windows ausführen.You can run the application on Windows using the following command.

dotnet published\aspnetapp.dll

Sie können die Anwendung mithilfe des folgenden Befehls unter Linux oder macOS ausführen.You can run the application on Linux or macOS using the following command.

dotnet published/aspnetapp.dll

In diesem Beispiel verwendete Docker-ImagesDocker Images used in this sample

Folgende Docker-Images werden in der Dockerfile-Datei dieses Beispiels verwendet.The following Docker images are used in this sample's dockerfile.

  • microsoft/dotnet:2.1-sdk
  • microsoft/dotnet:2.1-aspnetcore-runtime

Herzlichen Glückwunsch!Congratulations! Sie haben gerade:you have just:

  • Allgemeines zu Docker-Images in Microsoft .NET Core erfahrenLearned about Microsoft .NET Core Docker images
  • eine ASP.NET Core-Beispiel-App für die Bereitstellung in Docker abgerufenGot an ASP.NET Core sample app to Dockerize
  • die ASP.NET-Beispiel-App lokal ausgeführtRan the ASP.NET sample app locally
  • das Beispiel mit Docker für Linux-Container erstellt und ausgeführtBuilt and ran the sample with Docker for Linux containers
  • das Beispiel mit Docker für Windows-Container erstellt und ausgeführtBuilt and ran the sample with Docker for Windows containers

Nächste SchritteNext Steps

Im Folgenden finden Sie weiterführende Schritte:Here are some next steps you can take:

Hinweis

Wenn Sie kein Azure-Abonnement besitzen, registrieren Sie sich noch heute für ein kostenloses 30-Tage-Konto, und erhalten Sie ein Azure-Guthaben in Höhe von 200 US-Dollar, um eine beliebige Kombination von Azure-Diensten zu testen.If you do not have an Azure subscription, sign up today for a free 30-day account and get $200 in Azure Credits to try out any combination of Azure services.