Introduction à .NET et à Docker

Les conteneurs constituent l’une des méthodes les plus populaires de déploiement et d’hébergement d’applications cloud, avec des outils tels que Docker, Kubernetes et Podman. De nombreux développeurs choisissent des conteneurs, car il est simple d’empaqueter une application avec ses dépendances et de l’exécuter de manière fiable sur n’importe quel hôte de conteneur. Il existe une prise en charge étendue de l’utilisation de .NET avec des conteneurs.

Docker fournit une vue d’ensemble des conteneurs. Docker Desktop : Édition communautaire est un bon outil à utiliser pour utiliser des conteneurs sur un ordinateur de bureau pour développeurs.

Images .NET

Les images conteneurs .NET officielles sont publiées dans le Registre des artefacts Microsoft et détectables dans le Docker Hub. Il existe des images de runtime pour la production et des images du kit de développement logiciel (SDK) pour la création de votre code, pour Linux (Alpine, Debian, Ubuntu, Mariner) et Windows. Pour plus d’informations, consultez Images conteneur .NET.

Les images .NET sont régulièrement mises à jour à chaque publication de nouveau correctif .NET ou lorsqu’une image de base du système d’exploitation est mise à jour.

Les images conteneur ciselées sont des images conteneur Ubuntu avec un ensemble minimal de composants requis par le runtime .NET. Ces images sont environ 100 Mo plus petites que les images Ubuntu standard et ont moins de CVE, car disposant de moins de composants. Ils ne contiennent en particulier pas d’interpréteur de commandes ou de gestionnaire de package, ce qui améliore considérablement leur profil de sécurité. Elles comprennent également un utilisateur non racine et sont configurées avec cet utilisateur activé.

Génération d’images conteneur

Vous pouvez créer une image conteneur avec un fichier Dockerfile ou vous appuyer sur le kit de développement logiciel (SDK) .NET pour produire une image. Pour obtenir des exemples sur la génération d’images, consultez dotnet/dotnet-docker et dotnet/sdk-container-builds.

L’exemple suivant illustre la génération et l’exécution d’une image conteneur en quelques étapes rapides (prises en charge avec .NET 8 et .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 est une nouvelle option pour les développeurs souhaitant utiliser des fichiers Dockerfiles.

Ports

Le mappage de ports est une partie clé de l’utilisation de conteneurs. Les ports doivent être publiés en dehors du conteneur pour répondre aux requêtes web externes. Les images conteneur ASP.NET Core ont été modifiées dans .NET 8 pour écouter sur le port 8080 par défaut. .NET 6 et 7 écoutent sur le port 80.

Dans l’exemple précédent avec docker run, le port hôte 8000 est mappé au port 8080 du conteneur. Kubernetes fonctionne de la même façon.

Les variables d’environnement ASPNETCORE_HTTP_PORTS, ASPNETCORE_HTTPS_PORTS et ASPNETCORE_URLS peuvent être utilisées pour configurer ce comportement.

Users

À compter de .NET 8, toutes les images comprennent un utilisateur non racine appelé app. Par défaut, les images ciselées sont configurées avec cet utilisateur activé. L’application de publication, en tant que fonctionnalité de conteneur .NET (illustrée dans la section Création d’images conteneur), configure également des images avec cet utilisateur activé par défaut. Dans tous les autres scénarios, l’utilisateur app peut être défini manuellement, par exemple avec l’instruction USERDockerfile. Si une image a été configurée avec app et que des commandes doivent être exécutées en tant que root, alors l’instruction USER peut être utilisée pour définir l’utilisateur sur root.

Rester informé

Les actualités relatives aux conteneurs sont publiées dans les discussions dotnet/dotnet-docker et dans la catégorie « conteneurs » du blog .NET.

Services Azure

Différents services Azure prennent en charge les conteneurs. Créez une image Docker pour votre application et déployez-la sur l’un des services suivants :

  • Azure Kubernetes Service (AKS)
    Mettez à l’échelle et orchestrez des conteneurs Windows et Linux avec Kubernetes.

  • Azure App Service
    Déployez des API ou des applications web avec des conteneurs dans un environnement PaaS.

  • Azure Container Apps
    Exécutez vos charges de travail de conteneur sans gérer les serveurs, l’orchestration ou l’infrastructure, et tirez parti de la prise en charge native de Dapr et KEDA pour l’observabilité et la mise à l’échelle vers zéro.

  • Azure Container Instances
    Créez des conteneurs individuels dans le cloud sans les services de gestion de niveau supérieur.

  • Azure Batch
    Exécutez des tâches de calcul répétitives avec des conteneurs.

  • Azure Service Fabric
    Effectuez un lift-and-shift et modernisez des applications .NET en microservices avec des conteneurs Windows et Linux.

  • Azure Container Registry
    Stockez et gérez des images conteneurs pour tous types de déploiements Azure.

Étapes suivantes