Freigeben über


Lernprogramm: Containerisieren einer .NET-App

In diesem Lernprogramm erfahren Sie, wie Sie eine .NET-Anwendung mit Docker containern. Container verfügen über viele Features und Vorteile, z. B. eine unveränderliche Infrastruktur, bieten eine tragbare Architektur und ermöglichen skalierbarkeit. Das Image kann verwendet werden, um Container für Ihre lokale Entwicklungsumgebung, private Cloud oder öffentliche Cloud zu erstellen.

In diesem Tutorial:

  • Erstellen und Veröffentlichen einer einfachen .NET-App
  • Erstellen und Konfigurieren einer Dockerfile für .NET
  • Erstellen eines Docker-Images
  • Erstellen und Ausführen eines Docker-Containers

Sie untersuchen die Aufgaben zum Erstellen und Bereitstellen von Docker-Containern für eine .NET-Anwendung. Die Docker-Plattform verwendet die Docker-Engine, um Pakete schnell als Docker-Images zu erstellen und zu packen. Diese Images werden im Dockerfile-Format geschrieben, um in einem mehrstufigen Container bereitgestellt und ausgeführt zu werden.

Tipp

Wenn Sie Ihre .NET-App als Container bereitstellen möchten, ohne Docker oder Podman zu benötigen, lesen Sie Containerbereitstellung einer .NET-App mit dotnet publish.

Anmerkung

Dieses Tutorial gilt nicht für ASP.NET Core-Apps. Wenn Sie ASP.NET Core verwenden, sehen Sie sich das Tutorial zum Containerisieren einer ASP.NET Core-Anwendung an.

Voraussetzungen

Die folgenden Komponenten müssen installiert sein:

  • .NET 8+ SDK.
    Wenn .NET installiert ist, verwenden Sie den Befehl dotnet --info, um zu bestimmen, welches SDK Sie verwenden.
  • Docker Community Edition.
  • Ein temporärer Arbeitsordner für das Dockerfile und eine .NET-Beispiel-App. In diesem Tutorial trägt der Arbeitsordner den Namen docker-working.

Erstellen einer .NET-App

Sie benötigen eine .NET-App, die im Docker-Container läuft. Öffnen Sie Ihr Terminal, erstellen Sie einen Arbeitsordner, falls noch nicht geschehen, und geben Sie den Ordnernamen ein. Führen Sie im Arbeitsordner den folgenden Befehl aus, um ein neues Projekt in einem Unterverzeichnis namens App-zu erstellen:

dotnet new console -o App -n DotNet.Docker

Die Ordnerstruktur sieht ähnlich wie die folgende Verzeichnisstruktur aus:

📁 docker-working
    └──📂 App
        ├──DotNet.Docker.csproj
        ├──Program.cs
        └──📂 obj
            ├── DotNet.Docker.csproj.nuget.dgspec.json
            ├── DotNet.Docker.csproj.nuget.g.props
            ├── DotNet.Docker.csproj.nuget.g.targets
            ├── project.assets.json
            └── project.nuget.cache

Der Befehl dotnet new erstellt einen neuen Ordner namens App- und generiert eine Konsolenanwendung "Hello World". Ändern Sie jetzt die Verzeichnisse, und navigieren Sie in der Terminalsitzung zum Ordner App. Verwenden Sie den Befehl dotnet run, um die App zu starten. Die Anwendung wird ausgeführt, und Hello World! wird unter dem Befehl ausgegeben:

cd App
dotnet run
Hello World!

Die Standardvorlage erstellt eine App, die eine Ausgabe im Terminal anzeigt und dann sofort beendet wird. Für dieses Tutorial verwenden Sie eine App, die auf unbestimmte Zeit ausgeführt wird. Öffnen Sie die Program.cs Datei in einem Text-Editor.

Tipp

Wenn Sie Visual Studio Code verwenden, geben Sie in der vorherigen Terminalsitzung den folgenden Befehl ein:

code .

Mit diesem Befehl wird der Ordner App- geöffnet, der das Projekt in Visual Studio Code enthält.

Die Program.cs sollte wie der folgende C#-Code aussehen:

Console.WriteLine("Hello World!");

Ersetzen Sie die Datei durch den folgenden Code, der Zahlen jede Sekunde zählt:

var counter = 0;
var max = args.Length is not 0 ? Convert.ToInt32(args[0]) : -1;

while (max is -1 || counter < max)
{
    Console.WriteLine($"Counter: {++counter}");

    await Task.Delay(TimeSpan.FromMilliseconds(1_000));
}
var counter = 0;
var max = args.Length is not 0 ? Convert.ToInt32(args[0]) : -1;

while (max is -1 || counter < max)
{
    Console.WriteLine($"Counter: {++counter}");

    await Task.Delay(TimeSpan.FromMilliseconds(1_000));
}

Speichern Sie die Datei, und testen Sie das Programm erneut mit dotnet run. Denken Sie daran, dass diese App unbegrenzt ausgeführt wird. Verwenden Sie den Befehl "Abbrechen" STRG+C, um ihn zu beenden. Betrachten Sie die folgende Beispielausgabe:

dotnet run
Counter: 1
Counter: 2
Counter: 3
Counter: 4
^C

Wenn Sie dem Programm eine Zahl in der Befehlszeile übergeben, wird die Anzahl auf diesen Wert beschränkt, und das Programm wird beendet. Versuchen Sie es mit dotnet run -- 5, um auf fünf zu zählen.

Wichtig

Alle Parameter nach -- werden nicht an den Befehl dotnet run übergeben und werden stattdessen an Ihre Anwendung weitergeleitet.

.NET-App veröffentlichen

Damit die App für die Erstellung von Bildern geeignet ist, muss sie kompiliert werden. Der dotnet publish-Befehl eignet sich am besten dafür, da er die App erstellt und veröffentlicht. Eine ausführliche Referenz finden Sie in der Dokumentation der Befehle dotnet build und dotnet publish.

dotnet publish -c Release

Tipp

Wenn Sie Ihre .NET-App als Container veröffentlichen möchten, ohne Docker zu benötigen, lesen Sie Erstellen eines Containers für eine .NET-App mit dotnet publish.

Der Befehl dotnet publish kompiliert Ihre App in den Ordner Veröffentlichen. Der Pfad zum Ordner Veröffentlichen vom Arbeitsordner aus sollte ./App/bin/Release/<TFM>/publish/ sein:

Rufen Sie über den Ordner App eine Verzeichnisliste des Veröffentlichungsordners ab, um sicherzustellen, dass die Datei DotNet.Docker.dll erstellt wurde.

dir .\bin\Release\net9.0\publish\

    Directory: C:\Users\default\docker-working\App\bin\Release\net9.0\publish

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          1/6/2025  10:11 AM            431 DotNet.Docker.deps.json
-a----          1/6/2025  10:11 AM           6144 DotNet.Docker.dll
-a----          1/6/2025  10:11 AM         145408 DotNet.Docker.exe
-a----          1/6/2025  10:11 AM          11716 DotNet.Docker.pdb
-a----          1/6/2025  10:11 AM            340 DotNet.Docker.runtimeconfig.json
dir .\bin\Release\net8.0\publish\

    Directory: C:\Users\default\docker-working\App\bin\Release\net8.0\publish

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           9/22/2023  9:17 AM            431 DotNet.Docker.deps.json
-a---           9/22/2023  9:17 AM           6144 DotNet.Docker.dll
-a---           9/22/2023  9:17 AM         157696 DotNet.Docker.exe
-a---           9/22/2023  9:17 AM          11688 DotNet.Docker.pdb
-a---           9/22/2023  9:17 AM            353 DotNet.Docker.runtimeconfig.json

Erstellen der Dockerfile

Die Dockerfile-Datei wird vom Befehl docker build zum Erstellen des Containerimage verwendet. Diese Datei ist eine Textdatei mit dem Namen Dockerfile-, die keine Erweiterung hat.

Erstellen Sie eine Datei namens Dockerfile- im Verzeichnis, das die .csproj- enthält, und öffnen Sie sie in einem Text-Editor. In diesem Tutorial wird das ASP.NET Core-Runtimeimage (das das .NET-Runtimeimage enthält) verwendet, das der .NET-Konsolenanwendung entspricht.

FROM mcr.microsoft.com/dotnet/sdk:9.0@sha256:3fcf6f1e809c0553f9feb222369f58749af314af6f063f389cbd2f913b4ad556 AS build
WORKDIR /App

# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:9.0@sha256:b4bea3a52a0a77317fa93c5bbdb076623f81e3e2f201078d89914da71318b5d8
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]

Anmerkung

Das ASP.NET Core-Runtimeimage wird hier absichtlich verwendet, obwohl auch das mcr.microsoft.com/dotnet/runtime:9.0-Image stattdessen verwendet werden kann.

FROM mcr.microsoft.com/dotnet/sdk:8.0@sha256:35792ea4ad1db051981f62b313f1be3b46b1f45cadbaa3c288cd0d3056eefb83 AS build
WORKDIR /App

# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0@sha256:6c4df091e4e531bb93bdbfe7e7f0998e7ced344f54426b7e874116a3dc3233ff
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]

Anmerkung

Das ASP.NET Core-Runtimeimage wird hier absichtlich verwendet, obwohl auch das mcr.microsoft.com/dotnet/runtime:8.0-Image stattdessen verwendet werden kann.

Wichtig

Das Einschließen eines sicheren Hash-Algorithmus (SHA) nach dem Image-Tag in einem Dockerfile ist eine bewährte Methode. Dadurch wird sichergestellt, dass das Bild nicht manipuliert wird und dass das Bild mit dem bild identisch ist, das Sie erwarten. Die SHA ist ein eindeutiger Bezeichner für das Bild. Weitere Informationen finden Sie unter Docker-Dokumentation: Ein Image anhand des Digest herunterladen.

Tipp

Diese Dockerfile- verwendet mehrstufige Builds, die die endgültige Größe des Images optimieren, indem der Build schrittweise aufgebaut wird und nur die benötigten Artefakte übrigbleiben. Weitere Informationen finden Sie unter Docker-Dokumentation: mehrstufige Builds.

Für das FROM-Schlüsselwort ist der vollqualifizierte Name des Docker-Containerimages erforderlich. Die Microsoft Container Registry (MCR, mcr.microsoft.com) ist ein Syndikat von Docker Hub, das öffentlich zugängliche Container hostt. Das Segment dotnet ist das Containerrepository, wobei das Segment sdk oder aspnet der Name des Containerimages ist. Das Bild ist mit 9.0gekennzeichnet, das zur Versionsverwaltung verwendet wird. Daher ist mcr.microsoft.com/dotnet/aspnet:9.0 die .NET 9.0-Laufzeit. Stellen Sie sicher, dass Sie die Laufzeitversion abrufen, die der vom SDK vorgesehenen Laufzeit entspricht. Die im vorherigen Abschnitt erstellte App hat z. B. das .NET 9.0 SDK verwendet, und das Basisimage, auf das in der Dockerfile- verwiesen wird, wird mit 9.0-markiert.

Wichtig

Wenn Sie Windows-basierte Containerimages verwenden, müssen Sie das Image-Tag genauer spezifizieren als einfach nur 9.0, zum Beispiel mcr.microsoft.com/dotnet/aspnet:9.0-nanoserver-1809 anstelle von mcr.microsoft.com/dotnet/aspnet:9.0. Wählen Sie einen Imagenamen basierend darauf aus, ob Sie Nano Server oder Windows Server Core verwenden und welche Version dieses Betriebssystems verwendet wird. Eine vollständige Liste aller unterstützten Tags finden Sie auf der Docker Hub-Seite von .NET.

Speichern Sie die Dockerfile Datei. Die Verzeichnisstruktur des Arbeitsordners sollte wie folgt aussehen. Einige der tiefergehenden Dateien und Ordner werden weggelassen, um Speicherplatz im Artikel zu sparen:

📁 docker-working
    └──📂 App
        ├── Dockerfile
        ├── DotNet.Docker.csproj
        ├── Program.cs
        ├──📂 bin
        │   └───📂 Release
        │        └───📂 net9.0
        │             ├───📂 publish
        │             │    ├─── DotNet.Docker.deps.json
        │             │    ├─── DotNet.Docker.dll
        │             │    ├─── DotNet.Docker.exe
        │             │    ├─── DotNet.Docker.pdb
        │             │    └─── DotNet.Docker.runtimeconfig.json
        │             ├─── DotNet.Docker.deps.json
        │             ├─── DotNet.Docker.dll
        │             ├─── DotNet.Docker.exe
        │             ├─── DotNet.Docker.pdb
        │             └─── DotNet.Docker.runtimeconfig.json
        └──📁 obj
            └──...

Für das FROM-Schlüsselwort ist der vollqualifizierte Name des Docker-Containerimages erforderlich. Die Microsoft Container Registry (MCR, mcr.microsoft.com) ist ein Syndikat von Docker Hub, das öffentlich zugängliche Container hostt. Das Segment dotnet ist das Containerrepository, wobei das Segment sdk oder aspnet der Name des Containerimages ist. Das Bild ist mit 8.0markiert, das für die Versionierung verwendet wird. Daher ist mcr.microsoft.com/dotnet/aspnet:8.0 die .NET 8.0-Laufzeit. Stellen Sie sicher, dass Sie die Laufzeitversion abrufen, die der vom SDK vorgesehenen Laufzeit entspricht. Die im vorherigen Abschnitt erstellte App hat z. B. das .NET 8.0 SDK verwendet, und das Basisimage, auf das in der Dockerfile- verwiesen wird, wird mit 8.0-markiert.

Wichtig

Bei der Verwendung von Windows-basierten Container-Images müssen Sie das Image-Tag über das einfache 8.0 hinaus spezifizieren, zum Beispiel mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-1809 statt mcr.microsoft.com/dotnet/aspnet:8.0. Wählen Sie einen Imagenamen basierend darauf aus, ob Sie Nano Server oder Windows Server Core verwenden und welche Version dieses Betriebssystems verwendet wird. Eine vollständige Liste aller unterstützten Tags finden Sie auf der Docker Hub-Seite von .NET.

Speichern Sie die Dockerfile Datei. Die Verzeichnisstruktur des Arbeitsordners sollte wie folgt aussehen. Einige der tiefergehenden Dateien und Ordner werden weggelassen, um Speicherplatz im Artikel zu sparen:

📁 docker-working
    └──📂 App
        ├── Dockerfile
        ├── DotNet.Docker.csproj
        ├── Program.cs
        ├──📂 bin
        │   └──📂 Release
        │       └──📂 net8.0
        │           └──📂 publish
        │               ├── DotNet.Docker.deps.json
        │               ├── DotNet.Docker.exe
        │               ├── DotNet.Docker.dll
        │               ├── DotNet.Docker.pdb
        │               └── DotNet.Docker.runtimeconfig.json
        └──📁 obj
            └──...

Die Anweisung ENTRYPOINT setzt dotnet als Host für DotNet.Docker.dllfest. Es ist jedoch möglich, die ENTRYPOINT als die ausführbare App selbst zu definieren, wobei das Betriebssystem als Host der App fungiert.

ENTRYPOINT ["./DotNet.Docker"]

Dies bewirkt, dass die App direkt ohne dotnetausgeführt wird und stattdessen auf dem App-Host und dem zugrunde liegenden Betriebssystem basiert. Weitere Informationen zur Bereitstellung plattformübergreifender Binärdateien finden Sie unter Erstellen einer plattformübergreifenden Binärdatei.

Führen Sie zum Erstellen des Containers vom Terminal den folgenden Befehl aus:

docker build -t counter-image -f Dockerfile .

Docker verarbeitet die einzelnen Zeilen aus dem Dockerfile. . im Befehl docker build legt den Buildkontext des Images fest. Der Schalter -f ist der Pfad zur Dockerfile. Mit diesem Befehl wird das Image erstellt und ein lokales Repository mit dem Namen counter-image angelegt, das auf dieses Bild verweist. Führen Sie nach Abschluss dieses Befehls docker images aus, um eine Liste der installierten Images anzuzeigen:

REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
counter-image    latest    1c1f1433e51d   32 seconds ago   223MB
docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
counter-image    latest    2f15637dc1f6   10 minutes ago   217MB

Das Repository counter-image ist der Name des Images. Darüber hinaus sind das Imagetag, die Bildkennung, die Größe und das Erstellungsdatum Teil der Ausgabe. Die letzten Schritte in der Dockerfile sind das Erstellen eines Containers anhand des Images und Ausführen der App, das Kopieren der veröffentlichten App in den Container und das Festlegen des Einstiegspunkts:

FROM mcr.microsoft.com/dotnet/aspnet:9.0
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]

Der Befehl FROM gibt das zu verwendende Basisbild und das zu verwendende Tag an. Mit dem Befehl WORKDIR wird das aktuelle Verzeichnis im Container in App geändert.

Der Befehl COPY weist Docker an, das angegebene Quellverzeichnis in einen Zielordner zu kopieren. In diesem Beispiel werden die Inhalte in der build Ebene in den Ordner mit dem Namen App/out ausgegeben, sodass es die Quelle ist, aus der kopiert werden soll. Alle im Verzeichnis App/out veröffentlichten Inhalte werden in das aktuelle Arbeitsverzeichnis (App) kopiert.

Der nächste Befehl, ENTRYPOINT, weist Docker an, den Container so zu konfigurieren, dass er als ausführbare Datei ausgeführt wird. Wenn der Container gestartet wird, wird der Befehl ENTRYPOINT ausgeführt. Wenn dieser Befehl fertig ist, stoppt der Container automatisch.

Tipp

Vor .NET 8 können Container, die als schreibgeschützt ausgeführt werden, mit Failed to create CoreCLR, HRESULT: 0x8007000E fehlschlagen. Um dieses Problem zu beheben, geben Sie eine DOTNET_EnableDiagnostics Umgebungsvariable als 0 an (direkt vor dem ENTRYPOINT Schritt):

ENV DOTNET_EnableDiagnostics=0

Weitere Informationen zu verschiedenen .NET-Umgebungsvariablen finden Sie unter .NET-Umgebungsvariablen.

Anmerkung

.NET 6 standardisiert das Präfix DOTNET_ anstelle von COMPlus_ für Umgebungsvariablen, die das .NET-Laufzeitverhalten konfigurieren. Das Präfix COMPlus_ funktioniert jedoch weiterhin. Wenn Sie eine frühere Version der .NET-Laufzeit verwenden, sollten Sie weiterhin das präfix COMPlus_ für Umgebungsvariablen verwenden.

Einen Container erstellen

Nachdem Sie nun über ein Image verfügen, das Ihre App enthält, können Sie einen Container erstellen. Sie können einen Container auf zwei Arten erstellen. Erstellen Sie zunächst einen neuen Container, der beendet wird.

docker create --name core-counter counter-image

Dieser docker create-Befehl erstellt einen Container auf Grundlage des Images counter-image. Die Ausgabe des Befehls docker create zeigt Ihnen die CONTAINER ID (Ihr Bezeichner wird anders sein) des Containers:

d0be06126f7db6dd1cee369d911262a353c9b7fb4829a0c11b4b2eb7b2d429cf

Um eine Liste aller Container zu erhalten, verwenden Sie den docker ps -a-Befehl:

docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS    PORTS     NAMES
d0be06126f7d   counter-image   "dotnet DotNet.Docke…"   12 seconds ago   Created             core-counter

Verwalten des Containers

Der Container wurde mit einem bestimmten Namen core-countererstellt. Dieser Name wird zum Verwalten des Containers verwendet. Im folgenden Beispiel wird der Befehl docker start verwendet, um den Container zu starten, und anschließend wird der Befehl docker ps verwendet, um nur ausgeführte Container anzuzeigen:

docker start core-counter
core-counter

docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS     NAMES
cf01364df453   counter-image   "dotnet DotNet.Docke…"   53 seconds ago   Up 10 seconds             core-counter

Ebenso stoppt der befehl docker stop den Container. Im folgenden Beispiel wird der Befehl docker stop verwendet, um den Container zu beenden, und dann der Befehl docker ps, um anzuzeigen, dass keine Container ausgeführt werden:

docker stop core-counter
core-counter

docker ps
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

Mit einem Container verbinden

Nachdem ein Container ausgeführt wird, können Sie sich mit ihm verbinden, um die Ausgabe anzuzeigen. Verwenden Sie die Befehle docker start und docker attach, um den Container zu starten und einen Blick auf den Ausgabedatenstrom zu werfen. In diesem Beispiel wird die Tastenkombination STRG+C verwendet, um die Trennung vom ausgeführten Container durchzuführen. Diese Tastenkombination beendet den Prozess im Container, sofern nicht anders angegeben, was den Container anhalten würde. Der Parameter --sig-proxy=false stellt sicher, dass STRG+C den Prozess im Container nicht anhält.

Nachdem Sie den Container abgetrennt haben, fügen Sie ihn erneut an, um sicherzustellen, dass er noch läuft und zählt.

docker start core-counter
core-counter

docker attach --sig-proxy=false core-counter
Counter: 7
Counter: 8
Counter: 9
^C

docker attach --sig-proxy=false core-counter
Counter: 17
Counter: 18
Counter: 19
^C

Container löschen

In diesem Artikel möchten Sie nicht, dass Container vorhanden sind, die nichts bewirken. Löschen Sie den zuvor erstellten Container. Wenn der Container ausgeführt wird, beenden Sie ihn.

docker stop core-counter

Im folgenden Beispiel werden alle Container aufgelistet. Anschließend wird der Befehl docker rm verwendet, um den Container zu löschen, und danach überprüft das System ein zweites Mal, ob es laufende Container gibt.

docker ps -a
CONTAINER ID    IMAGE            COMMAND                   CREATED          STATUS                        PORTS    NAMES
2f6424a7ddce    counter-image    "dotnet DotNet.Dock…"    7 minutes ago    Exited (143) 20 seconds ago            core-counter

docker rm core-counter
core-counter

docker ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

Einzelausführung

Docker stellt den docker run Befehl zum Erstellen und Ausführen des Containers als einzelner Befehl bereit. Dieser Befehl beseitigt die Notwendigkeit, docker create auszuführen und dann docker start. Sie können diesen Befehl auch so festlegen, dass der Container automatisch gelöscht wird, wenn der Container beendet wird. Verwenden Sie beispielsweise docker run -it --rm, um zwei Dinge zu erledigen: Erstens das aktuelle Terminal automatisch zu verwenden, um sich mit dem Container zu verbinden, und danach den Container zu entfernen, wenn er fertig ist.

docker run -it --rm counter-image
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
^C

Der Container übergibt auch Parameter an die Ausführung der .NET-App, Um die .NET-App dazu zu bringen, nur bis drei zu zählen, geben Sie 3 ein.

docker run -it --rm counter-image 3
Counter: 1
Counter: 2
Counter: 3

Mit docker run -itbeendet der Befehl Strg+C den Prozess, der im Container ausgeführt wird, dadurch wird der Container gestoppt. Da der parameter --rm bereitgestellt wurde, wird der Container automatisch gelöscht, wenn der Prozess beendet wird. Stellen Sie sicher, dass sie nicht vorhanden ist:

docker ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

Ändern des EINSTIEGSPUNKTS

Mit dem Befehl docker run können Sie auch den befehl ENTRYPOINT aus dem Dockerfile- ändern und etwas anderes ausführen, aber nur für diesen Container. Verwenden Sie beispielsweise den folgenden Befehl, um bash oder cmd.exeauszuführen. Bearbeiten Sie den Befehl nach Bedarf.

In diesem Beispiel wird ENTRYPOINT in cmd.exegeändert. STRG+C wird gedrückt, um den Prozess zu beenden und den Container anzuhalten.

docker run -it --rm --entrypoint "cmd.exe" counter-image

Microsoft Windows [Version 10.0.17763.379]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\>dir
 Volume in drive C has no label.
 Volume Serial Number is 3005-1E84

 Directory of C:\

04/09/2019  08:46 AM    <DIR>          app
03/07/2019  10:25 AM             5,510 License.txt
04/02/2019  01:35 PM    <DIR>          Program Files
04/09/2019  01:06 PM    <DIR>          Users
04/02/2019  01:35 PM    <DIR>          Windows
               1 File(s)          5,510 bytes
               4 Dir(s)  21,246,517,248 bytes free

C:\>^C

Anmerkung

Dieses Beispiel funktioniert nur für Windows-Container. Linux-Container verfügen nicht über cmd.exe.

Wichtige Befehle

Docker verfügt über viele verschiedene Befehle zum Erstellen, Verwalten und Interagieren mit Containern und Images. Diese Docker-Befehle sind für die Verwaltung Ihrer Container unerlässlich:

Bereinigen von Ressourcen

In diesem Tutorial haben Sie Container und Images erstellt. Wenn Sie möchten, löschen Sie diese Ressourcen. Führen Sie die folgenden Befehle für diese Aktionen aus:

  1. Alle Container auflisten

    docker ps -a
    
  2. Zum Anhalten aller ausgeführten Container nach Namen

    docker stop core-counter
    
  3. Löschen des Containers

    docker rm core-counter
    

Löschen Sie als Nächstes alle Bilder, die Sie nicht mehr auf Ihrem Computer benötigen. Löschen Sie das von Ihrem Dockerfile- erstellte Image, und löschen Sie dann das .NET-Image, auf dem die Dockerfile- basiert. Sie können die IMAGE ID oder die mit REPOSITORY:TAG formatierte Zeichenfolge verwenden.

docker rmi counter-image:latest
docker rmi mcr.microsoft.com/dotnet/aspnet:9.0
docker rmi counter-image:latest
docker rmi mcr.microsoft.com/dotnet/aspnet:8.0

Verwenden Sie den Befehl docker images, um eine Liste der installierten Images anzuzeigen.

Tipp

Bilddateien können groß sein. In der Regel entfernen Sie temporäre Container, die Sie beim Testen und Entwickeln Ihrer App erstellt haben. In der Regel behalten Sie die Basisimages mit installierter Runtime, wenn Sie planen, andere Images auf Basis dieser Runtime zu erstellen.

Nächste Schritte