Nos premiers pas avec Docker avec asp.net core et Visual Studio 2017

decouverte docker visual studio 2017 aspnet core

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

image

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.

image

 

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 :

image

 

Et si nous suivions ce que propose docker ? A savoir lancer un unbuntu sur notre machine, et nous y connecter ?

image

 

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.

image

 

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éé :

  1. 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.
  2. Préparation de la compilation de votre projet
  3. 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 :

  1. de compiler (build) l’image que nous avons créée, à partir du Dockerfile
  2. de préciser certaines variables d’environnement dans le container à lancer
  3. d’ouvrir les ports nécessaires à notre application asp.net core
  4. 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.

image

 

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.

 

    1. Ainsi, demandez toujours à récupérer la dernière version.
    2. 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) :

image

 

Il vous créera le bon fichier, tout bien préparé !

Notre adresse

1 rue du guesclin
44000 Nantes

Notre téléphone

+33 2 79 65 52 87

Société

DevToBeCurious SARL
84860163900018 - Nantes B 848 601 639