Einführung zu .NET und Docker

Container sind eine der am häufigsten verwendeten Methoden zum Bereitstellen und Hosten von Cloudanwendungen mit Tools wie Docker, Kubernetes und Podman. Viele Entwickler*innen entscheiden sich für Container, weil es einfach ist, eine App mit den zugehörigen Abhängigkeiten zu verpacken und diese App zuverlässig auf einem beliebigen Containerhost auszuführen. Für die Verwendung von .NET mit Containern ist umfassende Unterstützung verfügbar.

Docker bietet eine hervorragende Übersicht über Container. Docker Desktop: Community Edition ist ein gutes Tool für die Verwendung von Containern auf Entwicklerdesktopcomputern.

.NET-Images

Offizielle .NET-Containerimages werden in der Microsoft-Artefaktregistrierung veröffentlicht und sind im Docker Hub verfügbar. Es sind Runtimeimages für die Produktion und SDK-Images zum Erstellen Ihres Codes für Linux (Alpine, Debian, Ubuntu, Mariner) und Windows verfügbar. Weitere Informationen finden Sie unter .NET-Containerimages.

.NET-Images werden regelmäßig aktualisiert, wenn ein neuer .NET-Patch veröffentlicht oder ein Basisimage eines Betriebssystems aktualisiert wird.

Chiseled-Containerimages sind Ubuntu-Containerimages mit den mindestens erforderlichen Komponenten für die .NET-Runtime. Diese Images sind rund 100 MB kleiner als die regulären Ubuntu-Images und enthalten weniger CVEs, da sie weniger Komponenten aufweisen. Insbesondere enthalten sie keinen Shell- oder Paket-Manager, was ihr Sicherheitsprofil erheblich verbessert. Sie enthalten auch einen Nicht-Stammbenutzer, der in ihrer Konfiguration aktiviert ist.

Erstellen von Containerimages

Sie können ein Containerimage mit einer Dockerfile erstellen oder das .NET SDK zum Erstellen eines Images verwenden. Beispiele zum Erstellen von Images finden Sie unter dotnet/dotnet-docker und dotnet/sdk-container-builds.

Das folgende Beispiel zeigt, wie Sie ein Containerimage mit einigen schnellen Schritten erstellen und ausführen können (unterstützt von .NET 8 und .NET 7.0.300).

$ dotnet new webapp -o webapp
$ cd webapp/
$ dotnet publish -t:PublishContainer
MSBuild version 17.8.3+195e7f5a3 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  webapp -> /home/rich/webapp/bin/Release/net8.0/webapp.dll
  webapp -> /home/rich/webapp/bin/Release/net8.0/publish/
  Building image 'webapp' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
  Pushed image 'webapp:latest' to local registry via 'docker'.
$ docker run --rm -d -p 8000:8080 webapp
7c7ad33409e52ddd3a9d330902acdd49845ca4575e39a6494952b642e584016e
$ curl -s http://localhost:8000 | grep ASP.NET
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
$ docker ps
CONTAINER ID   IMAGE     COMMAND               CREATED              STATUS              PORTS                                       NAMES
7c7ad33409e5   webapp    "dotnet webapp.dll"   About a minute ago   Up About a minute   0.0.0.0:8000->8080/tcp, :::8000->8080/tcp   jovial_shtern
$ docker kill 7c7ad33409e5

docker init ist eine neue Option für Entwickler*innen, die Dockerfiles verwenden möchten.

Ports

Die Portzuordnung ist ein wichtiger Bestandteil der Verwendung von Containern. Ports müssen außerhalb des Containers veröffentlicht werden, damit sie auf externe Webanforderungen reagieren können. ASP.NET Core-Containerimages wurden in .NET 8 geändert, sodass sie standardmäßig am Port 8080 lauschen. .NET 6 und 7 lauschen am Port 80.

Im vorherigen Beispiel mit docker run ist der Hostport 8000 dem Containerport 8080 zugeordnet. Kubernetes funktioniert auf ähnliche Weise.

Die Umgebungsvariablen ASPNETCORE_HTTP_PORTS, ASPNETCORE_HTTPS_PORTS und ASPNETCORE_URLS können verwendet werden, um dieses Verhalten zu konfigurieren.

Benutzer

Ab .NET 8 enthalten alle Images einen Nicht-Stammbenutzer namens app. In der Konfiguration von Chiseled-Images ist diese*r Benutzer*in standardmäßig aktiviert. Das Feature zum Veröffentlichen einer App als .NET-Container (im Abschnitt zum Erstellen von Containerimages gezeigt) konfiguriert auch Images, für die diese*r Benutzer*in standardmäßig aktiviert ist. In allen anderen Szenarien kann der*die app-Benutzer*in manuell festgelegt werden, z. B. mit der USERDockerfile-Anweisung. Wenn ein Image mit app konfiguriert wurde und Befehle als root ausgeführt werden müssen, kann die USER-Anweisung verwendet werden, um den*die Benutzer*in auf root festzulegen.

Auf dem Laufenden bleiben

Neuigkeiten im Zusammenhang mit Containern werden unter dotnet/dotnet-docker discussions und in der .NET Blog-Kategorie „Container“ veröffentlicht.

Azure-Dienste

Verschiedene Azure-Dienste unterstützen Container. Sie erstellen ein Docker-Image für Ihre Anwendung und stellen es für einen der folgenden Dienste bereit:

  • Azure Kubernetes Service (AKS)
    Skalieren und orchestrieren Sie Windows- und Linux-Container mithilfe von Kubernetes.

  • Azure App Service
    Stellen Sie Web-Apps und APIs mithilfe von Containern in einer PaaS-Umgebung bereit.

  • Azure Container Apps
    Führen Sie Ihre Containerworkloads aus, ohne Server, Orchestrierung oder Infrastruktur verwalten zu müssen, und nutzen Sie die native Unterstützung für Dapr und KEDA für Beobachtbarkeit und Skalierung auf 0.

  • Azure Container Instances
    Erstellen Sie einzelne Container in der Cloud ohne Verwaltungsdienste auf höherer Ebene.

  • Azure Batch
    Führen Sie sich wiederholende Computeaufträge mit Containern aus.

  • Azure Service Fabric
    Optimieren, verschieben und modernisieren Sie .NET-Anwendungen in Microservices mithilfe von Windows- und Linux-Containern.

  • Azure Container Registry
    Speichern und Verwalten von Containerimages für alle Arten von Azure-Bereitstellungen

Nächste Schritte