Prise en main

Nous avons essayé de prendre en main une solution d’architecture orientée micro-services avec Docker.

Pour cette analyse, nous nous sommes basés sur le repository suivant : https://github.com/dotnet-architecture/eShopOnContainers

Il est très complet et les explications pour l’installer sur votre poste sont suffisamment clair pour que vous puissiez lancer le projet sur vos machines. Assurez-vous d’avoir Docker d’installé et un Visual Studio ou Visual Studio Code.

Cet article relate une expérience en entreprise afin de prendre en main tout cela. Si vous rencontrez des coquilles ou des interrogations, n’hésitez pas à nous en faire part.

Projet eShopOnContainers

Sur ce, revenons-en au sujet principal : le projet eShopOnContainers.

Si vous souhaitez une meilleure compréhension des micro-services, vous avez des livres numériques à disposition dans le lien du Github. Pour les personnes qui ne seraient pas à l’aise avec l’anglais voici un lien en français résumant les points importants : https://docs.microsoft.com/fr-fr/dotnet/architecture/microservices/architect-microservice-container-applications/microservices-architecture.

Le livre a pour but d’expliquer les principes de base des architectures orientées micro-services en utilisant Docker et ses conteneurs. Le projet eShopOnContainers illustre les propos tenu dans le livre.

Les différentes étapes de notre mise en place du projet

Installation de Docker

Version Docker Desktop sur Windows Enterprise (version également valable pour Windows Pro mais pas pour la version Classic)

Pour toutes les personnes qui installent Docker pour la première fois, les étapes se font facilement et sans encombre, il vous faudra créer un compte sur le site officiel de Docker (https://www.docker.com/) afin d’avoir un DockerID.

  • Les problèmes rencontrés

Un problème peut parfois arriver lorsque vous avez une version de Docker ultérieure à cette version 18.06.0-ce-win70 et que vous essayez de la mettre à jour vers la version actuelle Docker Desktop Community 2.2.0.0.

En effet, il y a des résidus de l’ancienne version qui empêche de mettre à jour la version de Docker.

  • La solution

Pour résoudre ce problème de mise à jour de version de Docker, il existe un script PowerShell que vous trouverez ci-dessous :

Il faut enregistrer ce fichier sous format .ps1 et le l’exécuter avec une fenêtre PowerShell en mode administrateur !

$ErrorActionPreference = « SilentlyContinue » kill -force -processname ‘Docker for Windows’, com.docker.db, vpnkit, com.docker.proxy, com.docker.9pdb, moby-diag-dl, dockerd try { ./MobyLinux.ps1 -Destroy } Catch {} $service = Get-WmiObject -Class Win32_Service -Filter « Name=’com.docker.service' » if ($service) { $service.StopService() } if ($service) { $service.Delete() } Start-Sleep -s 5 Remove-Item -Recurse -Force « ~/AppData/Local/Docker » Remove-Item -Recurse -Force « ~/AppData/Roaming/Docker » if (Test-Path « C:\ProgramData\Docker ») { takeown.exe /F « C:\ProgramData\Docker » /R /A /D Y } if (Test-Path « C:\ProgramData\Docker ») { icacls « C:\ProgramData\Docker\ » /T /C /grant Administrators:F } Remove-Item -Recurse -Force « C:\ProgramData\Docker » Remove-Item -Recurse -Force « C:\Program Files\Docker » Remove-Item -Recurse -Force « C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Docker » Remove-Item -Force « C:\Users\Public\Desktop\Docker for Windows.lnk » Get-ChildItem HKLM:\software\microsoft\windows\currentversion\uninstall | % {Get-ItemProperty $_.PSPath} | ? { $_.DisplayName -eq « Docker » } | Remove-Item -Recurse -Force Get-ChildItem HKLM:\software\classes\installer\products | % {Get-ItemProperty $_.pspath} | ? { $_.ProductName -eq « Docker » } | Remove-Item -Recurse -Force Get-Item ‘HKLM:\software\Docker Inc.’ | Remove-Item -Recurse -Force Get-ItemProperty HKCU:\software\microsoft\windows\currentversion\Run -name « Docker for Windows » | Remove-Item -Recurse -Force #Get-ItemProperty HKCU:\software\microsoft\windows\currentversion\UFH\SHC | ForEach-Object {Get-ItemProperty $_.PSPath} | Where-Object { $_.ToString().Contains(« Docker for Windows.exe ») } | Remove-Item -Recurse -Force $_.PSPath #Get-ItemProperty HKCU:\software\microsoft\windows\currentversion\UFH\SHC | Where-Object { $(Get-ItemPropertyValue $_) -Contains « Docker » }

Une fois le script enregistré, pour le lancer il vous suffit de lancer la commande dans le dossier où vous avez enregistrer le script suivante dans votre PowerShell :

.\[nom de fichier].ps1

Que permet-il ? De retirer tous les résidus présent sur votre poste de travail.

Une fois le script terminé, vous pouvez relancer l’installation de Docker Desktop sur votre machine.

Cloner le repository eShopOnContainers

Pour se faire, rendez-vous sur le lien se trouvant plus haut et ouvrir un cmd ou une fenêtre Powershell dans le répertoire souhaité puis exécuter la commande suivante :

git clone https://github.com/dotnet-architecture/eShopOnContainers.git

Configurer votre réseau

Lors de l’étape de configuration de votre réseau, nous vous conseillons (au cas où le script add-firewall-rules-for-sts-auth-thru-docker.ps1 ne fonctionne pas immédiatement au lancement et vous indique une erreur) de vérifier la sécurité de votre PC. Pour pouvoir y accéder, ouvrez votre fenêtre PowerShell en mode administrateur dans le répertoire de votre projet et plus exactement dans :

C:\votre_repertoire\eShopOnContainers\deploy\windows

Et exécutez la commande suivante :

> Get-ExecutionPolicy

Cela va vous indiquer le mode dans lequel vous êtes entre

  • Restricted
  • AllSigned
  • RemoteSigned
  • Unrestricted

Ensuite pour modifier cette restriction, taper et exécuter la commande suivante :

>Set-ExecutionPolicy RemoteSigned

Le mode RemoteSigned permet d’autoriser l’exécution de script locaux. Nous vous conseillons de remettre après avoir lancer le script .ps1 de remettre la protection initiale de votre PC pour éviter toutes erreurs possible par la suite.

Builder le projet

Toujours avec votre fenêtre PowerShell revenir sur src\ et lancer un

docker-compose build

Cette étape prend un peu de temps (entre 10 à 30 minutes selon les pc et la connexion)

Une fois cette étape terminée, lancer la commande

docker-compose up

Elle va vous permettre d’instancier les différents micro-services du projet.

Chaque services dans la solution possédant son propre Dockerfile, le fait de lancer un docker-compose permet d’indiquer qu’on lance l’entièreté du projet afin de lancer l’exécution de tous les micro-services.

Vous pouvez lancer l’adresse suivante : localhost:5107 qui vous permettra de connaitre l’état de vos micro-services (si tout s’est bien passé, tout devrait apparaitre vert et vous pourrez en parallèle ouvrir le site web sous l’adresse localhost:5100 et voir le eShopOnContainers Catalog.

Fichier docker.compose.yml ?

Docker compose est un outil  de gestion de package Docker. Cet outil va lancer vos conteneurs et leurs éventuels liens à partir d’un fichier de configuration écrit en yaml.

Il permet la gestion de plusieurs conteneurs et leurs communication grâce a un fichier docker-compose.yml

Exemple d’un fichier docker.compose.yml

Pour aller plus loin

Hello World – Docker

Ouvrir une fenêtre PowerShell et lancer la commande :

docker run hello-world

Celle-ci va télécharger l’image, la build et la run et vous obtiendrez :

Qu’est-ce qu’un Dockerfile ?

Un Dockerfile est “un fichier texte qui contient des instructions sur la façon de construire une image Docker. C’est comme un script batch” (cf. le livre Containerized Docker Application Lifecycle with Microsoft Platform and tools book).

Le principal avantage de ce fichier est qu’il facilite la reproductibilité de la création des images.

Comme vous pouvez le voir ci-dessus, voici la composition d’un Dockerfile.

Comment ça marche ?

  • FROM : Permet de définir une image de base sur laquelle construire notre image. Par exemple la première ligne de la capture d’écran va récupérer l’image aspnet:3.1-nanoservier-1903 (version 3.1 d’ASP .NET Core) sur lequel va tourner notre container.
  • WORKDIR : Définit le dossier dans lequel l’installation des packages va être fait, il se fait sur le daemon.
  • EXPOSE : Sert à définir le ou les port(s) exposé(s) par notre container.
  • COPY : Copie les fichiers de notre répertoire vers le WORKDIR définit.
  • RUN : Permet de build notre image.
  • ENTRYPOINT : Correspond au point d’entrée pour lancer notre application

Docker Engine (daemon)

Afin d’orchestrer les différents conteneurs. Docker est doté d’un service de type client-serveur qui permet la communication entre l’utilisateur et un service nommé Docker Engine.

Docker Engine est une Api RESTful qui se charge de construire et exécuter les conteneurs. Le Client est un exécutable permettant (via une invite de commande la plupart du temps) d’envoyer des instructions à un daemon faisant tourner Docker Engine.

On notera qu’il est tout à fait possible d’interroger le daemon docker autrement qu’avec le client. (Utilisation de requête Curl par exemple).

Les images Docker

Une image est un ensemble de fichier en lecture seul archivé au format .tar :

  • Version : contenant la version de l’image.
  • Json : contenant un grand nombre de métadonnée (ex : id de l’image, référencement des images utilisées).
  • tar : archive contenant le système de fichier de l’image

Elles sont une représentation statique d’une application ou d’un service, de leurs configurations ou et de leurs dépendances. Un conteneur n’est donc rien d’autres que l’instanciation d’une image Docker.

L’une des forces des images Docker, est qu’elles peuvent être composé d’une ou plusieurs autres images en les référençant. Cela revient à créer une archive englobant tous les fichiers contenus par les images sous-jacent. Elle bénéficie ainsi de l’ensemble du système de fichier de celles-ci lors de son instanciation en conteneurs, évitant ainsi astucieusement les redondances.

Qu’est-ce que ça nous a appris ?

De faire la différence entre une application monolithique et une application orientée micro-services.

Application monolithique

L’application monolithique est simple en terme de conception (beaucoup plus simple à comprendre également)

Il peut convenir au petit projet, mais dès lors que le projet change pour intégrer plus de complexité, il peut s’avérer limité.
pourquoi ?

  • A cause de sa scalabilité -> on s’explique, lorsque vous souhaitez agrandir votre projet à cause d’un goulot d’étranglement, il est tout à fait possible d’agrandir toute l’application. Cependant dans la plupart des cas il n’y a qu’une partie de l’application qui nécessite une mise à l’échelle. Ce qui entraîne un gaspillage des ressources non négligeable.
  • Le déploiement : Dans ce type d’application, lorsqu’une modification est apporté à une partie de l’application c’est l’ensemble qui va être déployé.

Application orientée micro-services

L’application orientée micro-services est complexe en terme de compréhension, mais apporte de nombreux avantages. Chaque services étant indépendant les uns des autres, ils peuvent être réutilisés pour divers projet.

Si demain, on veut récupérer un service de paiement, il est tout à fait possible de le récupérer et de remplacer celui existant par le nouveau (on parle alors d’interopérabilité du service).

  • Il est possible de scaler un service en particulier
  • Grâce à l’isolation permis par Docker, il est possible d’installer un environnement spécifique pour chaque service
  • Facilite grandement le déploiement et la mise à jour des services

Les bases de Docker

Nous avons également pris en main les bases de Docker et vu les principes de conteneur et de conteneurisation.

Article écrit par :

  • Julie LACOGNATA <julie.lacognata@infeeny.com>
  • Pierre KORE <pierre.kore@infeeny.com>
  • Kévin ANSARD <kevin.ansard@infeeny.com>