Déploiement vers un conteneur et Docker Hub - Construction d'un exemple d'API en C# Course
Le déploiement d'une application .NET Core dans un conteneur Docker est une compétence cruciale pour les développeurs modernes. Les conteneurs offrent une infrastructure immuable, une distribution facile et des environnements d'exécution légers. Dans ce guide approfondi, nous allons déployer un exemple d'API dans un conteneur Docker, puis le pousser vers Docker Hub, en suivant les étapes démontrées dans le tutoriel vidéo complet de Tim Corey : "Déploiement vers un conteneur et Docker Hub - Construction d'un exemple d'API en C#."
Examinons le processus étape par étape, en faisant référence à des dates spécifiques pour faciliter le suivi. Ce guide comprend l'utilisation de commandes telles que dotnet publish, la commande docker run et des termes tels que base image, runtime image et container image - tous des concepts importants pour le déploiement d'une application .NET à l'aide de Docker.
Créer et comprendre l'exemple d'API
Au début de la vidéo, Tim souligne l'utilité d'un exemple d'application lors de l'apprentissage du développement web. L'application comprend des points de terminaison tels que /courses et /health, simule des problèmes réels tels que des contrôles de santé dégradés, et est conçue pour fonctionner à la fois sur votre machine locale et sur un serveur distant.
Il s'agit d'une app .NET Core (plus précisément une API minimale ASP.NET Core) qui peut être exécutée et testée facilement grâce aux conteneurs Docker.
Installer Docker localement
Tim vérifie que Docker est installé sur sa machine locale, à l'aide de Docker Desktop. Il note qu'il est possible de publier directement sur Docker Hub sans que Docker soit installé localement, mais pour la démonstration, il commence par un déploiement local.
Il montre deux images Docker préinstallées :
-
Un outil personnel pour les sous-titres
- L'image de base ASP.NET Core officielle de Microsoft : mcr.microsoft.com/dotnet/aspnet
Cette image de base pèse environ 328 Mo et sert de fondement à notre image de conteneur. Microsoft héberge ces images sur son MCR (Microsoft Container Registry) et prend en charge les conteneurs Linux et Windows. Pour ce projet, Linux est le système d'exploitation cible.
Publier localement dans un conteneur
Tim se rend dans le dossier du projet API et exécute la commande suivante dans la ligne de commande :
dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer
Cette commande utilise la prise en charge intégrée des conteneurs dans .NET 8 et .NET 9, ce qui supprime la nécessité d'un fichier Docker. Le processus de publication sélectionne une image d'exécution appropriée et construit une image de conteneur autonome.
Voici ce qui se passe sous le capot :
-
Le fichier de projet (.csproj) est utilisé pour construire l'API
-
Les dépendances sont restaurées à l'aide de la commande dotnet restore
-
Le résultat est placé dans un dossier de publication
- Un fichier DLL est produit et intégré dans le conteneur
L'image résultante est d'environ 333 Mo (seulement 5 Mo de plus que la base).
Exécuter l'image avec Docker
Une fois l'image créée, Tim utilise Docker Desktop pour exécuter le conteneur. En interne, l'application écoute sur le port 8080. Tim l'associe à un port hôte aléatoire en saisissant 0 dans la configuration du port.
Le conteneur est lancé avec un nom aléatoire (par exemple, elegant_hoover) et le navigateur s'ouvre pour afficher une API fonctionnelle avec "Hello World" comme réponse par défaut.
En naviguant vers /courses et /health, Tim confirme que l'API fonctionne. Le point d'arrivée du bilan de santé est utile pour simuler un scénario d'environnement de production.
Pour visualiser les conteneurs en cours d'exécution, vous pouvez utiliser la commande docker ps dans le CLI. Tim supprime ensuite le conteneur et l'image en cours d'exécution pour démontrer le nettoyage.
Créer un dépôt Docker Hub
Tim passe ensuite à la partie concernant le déploiement dans le nuage. Il se connecte à son compte Docker Hub et crée un dépôt public nommé thesampleapi.
C'est ici que l'image Docker sera poussée pour que d'autres puissent l'utiliser :
docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest
Configuration du projet pour Docker Hub
Dans le fichier de projet de l'API, Tim ajoute des métadonnées pour définir où et comment publier l'image Docker. Il ajoute le bloc de code suivant :
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
-
ContainerRegistry : Spécifie Docker Hub comme registre cible.
-
ContainerRepository : Le chemin vers le repo de Docker Hub.
- ContainerImageTags : Étiquette l'image pour la version et la dernière version.
Cela prépare l'image à un flux de construction en plusieurs étapes à l'avenir, bien que Tim garde les choses simples pour l'instant.
Publier sur Docker Hub
Tim exécute à nouveau la même commande de publication :
dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer
Dans un premier temps, le push échoue parce qu'il a oublié de sauvegarder le fichier .csproj. Après avoir sauvegardé et réexécuté la commande, l'image est téléchargée avec succès sur Docker Hub.
Dans Docker Hub, les balises latest et 1.0.0 apparaissent sous le repo thesampleapi. Ces balises permettent une certaine flexibilité lors de l'extraction de versions spécifiques.
Tirer l'image de Docker HubLa traduction doit rester professionnelle, en préservant l'exactitude technique tout en expliquant les caractéristiques et les avantages de ces outils de développement
Tim montre comment extraire l'image de n'importe quelle machine sur laquelle Docker est installé :
docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest
Grâce à la mise en cache de la couche Docker, l'image se télécharge rapidement car elle existe déjà en grande partie dans l'image de base.
Pour exécuter l'image :
docker run -p 0:8080 timcorey/thesampleapi:latest
docker run -p 0:8080 timcorey/thesampleapi:latest
Cela permet de faire correspondre un port hôte aléatoire au port interne 8080.
Création d'une nouvelle version de l'image
Pour démontrer le versionnage, Tim modifie le fichier .csproj de la manière suivante :
<ContainerImageTags>1.0.1;latest</ContainerImageTags>
<ContainerImageTags>1.0.1;latest</ContainerImageTags>
Il exécute à nouveau la commande de publication :
dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer
Le dépôt Docker Hub affiche désormais trois balises :
-
1.0.0
-
1.0.1
- dernière version (qui pointe maintenant vers la version 1.0.1)
Tim explique qu'en dépit des étiquettes multiples, Docker ne stocke pas de couches en double, optimisant ainsi l'utilisation du disque grâce à des couches distinctes.
Utilisation de l'image Docker pour le développement local
Tim souligne qu'une fois que l'image est sur Docker Hub, vous pouvez l'exécuter à tout moment sur n'importe quelle machine en utilisant :
docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest
Utilisez ensuite la commande docker run pour le mettre en route. Lorsque vous avez terminé, nettoyez avec :
docker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the image
docker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the image
Il explique que ces outils sont parfaits pour le développement et les tests à la demande, sans encombrer votre machine locale.
Et ensuite ?
Tim conclut en évoquant l'étape suivante : le déploiement de cette même API sur un serveur privé virtuel (VPS). Il expliquera comment cartographier un domaine et configurer le conteneur pour qu'il soit accessible au public.
Conclusion : De la construction locale au déploiement dans le nuage
À l'aide du guide de Tim Corey vidéo, nous avons :
-
Construction d'une API .NET Core à l'aide de dotnet new console
-
Utilisation de dotnet restore et dotnet publish pour construire et déployer
-
Création d'un conteneur Docker sans avoir besoin d'un exemple de fichier Docker
-
Téléchargement de l'image du conteneur sur Docker Hub
-
J'ai extrait et exécuté le conteneur à l'aide de docker run
-
Balises gérées et couches d'images distinctes
- Préparé pour des environnements de production utilisant des images versionnées
Ce flux de travail, centré sur Docker et .NET, est parfait pour créer des applications évolutives, testables et partageables.
