C’est quoi Docker ? 🚢

devops Sep 07, 2022

Hello,

Au programme cette semaine : Docker

Qu’est ce que c’est ? Comment ca marche ? En quoi c’est utile ?

Et on verra un peu de vocabulaire.

C’est parti.

 


Le problème des environnements hétérogènes

 

Imagine la situation suivante :

Tu dév un projet en PHP. Ton environnement à toi est sur WAMP (windows, apache, mysql, php).

Tu commit et push ton code. Un collègue à toi doit aussi continuer le Dev. Il est sous Mac. Il a donc installé MAMP :)

Maintenant vous avez à peu près fini et vous poussez ça sur votre linux hébergé. Votre VPS sera sous LAMP.

Il y a de forte chance, si personne ne fait gaffe, que les versions PHP et Mysql entre les 3 environnements ne sont pas les mêmes.

Il y a aussi des chances que les modules PHP ne sont pas à la même version, ou ne sont pas installés carrément.

Le risque c’est d’avoir du code qui marche pas d’une plateforme à l’autre. Pire, un code qui bug sans que l’on comprenne a priori pourquoi.

Et tu finis par dire la fameuse phrase :

“Mais ca marchait sur ma machine !!! J’comprends pas !”

Le but de Docker, c’est justement de simplifier tout ca : Garantir un environnement qui est exactement le même quelles que soient les plateformes et les gens qui participent au projet. Et sans s’arracher les cheveux !

Comment ca marche ?

 

On peut faire un parallèle avec du code.

Tu définis une Class. Quand tu fais “new Class” tu obtiens un Objet qui vit sa vie, qui est une instance de ta classe. Tu peux faire plusieurs “new Class” et ca te donne autant d’objets qui sont chacun indépendants et peuvent vivre en même temps tous basés sur le même moule (la classe).

Docker, c’est pareil. Tu as des “images”, et chaque instance est un container. Tu peux en créer plusieurs et chacun vit sa vie.

Une image = une classe

Un container = un objet.

Donc, pour t’assurer d’avoir le même environnement partout, tu dois créer une image. Elle sera mise à disposition et utilisée sur chaque plateforme.

Dans une classe, tu définis des méthodes et des propriétés et tu écris tout ça dans un fichier dédié.

Dans Docker, tu dois créer la définition d’une image dans un fichier Dockerfile : quel OS, quelle version de php, quels modules php, le code source de ton app…

Le Dockerfile est une liste d’instructions qui automatise la création de ton environnement. Ca s’appelle le build de l’image à partir du Dockerfile.

Le container, quant à lui, assure l’exécution de ce qui est défini dans l’image sans impacter la plateforme sur laquelle tu es (en effet, Docker n’installe pas de PHP ou quoique ce soit sur ta machine, il utilise ce qui est présent dans l’image, un peu comme un serveur virtuel)

Ca s’apelle run un container à partir d’une image.

Maintenant, tu peux run ton container sur n’importe quel machine/serveur, tu es sur que ca s’exécutera de la même manière.

Tu me suis toujours ?

Petit récap en image :

 

Maintenant quand tu livres en production ton code, tu livres avec ton Dockerfile. Ca permet à n’importe qui de le build pour être sûr de le tester dans les bonnes conditions : sur la machine de dev de ton collègue, sur le serveur de production…

Voilà pour la base sur Docker.

Pour aller plus loin

 
  • Reprenons l’exemple d’une class que tu as dev. Bien souvent tu fais appel à des lib extérieurs pour ne pas réinventer la roue.

    • Avec Docker, c’est pareil. Tu peux imbriquer des images les unes dans les autres

    • Si par exemple tu veux une Debian 11, avec PHP 8.1.2, tu ne vas pas t’amuser à faire un Dockerfile qui fait toutes les installations

    • Dans ton Dockerfile, tu dis d’utiliser l’image Debian 11 mis à disposition sur des dépôts (idem pour PHP)

    • Par contre, dans ton Dockerfile, tu mets qu’il faut aussi ajouter ton code source qui se trouve sur tel repo git par exemple

    • Donc ton Dockerfile devient assez simple si tu utilises des images déjà prêtes

  • Tu peux faire pareil pour ton projet :

    • Au lieu d’uniquement publier ton code, tu peux publier une image docker déjà buildée docker.

    • Ca permet aux gens de ne pas faire d’installation. Ils téléchargent juste l’image et peuvent la run dans un container directement

    • Ca simplifie les choses

  • Tu peux gérer ton dépôt à images comme un dépôt Git public/privé

    • Gestion des versions …

  • Dans la définition de ton image, il y a énormément de paramètres personnalisables

    • Comment sont gérés les espaces de stockages, les ports réseaux, l’utilisation CPU et RAM …

    • Ca mérite une formation complète, je pense

  • Tu peux orchestrer le run de plusieurs images différentes pour lancer une mini infra d’un coup

    • Par exemple : lancer une image Mysql, puis une image PHP

      • En remplacement de ton MAMP, LAMP, WAMP

Conclusion

 

On a effleuré à peine tout ce que Docker peut faire. Le but est ici juste te permettre de mettre le pied dedans, d’avoir les bons termes. Tu peux à partir de là continuer à te former et à monter en compétences (ou juste t’arrêter là, parce que ca ne te sert pas vraiment)

Mais au moins, tu pourras sortir des phrases stylées en soirée :

“Hum, j’ai run mon image buildée sur un docker host en prod ! C’est passé crème”

 

Imrane 🏖

La newsletter pour ne rien louper

Rejoins les 2500 lecteurs de  la newsletter pour obtenir des conseils, des stratégies et des ressources pour développer et monétiser tes compétences Tech.