Publié le 17/08/2022
Par Christophe MOMMER
Avant de commencer ce billet, il convient de définir plusieurs choses :
- On parlera ici de .NET 6+ avec Docker
- Il s'agit de conteneurs Linux (logique avec Ubuntu, mais mieux vaut le préciser)
- Ce n'est pas un tuto sur comment créer un conteneur avec une application .NET
Maintenant que c'est dit, passons au coeur du sujet !
Mon histoire d'amour avec Docker (et Alpine)
Vous n'êtes peut-être pas sans savoir que le premier livre que j'ai écris est Docker pour les développeurs .NET (vous pouvez l'acheter en cliquant sur le lien). J'avoue qu'initialement, ce n'était pas un choix éclairé, mais c'était ma porte d'entrée dans l'univers de l'écriture des livres techniques. J'ai pu approfondir Docker, dont j'avais entendu parlé, durant la rédaction de cet ouvrage. Je me suis rendu compte de la force de l'outil et de sa praticité pour gérer les systèmes en production.
Très vite, j'ai monté un registry (dépôt d'images Docker) afin de pouvoir gérer ma production à base d'image Docker. C'était nickel, mais je me suis vite rendu compte que les images Docker, ça pouvait être gros. Donc j'ai cherché un moyen de réduire cette taille et j'ai découvert Alpine.
Pour ceux qui ne connaissent pas, Alpine est une distro de Linux ultra légère sur laquelle on peut baser nos images avec le runtime ASP.NET. Actuellement, je n'utilise qu'elle, mais ça peut changer ...
Ce qu'il s'est passé
Microsoft a annoncé, par le biais de son blog, le 16/08/2022, plusieurs choses assez intéressantes. Tout d'abord, avec la dernière version d'Ubuntu (22.04), .NET est nativement présent ! Plus besoin de faire des manipulations "compliquées" (je mets compliquées entre guillemets car, si on suit la doc, c'est l'histoire de 3 commandes ...), il suffit de faire :
sudo apt update
sudo apt install dotnet6
Je présume qu'on pourra mettre "dotnet7" ou n'importe quelle version quand elles seront release ...
Déjà ça, c'est un big win à mon humble avis !
Mais ce qui m'intéresse, c'est par rapport à la taille des images ... En effet, j'utilisais Alpine car c'était la version légère. Cependant, les gars de Microsoft ont bossés main dans la main avec ceux de Canonical (ceux qui s'occupent d'Ubuntu) pour créer un nouvelle image à base d'Ubuntu : Chiseled.
Et ça apporte quoi Ubuntu chiseled ?
En fait, il y a plusieurs avantages d'utiliser cette image. On peut les trouver dans le billet original, mais voici la liste :
- L'image est grosso-modo 100 Mo moins lourde qu'une image Ubuntu classique (si on enlève des choses, ça veut dire qu'il y en avait pas besoin !)
- Le package manager a été supprimé (moins de risque de hack). Attention cependant, si vous avez besoin de faire des install de packages, il faudra faire des images intermédiaires ...
- Il n'y a pas de shell (encore moins de risque de hack). D'un autre côté, ça peut aussi être ennuyant si vous souhaitez exécuter des scripts
- Tout s'exécute de base en non-root (et encore moins de risque de hack).
Quand on prend la liste des points, on se rend compte d'une chose : cette image est la dernière de la chaîne a utiliser pour héberger votre app et ne doit pas être utilisée pour une image intermédiaire.
Donc, ça remplace totalement Alpine ?
Non, je ne pense pas. Pour plusieurs raisons, mais la principale c'est qu'Alpine reste plus légère et, paradoxalement, avec plus de fonctionnalités. Ensuite, ne vous jetez pas dessus dans l'immédiat, les images d'Ubuntu chiseled sont encore en preview ! (la preuve, voici le nom de l'image, remarquez le "nightly" : mcr.microsoft.com/dotnet/nightly/aspnet:6.0-jammy-chiseled
Mais surtout, vu les quelques limitations qu'il peut y avoir (pour gagner en sécurité), ça dépendra encore une fois de votre besoin ! Finalement, cette variante n'est réservée qu'au runtime, vous ne la trouverez par le SDK car trop limitative.
Bref, si vous voulez l'info originale et tous les détails, voici la source : .NET 6 is now in Ubuntu 22.04 - .NET Blog (microsoft.com)