Exercice : Créer une image conteneur pour votre microservice .NET

Effectué

Dans cet exercice, vous créez un point de terminaison de microservice et le conteneurisez à l’aide du Kit de développement logiciel (SDK) .NET et Docker.

Remarque

Vous pouvez effectuer cet exercice dans une instance de GitHub Codespaces où Docker et le kit de développement logiciel (SDK) .NET sont préinstallés. Lorsque vous utilisez ces outils et techniques dans votre propre environnement de développement, vérifiez que ces prérequis sont installés.

Ouvrez l’environnement de développement

Vous pouvez choisir d’utiliser un codespace GitHub qui héberge l’exercice ou effectuer l’exercice localement dans Visual Studio Code.

Pour utiliser un codespace, créez un codespace GitHub préconfiguré avec ce lien de création de codespace.

La création et la configuration du codespace par GitHub prend quelques minutes. Quand le processus est terminé, vous voyez les fichiers de code de l’exercice. Le code utilisé pour le reste de ce module se trouve dans le répertoire /dotnet-docker.

Pour utiliser Visual Studio Code, clonez le référentiel https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative sur votre ordinateur local. Ensuite :

  1. Installez les éléments système requis pour exécuter Dev Container dans Visual Studio Code.
  2. Vérifiez que Docker est en cours d’exécution.
  3. Dans une nouvelle fenêtre Visual Studio Code, ouvrez le dossier du référentiel cloné.
  4. Appuyez sur Ctrl+Maj+P pour ouvrir la palette de commandes.
  5. Recherche : >Dev Containers : Regénérer et rouvrir dans un conteneur
  6. Sélectionnez eShopLite : dotnet-docker dans la liste déroulante. Visual Studio Code crée votre conteneur de développement localement.

Utiliser la publication .NET pour créer l’image back-end Produits

La dernière version de .NET 8 améliore la prise en charge de la conteneurisation. Vous pouvez utiliser la commande dotnet publish pour créer une image Docker pour vos microservices. La commande crée une image conteneur sans racine qui exécute des services sous un compte app. L’exécution de conteneurs sans racine est idéale pour la sécurité et les performances. La commande sait comment choisir la meilleure image de base en vérifiant les paramètres dans le fichier projet.

  1. Pour créer les images de tous les services eShopLite, accédez à l’onglet TERMINAL et exécutez cette commande :

    cd ./dotnet-docker 
     dotnet publish /p:PublishProfile=DefaultContainer
    

    Vous pouvez voir un résultat comme les messages suivants :

    DataEntities -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/DataEntities/bin/Release/net8.0/publish/
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/Products.dll
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/publish/
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/Store.dll
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/publish/
    Building image 'store' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Building image 'products' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Pushed image 'store:latest' to local registry via 'docker'.
    Pushed image 'products:latest' to local registry via 'docker'.
    

    La commande lit le fichier solution, détermine qu’il contient trois projets, les génère et créé des images pour le magasin et les projets de produits. Les images sont nommées d’après les projets et publiées dans le registre Docker local.

  2. Vérifiez que les images sont disponibles dans docker :

    docker images
    

    Vous pouvez voir un résultat comme les messages suivants :

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   About a minute ago   293MB
    store                               latest    e9458c3abdb1   About a minute ago   218MB
    

Utiliser un fichier Dockerfile pour créer l’image back-end Produits

Si vous souhaitez plus de contrôle sur la façon dont les images sont générées, vous pouvez utiliser un fichier Dockerfile pour créer une image pour le service web Produits.

  1. Dans le volet EXPLORER, créez un fichier nommé Dockerfile dans ./dotnet-docker/Products. Le fichier est vide.

  2. Entrez le code suivant :

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    
    WORKDIR /DataEntities
    COPY "DataEntities/DataEntities.csproj" .
    RUN dotnet restore
    COPY "DataEntities" .
    RUN dotnet publish -c release -o /app
    

    Après avoir effectué les étapes suivantes, ce code configure la bibliothèque DataEntities dans l’image docker Produits :

    • L’image mcr.microsoft.com/dotnet/sdk:8.0 est extraite puis nommée build.
    • Le répertoire de travail de l’image est défini sur /DataEntities.
    • Copiez le fichier nommé DataEntities.csproj trouvé localement dans le répertoire /DataEntities que vous avez créé.
    • Appelez dotnet restore dans le projet.
    • Copiez tous les éléments du répertoire DataEntities local dans l’image.
    • Appelez dotnet publish dans le projet.
  3. Juste en dessous de la dernière ligne, entrez ce code :

     WORKDIR /src
     COPY Products/Products.csproj .
     RUN dotnet restore
     COPY Products .
     RUN dotnet publish -c release -o /app
    

    Quand il est appelé, ce code effectue les étapes suivantes de manière séquentielle :

    • Le répertoire de travail de l’image est défini sur /src.
    • Copiez le fichier nommé Products.csproj trouvé localement dans le répertoire /src que vous avez créé.
    • Appelez dotnet restore dans le projet.
    • Copiez tous les éléments du répertoire Products local dans l’image.
    • Appelez dotnet publish dans le projet.
  4. Juste en dessous de la dernière ligne, entrez ce code :

     FROM mcr.microsoft.com/dotnet/aspnet:8.0
     WORKDIR /app
     EXPOSE 80
     EXPOSE 443
     COPY --from=build /app .
     ENTRYPOINT ["dotnet", "Products.dll"]
    

    Quand il est appelé, ce code effectue les étapes suivantes de manière séquentielle :

    • L’image mcr.microsoft.com/dotnet/aspnet:8.0 est extraite.
    • Le répertoire de travail de l’image est défini sur /app.
    • Les ports 80 et 443 sont exposés.
    • Copiez tout le contenu du répertoire app de l’image build créée dans le répertoire app de cette image.
    • Définissez le point d’entrée de cette image sur dotnet et passez Products.dll en tant qu’argument.

Créer l’image Docker

Une fois le fichier Dockerfile terminé, l’étape suivante consiste à l’utiliser pour créer une image Docker :

  1. Pour créer l’image du service back-end Produits, accédez à l’onglet TERMINAL et exécutez cette commande :

    cd ./dotnet-docker 
     docker build -t productsbackend:latest -f Products/Dockerfile .
    

    Cela exécute les commandes contenues dans le fichier Dockerfile du répertoire actif et applique la balise productsbackend:latest à l’image obtenue.

  2. L’image est générée après une sortie volumineuse. La saisie docker images vous montre une liste de toutes les images de votre codespace, y compris productsbackend. L’autre image est celle du codespace lui-même.

    Vous pouvez voir un résultat comme les messages suivants :

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   10 minutes ago       293MB
    store                               latest    e9458c3abdb1   10 minutes ago       218MB
    productsbackend                     latest   190783f7e06f    About a minute ago   293MB
    

Réfléchissez à la différence entre l’utilisation de dotnet publish et la création manuelle de Dockerfiles pour chaque micro-service dans vos applications.

Exécuter le conteneur et tester le service

Vous pouvez maintenant utiliser l’image pour exécuter et héberger le service Products.

  1. Pour créer et exécuter un conteneur à partir de la nouvelle image products et exposer le service sur le port 32001, exécutez cette commande :

    docker run -it --rm -p 32001:8080  products
    

    Ou si vous souhaitez exécuter l’image que vous avez créée à l’aide du Dockerfile, exécutez :

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Pour tester le service, basculez vers l’onglet PORTS, puis à droite de l’adresse locale du port Back End, sélectionnez l’icône du globe. Le navigateur ouvre un nouvel onglet à cette adresse.

    Capture d’écran montrant comment se connecter au service de produits backend.

  3. Pour interroger des produits, ajoutez l’adresse avec /api/product, puis appuyez sur Entrée. Vous devriez voir certaines informations du produit répertoriées au format JSON.

    [
        {
            "id": 1,
            "name": "Solar Powered Flashlight",
            "description": "A fantastic product for outdoor enthusiasts",
            "price": 19.99,
            "imageUrl": "product1.png"
        },
        {
            "id": 2,
            "name": "Hiking Poles",
            "description": "Ideal for camping and hiking trips",
            "price": 24.99,
            "imageUrl": "product2.png"
        },
        {
            "id": 3,
            "name": "Outdoor Rain Jacket",
            "description": "This product will keep you warm and dry in all weathers",
            "price": 49.99,
            "imageUrl": "product3.png"
        },
        ...
    ]