Maman j'ai raté Docker 😱
Tags: french, beginners, docker, devops
Published: 2022-05-20 18:23:50


Tu as clairement conscience que cette technologie se soit démocratisée embarquant tous le monde de la tech avec elle. 

Malgré cet engouement, la mayonnaise n'a pas pris et tu te poses toujours ces questions existentielles. 

**Pourquoi Docker ? Quel est son intérêt ? En quoi c’est différent de tes superbes machines virtuelles ou de ton environnement de développement ?** 🤔

![Une personne qui se pose des questions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iqfmzm7uakf1gqyv1iqy.gif)

Edine le sage 🤔 disait: 
> 
Se poser des questions c'est bien ! Mais trouver des réponses c'est mieux !"

Donc cher geek junior ou aguerri, je peux comprendre l'attachement que tu portes à ton environnement local ou tes machines virtuelles configurées aux petits oignons. Mais tachons d'être l'une des dernières personnes à te convaincre que c'est vraiment sensationnel. 

## C'est quoi Docker ?
Docker est une technologie qui va te permettre **d’isoler une application et ses dépendances** afin qu’elle puisse **s’exécuter de manière autonome et faciliter son déploiement** dans ce qu'on appelle un **container**.

![Personne qui n'a rien compris à l'explication](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c51v5fqzxraarn9cmkia.gif)

OK j'ai compris, voit donc un container Docker comme une machine virtuelle très légère où tout ce dont ton application a besoin est installé. Chaque mini-machine virtuelle possède sa propre IP, son utilisateur, ses paquets et **son processus**, etc... On parle donc d'isolation. 

😀 Je vois que tu as remarqué que _son processus_ était au singulier, on y viendra un peu plus loin.

![Personne qui enfin compris](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dhhqpa2rha7ri3iqr0yb.gif)

Mais j'ai une mauvaise nouvelle pour toi, le démarrage de cette mini-machine virtuelle ne sera plus une bonne raison de prendre la pause café car elle démarre en quelques secondes contrairement à ta machine virtuelle du futur et ses giga-octets de stockage soit dit en passant.

![Personne qui a besoin d'un café](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v3909oc16pgdjgrx2d7.gif)

## Isolation
Je te disais donc que Docker permettait d'isoler ton application et ses dépendances. Si je te parle de **namespaces**, **chroot** et **cgroups** tu vas encore me regarder de travers. 

![Regard de travers](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68a8flykjuqu1cxne5r3.gif)
Ce sont pourtant ces fonctionnalités natives du noyau Linux qui permettent d'assurer l'isolation des containers. *Oups! Je voulais dire des mini-machines virtuelles*.

C'est à dire que ton conteneur va isoler ton application de son environnement hôte et garantir le fonctionnement malgré les différences. 

Par exemple, ton application containérisée va fonctionner de la même manière sur ta machine et celle de ton voisin sans pour autant avoir les mêmes versions de logiciels _(nginx, apache, php, python, jdk, node, ect...)_ installés sur vos machines respectives.

Et si tu as plusieurs containers sur ta machine, ils ne pourront pas communiquer entre eux à cause de l'isolation, à moins qu'ils partagent un réseau commun.

J'en ai déjà dit assez, tu trouveras de très bonnes ressources sur le sujet des **namespaces**, **chroot** et **cgroups** mais ce qu'il faut que tu retiennes c'est que [tu peux construire ton container à la main](https://www.redhat.com/sysadmin/building-container-namespaces) si tu te sens vraiment pousser des ailes.

![Homme surmotivé](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/np77etzx4dg4udp0xvu3.gif)

Mais reste sur Docker 😀.

## Portabilité
Avec Docker tu vas pouvoir partager un environnement sans avoir à sortir ton disque dur 1To, ni ta super clef USB 64Go et ni d'attendre que ton super administrateur système te donne les droits du disque réseau pour télécharger l'image de la machine virtuelle plus mise à jour depuis 2 ans.

En te disant ça tu comprends qu'un container est facilement portable sur plusieurs machines. 

Pourquoi ? Car il n'embarque pas de système d'exploitation, qui est virtualisé, contrairement à la machine virtuelle qui a son propre système d'exploitation.

Docker définit un format de fichier de configuration, **[Dockerfile](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)**, qui inclus ton application et toutes ses dépendances.

Tu as tout intérêt d'inclure ce fichier de configuration dans ton projet versionné. Bonjour *git*
![Bonjour git](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fdcp4h1he31bpsia74bv.gif)
Pourquoi ? Car ce fichier de configuration pèse quelques Ko et rappelle toi l'intérêt de Docker c'est d'offrir un environnement d'exécution stable à ton application. Cet environnement pourra donc être à jour et partagé sur n'importe quelle machine compatible Docker. Oui il va bien falloir que tu installes Docker à un moment.

## C'est quoi une image Docker ?
Une image Docker est un package, un artefact, un livrable, ect.. que tu [construis](https://docs.docker.com/engine/reference/commandline/build/) à l’aide de ce fameux **Dockerfile**.
Cette image va donc inclure toutes les dépendances dont ton application a besoin pour fonctionner. Bien que celle ci occupe de l’espace de stockage, elle n’utilise aucune ressource système (CPU, mémoire) et ne peut pas être modifié après sa création. Si tu veux faire une modification il faudra [reconstruire](https://docs.docker.com/engine/reference/commandline/build/) ton image Docker.

J'ai une bonne nouvelle cette fois.

![Content de la bonne nouvelle](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2dww3cibm4180vbr36fo.gif)

Il existe une bibliothéque d'images, prêtes à l'emploi, de tes applications préférés qu'on appelle le [docker hub](https://hub.docker.com/search?q=) qui est le registre officiel de Docker.

Tu as besoin d'une base de données MySQL, pas de souci tu peux utiliser [l'image officiel Docker de MySQL](https://hub.docker.com/_/mysql).

Tu éprouves le besoin de partager à des inconnus ta superbe application de _web scrapping_ à travers une image Docker, tu peux le faire en [poussant ton image](https://docs.docker.com/engine/reference/commandline/push/) sur le registre de docker aka _Docker registry_.

On est loin des partages d'images de machines virtuelles.

## C'est quoi un container ?

Un container est une instance d'image. A partir d'une image Docker tu vas pouvoir [créer un container](https://docs.docker.com/engine/reference/run/) c'est à dire un environnement d’exécution afin de faire fonctionner ton application.

En gros c’est la mini-machine virtuelle sans le système d'exploitation et ses dépendances qui sont, je le rappelle, virtualisé.

Si tu as besoin de travailler sur une architecture complexe, il te sera alors possible de lancer des dizaines de containers sans problème et cela en quelques secondes. Pas sur que tu puisses faire de même avec des machines virtuelles à moins d'avoir un ordinateur quantique 🤣. 

IBM promet le sien pour 2025, il faudra patienter un peu moins d'une coupe du monde.

Donc essaie Docker si tu veux changer le destin de ta machine.
![Femme énervée tirant sur son PC](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shpzcd10rfw13dahyt7q.gif)

## Cas d'utilisation
Il existe de nombreux cas d'utilisations de Docker que tu sois dans le développement ou coté système, je vais pas tous les lister mais je vais te décrire un contexte.

### Contexte
Tu es développeur web, tu as besoin de faire tourner tes applications sur ta machine hôte.

**Stack application A**
- PHP 7.4
- Nginx 18
- Node.js 14
- MySQL 5.7
- Redis 5

**Stack application B**
- Python 3.8
- Apache 2.4
- Node.js 16
- Redis 8
- Mongo 3.4

**Stack application C**
- PHP 8.1
- Caddy 2
- MongoDB 4
- Elastic search 8

### Problématique
![Enfant qui crie dans tous les sens](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mb4otkymsdxylk8dbh6n.gif)
Tu pourrais installer chaque dépendance sur ta machine mais accroche toi car il te faudra installer plusieurs outils de versions différentes, bien les configurer pour éviter que tout ce beau monde se marche sur les pieds. 
Donc bonjour la documentation d'installation de 36 pages en version 1.0 depuis 7 mois. 

Pour avoir un confort d'isolation, tu peux passer par de la virtualisation donc chaque application aurait sa propre machine virtuelle. Je doute que tu aies une machine qui puisse faire fonctionner trois machines virtuelles en parallèle de tes 7 instances Google Chrome qui ont 67 onglets chacune.
Donc bonjour les pauses café d'un projet à un autre et les images de machines virtuelles qui trainent sur le réseau ou sur des clés USB, disques, etc... 🙂.

Une prière 🙏🏿 est nécessaire pour que l'image soit à jour sinon c'est la documentation de 36 pages qui t'attend pour installer chacune de tes applications.

![Un homme qui pleure](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6f9cd25cwgarbltl692p.gif)

### Solution
Aujourd'hui tu as quelque chose dans l'idée qui ressemble aux machines virtuelles en terme d'isolation mais qui est beaucoup plus léger et plus rapide à l'exécution et surtout portable. **Il s'agit des containers Docker**

Tu auras donc 5 containers pour ton application A et B et 4 containers pour ton application C. 
![Schéma solution avec containers](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9x46ew5au78lsv2pzdfj.png)
Au total tu auras donc 14 containers et si tu fais tourner certains containers sur des ports différents, ils pourront tous très bien tourner en parallèle sans être obligé de stopper certains containers ou de fermer toutes tes instances Google Chrome. C'est pas une bonne nouvelle ?

![Enfant content](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d7kq45p4yocdmbl58vep.gif)

C'est le moment ou tu me poses la fameuse question.

**Pourquoi ne pas avoir 1 container par application ?**

Tu te souviens avoir remarqué que je parlais plus haut d'un seul processus par container. C'est le moment d'expliquer quelle est la raison.

Docker conseille d'avoir un processus qui tourne par container pour les raisons suivantes: 

- Plus facile de faire évoluer une application en créant plusieurs instances du conteneur. On parle de **scaling**.
- Une construction d'image plus rapide.
- Les dépendances peuvent être mises à jour indépendamment.
- Utilisation d'une même image pour un autre projet.
- Plus facile de collecter les logs car il y a qu'un seul processus qui tourne sur le container
- etc...

## Architecture client-serveur
Nous avons parlé d'image, de container et de registre et s'il était possible de tendre un micro à ces protagonistes, ils auraient eu cette fameuse phrase: 
> Rien de tout cela n'aurait été possible sans le **Docker Engine**.

![Remerciement](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oyr0i3k38aso1zqt9fpy.gif)

Le **Docker engine** c'est le moteur Docker, l'application que tu vas installer sur ta machine afin d'interagir avec tous les objets Docker dont les containers, images, etc. et le registre. Il s'appuie sur une **architecture client-serveur**.

### Client
Une interface de ligne de commande permettant d'exécuter [les commandes Docker](https://docs.docker.com/engine/reference/commandline/docker/)

Il existe un autre [client](https://docs.docker.com/compose/reference/), **Docker Compose**, qui permet de faire tourner une application multi-containers.

### Serveur
Le **Docker daemon** traite les requêtes du client sur tous le cycle de vie d'un objet Docker.

Bien entendu, le serveur Docker peut avoir un emplacement distant c'est tous le principe d'une architecture client-serveur.

L'une des possibilités est de mettre à jour la variable d'environnement `DOCKER_HOST` qui permet au client de se connecter sur un daemon Docker distant. On est sur des notions avancées mais c'est pour que tu comprenne le schéma qui suit.

![Docker architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hbfscwr39olop6pmd3ee.png)

Pour en savoir plus: 
[https://docs.docker.com/get-started/overview/#docker-architecture](Architecture Docker)

## Conclusion
Félicitation, tu as compris la portée de cette révolution et pourquoi tous ce beau monde de la tech l'a intégré dans son quotidien. J'ai été inspiré sur ce coup mais je préfère te dire qu'il n'y aura pas de suite. _Maman j'ai encore raté Docker_ a très peu de chance de voir le jour.

![Kevin tu as encore raté docker](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rmb1ez7exspzng0k0rym.gif)

Que tu veuilles tester un nouveau logiciel, une nouvelle architecture, tester ton nouveau modèle de Machine Learning, faciliter le "onboarding" des nouveaux collaborateurs, l'utiliser pour de l'intégration continu ou déployer tes applications sur de nouveaux environnements, Docker sera la pour t'aider.

La containerisation ne sera pas la solution à tous tes problèmes bien que je trolle les machines virtuelles, elles restent utiles mais c'est pas le sujet de l'article.

![Décollage](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mg06hp5e1df5o6zeuc05.gif)

Je te sens motivé pour passer à l'action, sache qu'il existe de nombreuses ressources sur internet pour apprendre docker mais je te conseille de toujours garder la [documentation officielle](https://docs.docker.com/) sous le coude.

Demande à ton gars sûr qui s'éclate sur Docker depuis des années, il te partagera des liens sympa pour apprendre Docker que ce soit en français ou dans la langue de Shakespeare ou si tu es vraiment chaud en [Hindi](https://youtu.be/Gw2Jrid4SaQ).

Il existe des références que je te partage:

- [en][https://www.docker.com/play-with-docker/](Play with Docker)
- [en][https://katacoda.com/courses/docker](Katacoda Labs for Docker)
- [en][https://container.training/] (Container training)

Je te partage aussi quelques chaines YouTube sympa où tu trouveras, je l'espère, ton bonheur.

- [fr]https://www.youtube.com/c/xavki-linux
- [en]https://www.youtube.com/c/KodeKloud
- [en]https://www.youtube.com/c/TechWorldwithNana