<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Retrospective on Guillaume Delré</title><link>https://guillaumedelre.github.io/fr/tags/retrospective/</link><description>Recent content in Retrospective on Guillaume Delré</description><generator>Hugo</generator><language>fr-FR</language><lastBuildDate>Mon, 18 Apr 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://guillaumedelre.github.io/fr/tags/retrospective/index.xml" rel="self" type="application/rss+xml"/><item><title>De Vagrant à Docker Compose : une rétrospective</title><link>https://guillaumedelre.github.io/fr/2022/04/18/de-vagrant-%C3%A0-docker-compose-une-r%C3%A9trospective/</link><pubDate>Mon, 18 Apr 2022 00:00:00 +0000</pubDate><guid>https://guillaumedelre.github.io/fr/2022/04/18/de-vagrant-%C3%A0-docker-compose-une-r%C3%A9trospective/</guid><description>Pourquoi on a remplacé Vagrant par Docker Compose : les vrais points de friction, le chemin de migration, et ce qu&amp;#39;on ferait différemment.</description><content:encoded><![CDATA[<p>J&rsquo;ai utilisé Vagrant pendant des années. Un Vagrantfile par projet, une box de base partagée, un script de provision qui marchait le mardi mais pas le jeudi. La promesse était simple : des environnements reproductibles pour tout le monde dans l&rsquo;équipe. La réalité était plus compliquée.</p>
<h2 id="les-années-vagrant">Les années Vagrant</h2>
<p>Le setup avait du sens à l&rsquo;époque. Une VM par projet, provisionnée avec des scripts shell ou Ansible, partagée via un Vagrantfile versionné. L&rsquo;onboarding était théoriquement <code>vagrant up</code> et c&rsquo;est terminé.</p>
<p>En pratique, c&rsquo;était <code>vagrant up</code>, attendre quatre minutes, regarder la provision échouer sur un package qui avait changé son URL de téléchargement, corriger, reprovisionner, attendre à nouveau. Les Vagrantfiles accumulaient de la configuration au fil du temps : des contournements pour des machines spécifiques, du pinning de version d&rsquo;OS, des ajustements mémoire pour le membre de l&rsquo;équipe dont le laptop n&rsquo;avait que 8 Go. Les fichiers devenaient des documents historiques que personne ne voulait toucher.</p>
<p>La VM elle-même était l&rsquo;autre problème. Le boot prenait du temps. Faire tourner la VM consommait de la mémoire et du CPU qui auraient pu aller à l&rsquo;application. La synchronisation des fichiers entre host et guest ajoutait une latence qui faisait paraître les applications PHP plus lentes qu&rsquo;elles n&rsquo;avaient le droit d&rsquo;être. L&rsquo;overhead était significatif pour ce qui était finalement juste &ldquo;faire tourner un serveur web&rdquo;.</p>
<p>On vivait avec parce que tout le monde le faisait. Vagrant était le standard pour le développement PHP local, et l&rsquo;alternative (chaque développeur gérant son propre stack LAMP) était clairement pire.</p>
<h2 id="le-projet-qui-a-changé-le-modèle">Le projet qui a changé le modèle</h2>
<p>Le changement n&rsquo;était pas une décision qu&rsquo;on a prise. C&rsquo;était un projet qui est arrivé déjà conteneurisé.</p>
<p>Un nouveau projet client avait un <code>docker-compose.yml</code> à la racine, un <code>Dockerfile</code>, et un README qui disait <code>docker compose up</code>. On l&rsquo;a lancé. Les conteneurs ont démarré en secondes. PHP-FPM, nginx, PostgreSQL, Redis : tout tournait, tout était en réseau, pas d&rsquo;étape de provision. Arrêter les conteneurs, les redémarrer, même état.</p>
<p>Le contraste avec notre setup Vagrant était immédiat. Pas plus rapide d&rsquo;un pourcentage : plus rapide d&rsquo;un ordre de grandeur différent. Et le fichier Compose était réellement lisible : chaque service, son image, ses volumes, ses variables d&rsquo;environnement, ses dépendances. Comparé à un script de provision qui SSH-ait dans une VM et lançait apt-get, c&rsquo;était lisible.</p>
<p>On a tout migré. Pas progressivement, tout à la fois, sur un sprint. Chaque projet a reçu un <code>docker-compose.yml</code>. Chaque Vagrantfile a été supprimé. La transition a été les trois semaines de travail d&rsquo;infrastructure les plus douloureuses dont je me souvienne, et aussi les plus clairement valables.</p>
<h2 id="ce-que-docker-compose-a-vraiment-changé">Ce que docker-compose a vraiment changé</h2>
<p>Au-delà de la vitesse, Compose a changé le modèle mental. Vagrant abstrayait une machine. Compose abstrayait un ensemble de processus. La distinction compte : avec Compose, on peut arrêter la base de données sans arrêter le serveur d&rsquo;application, scaler un service worker indépendamment, échanger l&rsquo;image PostgreSQL contre une version plus récente sans toucher à quoi que ce soit d&rsquo;autre.</p>
<p>La déclaration <code>services</code> a aussi entièrement remplacé le problème de provision des VMs. Si un nouveau développeur rejoint l&rsquo;équipe, il ne lance pas un script de provision qui peut ou ne pas fonctionner sur sa version d&rsquo;OS. Il lance <code>docker compose up</code> et obtient exactement les mêmes images que tout le monde.</p>
<p>Le CI/CD est devenu plus simple aussi. Le même <code>docker-compose.yml</code> qui tournait en local pouvait tourner dans le pipeline. La parité d&rsquo;environnement que Vagrant promettait mais livrait rarement était réellement réelle avec Compose.</p>
<h2 id="la-dépréciation-silencieuse">La dépréciation silencieuse</h2>
<p>Pendant des années, la commande était <code>docker-compose</code> : un binaire séparé, installé indépendamment de Docker lui-même, écrit en Python, versionné indépendamment. On l&rsquo;utilisait, ça marchait, personne n&rsquo;y pensait vraiment.</p>
<p>À un moment, un collègue a mentionné que Docker avait intégré Compose directement dans le CLI <code>docker</code>. La nouvelle commande était <code>docker compose</code>, sans tiret, réécriture en Go, intégré avec Docker Desktop. L&rsquo;ancien binaire <code>docker-compose</code> était déprécié.</p>
<p>On avait utilisé v1 pendant deux ans après que v2 était sortie. Nos scripts CI, nos Makefiles, notre documentation disaient tous <code>docker-compose</code>. Rien n&rsquo;avait cassé parce que Docker avait maintenu l&rsquo;ancien binaire longtemps. Mais l&rsquo;écosystème avait évolué silencieusement, et on l&rsquo;avait raté.</p>
<p>La migration était triviale : un tiret retiré de chaque script, quelques alias mis à jour. La leçon était moins triviale. Les outils d&rsquo;infrastructure évoluent sans cérémonie. L&rsquo;annonce avait eu lieu, les articles de blog avaient été écrits, les notices de dépréciation étaient là. On ne faisait juste pas attention.</p>
<h2 id="la-vraie-rétrospective">La vraie rétrospective</h2>
<p>En regardant en arrière à travers Vagrant → <code>docker-compose</code> → <code>docker compose</code>, le pattern concerne moins les outils que les defaults.</p>
<p>Vagrant defaultait à &ldquo;ça marche sur ma VM&rdquo;. L&rsquo;overhead de partager cette VM était permanent.</p>
<p>Compose defaultait à &ldquo;ça marche dans ces conteneurs&rdquo;. Les images sont les artefacts ; la machine host est hors sujet.</p>
<p>Le tiret entre <code>docker</code> et <code>compose</code> a toujours été cosmétique. Ce qui comptait, c&rsquo;était le passage des machines provisionnées aux services déclaratifs. Ce passage a eu lieu le jour où on a lancé un projet que quelqu&rsquo;un d&rsquo;autre avait conteneurisé et où on a réalisé qu&rsquo;on ne voulait jamais revenir en arrière.</p>
]]></content:encoded></item></channel></rss>