« Installe une machine virtuelle Linux et recrée exactement le même environnement. »
Trois mois après mon arrivée dans l’entreprise, l’ambiance au bureau était étrange. Notre seul senior venait d’être officiellement affecté à un autre projet et était tellement occupé à faire ses cartons qu’il n’avait même pas le temps de penser à la transmission. Quant au chef d’équipe, cela faisait longtemps qu’il avait quitté le terrain du développement concret et il était assez éloigné des tendances techniques récentes.
Un jour, le chef d’équipe m’a appelé. « Quand ton senior sera parti, il n’y aura plus que toi pour gérer le serveur. Même si le serveur tombe, tu dois pouvoir le remettre en état tout seul. Installe Linux en machine virtuelle, VM, sur ton portable de développement actuel, Windows, et reconstruis exactement le même environnement que le serveur de production. »
C’est là que ma galère a commencé. J’ai installé VMware, téléchargé l’ISO Ubuntu, et rien que l’installation m’a pris une demi-journée. J’ai fouillé dans le wiki de l’entreprise pour installer Java, Node.js et PostgreSQL. Je me suis dit : « Le plus récent sera forcément mieux », et j’ai installé Java 17, avant de découvrir que le code legacy reposait en fait sur Java 8 et ne compilait même pas. Il a fallu tout supprimer et tout réinstaller. À chaque fois que je modifiais une seule ligne de code, je devais lancer mvn build, déplacer le fichier jar dans la VM puis l’exécuter là-bas. C’était une vraie torture.
Puis une question m’est soudain venue. « Attends une seconde. La dernière fois qu’on a déployé sur le serveur de production, ça ne s’est pas terminé simplement avec une seule commande docker service update ? »
Ma machine virtuelle locale était aussi lourde et demandait une montagne de configuration. Alors qu’est-ce que c’était exactement, ce ‘Docker’ du serveur de production, pour permettre une mise à jour avec une simple ligne de commande ?

La solution lourde : la machine virtuelle
La méthode demandée par mon chef, c’est-à-dire installer Linux au-dessus de Windows, correspond exactement à ce qu’est une machine virtuelle, VM. C’est comme construire une ‘maison virtuelle’, un guest OS, entière au-dessus d’un ordinateur physique, l’hôte.
Au final, une VM isole bien l’environnement, certes, mais pour le développement ou le déploiement, c’était tout simplement trop lourd et trop lent pour être manipulé à chaque fois.
La révolution légère : Docker
C’est ainsi qu’est apparu Docker, autrement dit la technologie des conteneurs. Docker ne construit pas une maison entière comme le fait une VM. À la place, il plante une tente.
La commande update que j’ai lancée sur le serveur de production ne réinstallait pas un système d’exploitation lourd. Elle se contentait de « démonter l’ancienne tente puis d’en remonter une nouvelle contenant la nouvelle version du code ». Il était donc inévitable que cela se termine presque instantanément.

[Code Verification] Docker est-il vraiment si léger ?
Ne nous contentons pas de dire que Docker est léger, vérifions-le réellement. Si l’objectif est d’exécuter un environnement Linux, Ubuntu, alors la différence entre une VM et Docker est flagrante.
# Lancer Ubuntu avec la commande Docker (telechargement automatique si limage manque)
$ docker run -it ubuntu:latest /bin/bash
Résultat :
Dès que j’ai appuyé sur Entrée, j’étais déjà dans un environnement Ubuntu. Si c’est possible, c’est parce qu’un conteneur Docker n’est pas un véritable système d’exploitation. Ce n’est qu’« un espace isolé qui emprunte le noyau du système hôte, mon ordinateur, tout en faisant semblant d’être un OS séparé ».
Conseil pratique : la vraie raison d’utiliser Docker
Depuis que nous avons introduit Docker dans notre travail, ma vie a complètement changé.
En conclusion : on ne livre plus un exécutable, mais un environnement
L’arrivée de Docker a changé le paradigme du développement. Nous n’envoyons plus uniquement le code source, .java, sur le serveur. Nous figeons aussi la configuration de l’OS, les bibliothèques et les variables d’environnement nécessaires au code dans une ‘image’, puis nous envoyons le tout.
Alors, comment cette ‘image Docker’ presque magique est-elle réellement fabriquée ? Est-ce juste un fichier compressé ? De manière surprenante, on dit qu’une image Docker est empilée en plusieurs couches, comme un gâteau.
La prochaine fois, examinons le secret de l’efficacité de Docker : les images et leur structure en couches.