Docker, pour builder, tester sur différentes plateformes, ça a l’air vraiment puissant.
C’était l’un de nos projets de l’année 2019 : commencer à travailler avec Docker.
Etat des lieux avant de commencer
Avant de commencer à mettre les mains dans le cambouis, regardons ce que nous avons sur notre machine :
- docker image ls
Nous voyons que nous avons un packet d’images déjà prêtes sur notre pc !
Un tutorial pour bien démarrer
Suivons le tutorial proposé par docker pour bien comprendre ce qu’est docker.
En résumé :
- Nous devons installer docker sur notre machine (déjà fait pour nous)
- Nous découvrons donc la possibilité de voir toutes les images docker récupérées (avec la commande docker pull)
- Il existe une notion en plus des images, ce sont les containers.
source: docker site
Un test pour découvrir
Docker nous invite à tester docker en lançant le fameux Hello world, et là, c’est lancer un container qui va afficher “Hello from Docker !”
docker run hello-world
Mais, vous allez me dire, nous n’avons pas d’HelloWorld venant de Docker sur notre machine, n’est-ce pas ?
Ce qui est vraiment puissant, c’est que Docker va aller chercher l’image, avant de la lancer en local sur notre machine.
Et c’est là que nous trouvons une première notion très importante : le pull, la récupération des images en local sur notre machine.
Et docker nous donne envie d’en apprendre plus :
Et si nous suivions ce que propose docker ? A savoir lancer un unbuntu sur notre machine, et nous y connecter ?
Ainsi si vous n’avez pas, sur votre machine, l’image souhaitée, Docker va aller le chercher sur le Docker Hub.
Ici, dans la commande que nous avons lancée, le –it va permettre de connecter un terminal au container qui va être créé.
Docker avec Visual Studio 2017 et asp.net core
Dans Visual Studio, lorsque l’on souhaite créer un nouveau projet, nous pouvons décider d’activer le support de Docker.
Cela va créer un projet docker-compose.
De plus, ce projet, dans votre solution, va permettre de paramétrer le container qui sera lancé.
De l’importance du DockerFile
Le DockerFile est l’arbitre qui va lancer toutes les commandes pour préparer votre image.
En résumé, pour cette première présentation de Docker, vous avez trois étapes pour configurer le container que vous allez créé :
- Récupération de l’image pour le runtime, pour l’héritage
En fait, nous allons construire une nouvelle image à partir (FROM) de l’image que l’on a récupérée. - Préparation de la compilation de votre projet
- Déploiement et lancement de la commande dotnet, pour l’exécution du projet
Vous avez donc besoin de deux images de docker :
- une première pour la partie runtime (celle qui permettra d’exécuter votre application)
- une seconde dédiée pour la compilation de votre projet
Le projet docker-compose
Le projet docker compose, dédié pour Visual Studio 2017 est un moyen d’exécuter et de lancer les commandes du docker compose proposées par Docker.
Le plus important ici est l’existence d’un fichier yaml : docker-compose.yml.
C’est un fichier qui permet de :
- lancer plusieurs container en même temps,
- configurer chaque container
- …
C’est très pratique par exemple, lorsqu’on a plusieurs environnements (donc containers) à lancer.
Ici, pour notre application asp.net core, le docker compose va permettre :
- de compiler (build) l’image que nous avons créée, à partir du Dockerfile
- de préciser certaines variables d’environnement dans le container à lancer
- d’ouvrir les ports nécessaires à notre application asp.net core
- de créer des volumes précis dans le futur container (pour nous on en a deux : un pour le pfx pour https, et un pour les accès au usersecrets.json)
En exécutant le projet docker-compose, sous Visual Studio, nous allons lancer le container, et donc lancer l’application asp.net core, dans le container.
Récupération des images en local sur votre machine
Pour récupérer une image avec dotnet configurée, lancer un pull.
https://hub.docker.com/_/microsoft-dotnet-core-runtime/
Attention : Les images docker changent de repository :
Elles passent :
- de : microsoft/dotnet
- à : mcr.microsoft.com/dotnet/core/sdk
Problèmes rencontrés durant la mise en place
Quand on n’a qu’un seul projet asp.net core, et qu’on ne change rien au DockerFile initial, aucun problème.
L’aventure commence quand on veut :
- passer l’image en dotnet core 2.2
- déployer un problème contenant des références à de multiples projets
The specified framework ‘Microsoft.AspNetCore.App’, version ‘2.2.0’ was not found.
Ce problème arrive quand l’image que nous avons récupérée n’a pas le bon runtime dotnet.
Il s’avère que certaines versions d’images docker venant de Microsoft ne sont pas bien paramétrées.
-
- Ainsi, demandez toujours à récupérer la dernière version.
- Et de plus, par exemple pour un projet asp.net core, cherchez à utiliser le runtime dédié pour aspnet core.
Ce qui donne dans le DockerFile :
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
On y a passé du temps à tout configurer de notre côté, et c’est ce runtime, en le forçant à le récupérer de nouveau qui nous a sauvé :
- docker pull microsoft/dotnet 2.2-aspnetcore-runtime
DOCKER_REGISTRY variable is not set.
Plusieurs solutions peuvent vous aider ici :
- Demander à redémarrer Docker, même si vous venez de démarrer votre machine.
Ca arrive qu’il perde pied quand on ajoute une nouvelle image ou l’on crée un nouveau container - Forcer le DNS, dans la configuration de Docker Windows
Et lancer le redémarrage de Docker - Pour certain-e-s, vous devez aussi lancer votre solution Visual Studio en administrateur.
Plusieurs projets csproj à compiler dans l’image Docker
Les exemples que l’on trouve sur Internet pour travailler avec Docker et asp.net core, et Visual Studio 2017 présentent toujours qu’un seul projet.
Or, nous avons l’habitude chez DevToBeCurious d’organiser nos projets (Domain Driven Design, Archi N Tiers, Injection de dépendances, …), en projets dédiés par Responsabilité.
Et donc, on se retrouve avec un projet asp.net core qui référence plusieurs sous projets.
Comment faire alors pour avoir un DockerFile qui prend en compte tous ces projets ?
Le mieux c’est de regénérer, une fois vos projets référencés, votre DockerFile depuis Visual Studio, depuis votre projet (clic droit sur le projet => Ajouter => Prise en charge Docker) :
Il vous créera le bon fichier, tout bien préparé !