[{"data":1,"prerenderedAt":6337},["ShallowReactive",2],{"course-docs-docker":3},[4,235,250,340,463,715,729,2852,3398,4249,4906,5111,5307,5644],{"id":5,"title":6,"badge":7,"body":8,"category":217,"date":218,"description":219,"duration":220,"extension":221,"image":222,"level":223,"meta":224,"navigation":225,"order":226,"path":227,"seo":228,"stem":229,"tags":230,"__hash__":234},"courses\u002Fcourses\u002Fdocker\u002Findex.md","Fondations Docker, Compose et Swarm","Indispensable",{"type":9,"value":10,"toc":202},"minimark",[11,16,25,28,33,64,67,72,76,87,91,121,125,136,140,157,161,180,184,191,195],[12,13,15],"h1",{"id":14},"course-overview-fondations-docker-compose-swarm","Course Overview : Fondations Docker, Compose & Swarm",[17,18,19,20,24],"p",{},"Bienvenue sur la formation complète ",[21,22,23],"strong",{},"Docker & Écosystème",". Ce cours est découpé en plusieurs modules théoriques et surtout très pratiques pour vous accompagner de la découverte de la conteneurisation jusqu'au déploiement d'architectures complexes.",[17,26,27],{},"Fini le fameux \"Pourtant, ça marchait sur ma machine !\" : on va tout packager proprement.",[29,30,32],"h3",{"id":31},"objectifs-de-la-formation","Objectifs de la formation :",[34,35,36,40,43,51,58],"ul",{},[37,38,39],"li",{},"Comprendre les concepts fondamentaux (Images vs Conteneurs, architecture).",[37,41,42],{},"Maîtriser le CLI Docker au quotidien pour débugger et gérer vos environnements.",[37,44,45,46,50],{},"Packager n'importe quelle application (Python, PHP, JS, Go) avec des ",[47,48,49],"code",{},"Dockerfile"," optimisés.",[37,52,53,54,57],{},"Orchestrer des environnements de développement complets avec ",[47,55,56],{},"Docker Compose",".",[37,59,60,61,57],{},"Découvrir l'orchestration taillée pour la production avec ",[47,62,63],{},"Docker Swarm",[65,66],"hr",{},[68,69,71],"h2",{"id":70},"sommaire-du-cours","Sommaire du cours",[29,73,75],{"id":74},"module-1-les-bases-à-savoir-sur-docker","Module 1 - Les bases à savoir sur Docker",[34,77,78,81,84],{},[37,79,80],{},"Qu'est-ce que Docker ?",[37,82,83],{},"À quoi sert Docker ?",[37,85,86],{},"Quelles sont les bases importantes à connaître ?",[29,88,90],{"id":89},"module-2-devenir-familier-avec-le-cli","Module 2 - Devenir familier avec le CLI",[34,92,93,96,99,102,109,112,115,118],{},[37,94,95],{},"Comprendre comment fonctionne le CLI",[37,97,98],{},"Lister les conteneurs (la commande qu'on tape tout le temps)",[37,100,101],{},"Créer notre premier conteneur",[37,103,104,105,108],{},"Rentrer dans la matrice (la commande ",[47,106,107],{},"docker exec",")",[37,110,111],{},"Gérer le bouton On\u002FOff (Start, Stop & Restart)",[37,113,114],{},"Nettoyer un peu notre bazar et libérer de l'espace",[37,116,117],{},"Démystifier les Images vs Conteneurs",[37,119,120],{},"Le Cheat Sheet Ultime : liste exhaustive (ou presque) des commandes",[29,122,124],{"id":123},"module-22-les-bases-techniques-de-docker","Module 2.2 - Les bases techniques de Docker",[34,126,127,133],{},[37,128,129,130,132],{},"Apprendre à créer un ",[47,131,49],{}," : décryptage des instructions",[37,134,135],{},"Push une image sur le cloud (Docker Hub)",[29,137,139],{"id":138},"module-3-créer-un-conteneur-mise-en-pratique","Module 3 - Créer un conteneur : mise en pratique",[141,142,143],"coming-soon",{},[34,144,145,148,151,154],{},[37,146,147],{},"Dockeriser une application en Python",[37,149,150],{},"Dockeriser une application PHP",[37,152,153],{},"Dockeriser une application Javascript (Node\u002FVue\u002FReact...)",[37,155,156],{},"Dockeriser une application en GO",[29,158,160],{"id":159},"module-4-docker-compose-la-théorie","Module 4 - Docker Compose : la théorie",[141,162,163],{},[34,164,165,168,171,177],{},[37,166,167],{},"Qu'est-ce que Docker Compose ?",[37,169,170],{},"Les \"services\" utilisés par Compose (réseaux, volumes, ports...)",[37,172,173,174],{},"Apprendre à créer un fichier ",[47,175,176],{},"docker-compose.yml",[37,178,179],{},"Utiliser une image déjà existante dans un stack",[29,181,183],{"id":182},"module-5-docker-compose-la-mise-en-pratique","Module 5 - Docker Compose : la mise en pratique",[141,185,186],{},[34,187,188],{},[37,189,190],{},"Déployer un environnement de dev complet avec Docker Compose",[29,192,194],{"id":193},"module-6-docker-swarm-la-découverte","Module 6 - Docker Swarm : la découverte",[141,196,197],{},[34,198,199],{},[37,200,201],{},"Introduction au boss final de l'orchestration Docker",{"title":203,"searchDepth":204,"depth":204,"links":205},"",2,[206,208],{"id":31,"depth":207,"text":32},3,{"id":70,"depth":204,"text":71,"children":209},[210,211,212,213,214,215,216],{"id":74,"depth":207,"text":75},{"id":89,"depth":207,"text":90},{"id":123,"depth":207,"text":124},{"id":138,"depth":207,"text":139},{"id":159,"depth":207,"text":160},{"id":182,"depth":207,"text":183},{"id":193,"depth":207,"text":194},"DevOps & Cloud","2026-07-29","Maîtrisez la conteneurisation de vos applications avec Docker, du CLI de base jusqu'à l'orchestration multi-conteneurs pour vos environnements de dev et de prod.","1h 15m","md","\u002Fcourses\u002Fdocker\u002Fdocker_courses.png","Débutant \u002F Intermédiaire",{},true,1,"\u002Fcourses\u002Fdocker",{"title":6,"description":219},"courses\u002Fdocker\u002Findex",[231,232,56,233],"Docker","Containers","DevOps","cQXarp0aC1NYOGl5Rmfrph3IaBXqg-_KyKOf0ypB6w4",{"id":236,"title":237,"badge":238,"body":239,"category":238,"date":238,"description":243,"duration":244,"extension":221,"image":238,"level":238,"meta":245,"navigation":225,"order":226,"path":246,"seo":247,"stem":248,"tags":238,"__hash__":249},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Findex.md","Module 1 : les bases à connaitre pour utiliser Docker",null,{"type":9,"value":240,"toc":241},[],{"title":203,"searchDepth":204,"depth":204,"links":242},[],"Comprendre le fonctionnement de Docker, son écosystème et ses concepts fondamentaux.","15m",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases",{"title":237,"description":243},"courses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Findex","8dWRM_unAOxoaDAs8wxe4DRSsfxAEfRRx9HGSarg-EA",{"id":251,"title":252,"badge":238,"body":253,"category":238,"date":238,"description":243,"duration":334,"extension":221,"image":238,"level":238,"meta":335,"navigation":225,"order":226,"path":336,"seo":337,"stem":338,"tags":238,"__hash__":339},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-1-intro.md","1.1 Introduction à Docker et son écosystème",{"type":9,"value":254,"toc":332},[255,258,261,264,269,275,291,295,301,304,308,314,325],[17,256,257],{},"Docker est avant tout un système de conteneurisation. Il en existe d'autres (comme Containerd ou Podman), dont le but est de créer une image de votre application avec tous ses outils, de manière pragmatique et compacte. L'objectif ? Pouvoir la lancer ensuite sur n’importe quelle machine, sans prise de tête.",[17,259,260],{},"Ça, c'est l'idée de base que tout le monde se fait de Docker. Mais en réalité, le concept va beaucoup plus loin, et c'est ce que nous allons découvrir tout au long de ce cours.",[17,262,263],{},"Pour bien comprendre l'écosystème, il faut voir Docker comme une véritable boîte à outils divisée en trois grands piliers :",[265,266,268],"h4",{"id":267},"_1-le-dockerfile-la-recette-de-cuisine","1. Le Dockerfile : la recette de cuisine",[17,270,271,272,274],{},"Dans un premier temps, Docker permet de conteneuriser une application de manière simple grâce à un fichier nommé ",[47,273,49],{},". En y indiquant une suite d’actions étape par étape, vous allez pouvoir empaqueter vos applications (Python, Java, PHP, Go, Ruby... le choix est infini !).",[276,277,279],"tips",{"title":278},"La particularité de Docker",[17,280,281,282,286,287,290],{},"Contrairement à des alternatives comme Podman qui sont ",[283,284,285],"em",{},"daemonless"," (sans service en tâche de fond), Docker est livré avec un ",[21,288,289],{},"Daemon",". C'est ce moteur principal qui tourne sur votre machine et qui permet d'exécuter et de gérer le cycle de vie de tous vos conteneurs.",[265,292,294],{"id":293},"_2-docker-compose-le-chef-dorchestre-local","2. Docker Compose : le chef d'orchestre local",[17,296,297,298,300],{},"Docker ne vient pas seul, il est accompagné de ",[21,299,56],{}," (souvent illustré par sa fameuse petite pieuvre 🐙). Via un autre fichier de configuration, cet outil permet de lancer plusieurs conteneurs en simultané pour les faire travailler ensemble.",[17,302,303],{},"C'est ici qu'on aborde des configurations un peu plus avancées : la gestion des réseaux internes, la persistance des données avec les volumes, ou encore l'ouverture et le mapping des ports. C'est un outil incroyablement puissant pour le développement local, même s'il demande un petit apprentissage supplémentaire par rapport au Docker standard.",[265,305,307],{"id":306},"_3-docker-swarm-le-boss-final","3. Docker Swarm : le boss final",[17,309,310,311,313],{},"Enfin, il y a le boss final : ",[21,312,63],{},". Un peu moins connu du grand public aujourd'hui, il reste extrêmement puissant lorsqu’il s’agit d'orchestrer des applications en production.",[17,315,316,317,320,321,324],{},"C'est l'évolution logique de Docker Compose, pensée pour la prod. Swarm se base sur le même type de fichier, mais ajoute des configurations supplémentaires pour gérer la répartition des ressources, le ",[283,318,319],{},"scaling"," (la mise à l'échelle automatique selon la charge), ou encore les ",[283,322,323],{},"rolling updates"," (mettre à jour une application sans interruption de service).",[326,327,329],"note",{"title":328},"En résumé",[17,330,331],{},"Docker n'est pas juste un simple outil pour créer des conteneurs. C'est une plateforme complète qui va étoffer votre puissance de frappe au quotidien et vous offrir une énorme polyvalence pour concevoir et déployer vos infrastructures.",{"title":203,"searchDepth":204,"depth":204,"links":333},[],"5m",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-1-intro",{"title":252,"description":243},"courses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-1-intro","qol37EwWJjp1i6oUugeWGN9E6rOuSVmGjKlHuEmf9F0",{"id":341,"title":342,"badge":238,"body":343,"category":238,"date":238,"description":457,"duration":334,"extension":221,"image":238,"level":238,"meta":458,"navigation":225,"order":204,"path":459,"seo":460,"stem":461,"tags":238,"__hash__":462},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-2-a-quoi-sert-docker.md","1.2 A quoi sert Docker ?",{"type":9,"value":344,"toc":455},[345,355,364,368,371,394,398,401,404,417,431,435,441,449],[17,346,347,348,351,352,57],{},"Dans un monde idéal, je répondrais à cette question de manière très pragmatique et sans équivoque : ",[21,349,350],{},"à faciliter la vie des développeurs."," Docker a permis de signer la fin de la fameuse phrase d'un ancien temps qui faisait fureur : ",[283,353,354],{},"\"Pourtant, ça marchait sur ma machine !\"",[17,356,357,358,360,361,363],{},"Mais en réalité, la réponse est un peu plus nuancée. Chaque solution technique vient avec son lot de nouveaux défis. Écrire un ",[47,359,49],{},", c'est facile. Mais écrire un ",[47,362,49],{}," sans faille, sécurisé, léger et rapide à déployer, c'est une tout autre histoire.",[265,365,367],{"id":366},"_1-la-réalité-face-à-lia-et-la-complexité","1. La réalité face à l'IA et la complexité",[17,369,370],{},"Au fil du temps, les applications se sont développées, les frameworks ont gagné en complexité et le nombre de dépendances embarquées est devenu parfois difficilement gérable. Docker permet de résoudre une grande partie de ces problèmes de déploiement, à condition de respecter les bonnes pratiques.",[372,373,375],"warning",{"title":374},"L'IA ne fait pas tout",[17,376,377,378,381,382,385,386,389,390,393],{},"À l'ère de l'intelligence artificielle, il est très tentant de demander à Gemini, Claude ou ChatGPT de dockeriser notre application. Ça dépanne bien, mais l'IA ne fait pas tout. C'est à vous de sécuriser l'image, de choisir les bonnes versions (les ",[283,379,380],{},"tags","), d'appliquer les mises à jour et surtout d'éviter de copier des fichiers sensibles ou ultra-lourds (coucou les dossiers ",[47,383,384],{},"node_modules"," ou ",[47,387,388],{},"vendor"," qui doivent rester à la porte grâce au ",[47,391,392],{},".dockerignore",").",[265,395,397],{"id":396},"_2-le-défi-des-architectures-arm-vs-x86","2. Le défi des architectures (ARM vs x86)",[17,399,400],{},"On dit souvent que Docker sert à packager son application de manière simple pour la déployer sur n'importe quelle machine. C'est vrai, mais c'est un petit raccourci.",[17,402,403],{},"Aujourd’hui, il existe plusieurs architectures matérielles (x86, ARM64, AMD64...). Et de manière très factuelle, vous ne pouvez pas prendre un conteneur compilé basiquement sur un Mac M1\u002FM2\u002FM3 (qui tourne sous architecture ARM64) et espérer qu'il tourne magiquement sur un serveur distant classique (souvent en AMD64).",[326,405,407],{"title":406},"Pourquoi ?",[17,408,409,410,413,414,57],{},"Parce que Docker n'est pas un système de machine virtuelle (VM) complet. C'est un outil de conteneurisation qui ",[21,411,412],{},"partage le noyau (kernel) du système hôte"," (sur Linux nativement, ou via une VM allégée cachée sur Mac et Windows). La compilation des images est donc intrinsèquement liée au système sur lequel vous lancez le ",[283,415,416],{},"build",[276,418,420],{"title":419},"La solution ?",[17,421,422,423,426,427,430],{},"Il existe un outil magique intégré nommé ",[47,424,425],{},"buildx",". Il permet de créer des ",[283,428,429],{},"builds cross-platform"," et de faire sauter cette barrière matérielle. Grâce à lui, un développeur sur macOS peut compiler de manière transparente une image destinée à un serveur Linux ou Windows.",[265,432,434],{"id":433},"_3-au-delà-de-lapplication-lécosystème-complet","3. Au-delà de l'application : l'écosystème complet",[17,436,437,438,440],{},"Docker ne se cantonne pas uniquement à faire tourner votre code. Il permet aux développeurs de lancer tout l’écosystème qui entoure leurs applications (les bases de données, les services de cache, d’autres microservices...) grâce à ",[21,439,56],{},". Cet outil va lancer plusieurs conteneurs en simultané et les faire communiquer entre eux dans un réseau privé, selon une configuration que vous avez établie.",[17,442,443,444,446,447,393],{},"Et comme on l'a vu plus haut, en production, ",[21,445,63],{}," prend le relais. Il brille par sa simplicité de mise en place et reprend la logique des fichiers Docker Compose. Il va plus loin en gérant l'orchestration : autoscaling, haute disponibilité, et mise à jour de vos conteneurs sans interruption de service (",[283,448,323],{},[326,450,452],{"title":451},"Pour conclure",[17,453,454],{},"Docker est un outil de conteneurisation incontournable pour le développement, mais c'est aussi une plateforme robuste qui sert en production à manager une multitude d’applications de manière sécurisée, isolée et propre.",{"title":203,"searchDepth":204,"depth":204,"links":456},[],"Docker permet de résoudre une grande partie des problèmes de déploiement, à condition de respecter les bonnes pratiques.",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-2-a-quoi-sert-docker",{"title":342,"description":457},"courses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-2-a-quoi-sert-docker","nvP4nkZgZy3ah2WUU129mp7MkX79YbKNKaWj3mCB0oM",{"id":464,"title":465,"badge":238,"body":466,"category":238,"date":238,"description":709,"duration":334,"extension":221,"image":238,"level":238,"meta":710,"navigation":225,"order":207,"path":711,"seo":712,"stem":713,"tags":238,"__hash__":714},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-3-les-bases-a-savoir.md","1.3 Les bases à savoir",{"type":9,"value":467,"toc":707},[468,471,477,481,484,569,573,576,596,600,603,609,612,626,632,636,639,653,694,704],[17,469,470],{},"Pour utiliser Docker correctement, il faut d'abord maîtriser quelques principes fondamentaux. Ça vous permettra d'aborder l'outil beaucoup plus sereinement et d'éviter pas mal de situations absurdes (même si on fait tous des erreurs au début, bien sûr !).",[17,472,473,474],{},"De manière générale, avant de toucher à Docker, ",[21,475,476],{},"il faut des bases sur Linux.",[265,478,480],{"id":479},"_1-savoir-utiliser-un-terminal","1. Savoir utiliser un terminal",[17,482,483],{},"En premier lieu, il faut être à l'aise avec la ligne de commande et connaître les utilitaires de base :",[34,485,486,496,505,511,520,529,538,544,553,559],{},[37,487,488,491,492,495],{},[47,489,490],{},"cd"," (",[283,493,494],{},"change directory",") : permet de changer de répertoire.",[37,497,498,491,501,504],{},[47,499,500],{},"ls",[283,502,503],{},"list",") : permet de voir ce qui se trouve dans le répertoire courant.",[37,506,507,510],{},[47,508,509],{},"touch"," : permet de créer un fichier vide.",[37,512,513,491,516,519],{},[47,514,515],{},"cp",[283,517,518],{},"copy",") : permet de copier un fichier ou un dossier.",[37,521,522,491,525,528],{},[47,523,524],{},"mv",[283,526,527],{},"move",") : permet de déplacer ou de renommer une ressource.",[37,530,531,491,534,537],{},[47,532,533],{},"mkdir",[283,535,536],{},"make directory",") : permet de créer un dossier.",[37,539,540,543],{},[47,541,542],{},"cat"," : permet d'afficher le contenu complet d'un fichier.",[37,545,546,385,549,552],{},[47,547,548],{},"less",[47,550,551],{},"more"," : permet de lire un fichier page par page (parfait pour les gros fichiers de logs).",[37,554,555,558],{},[47,556,557],{},"grep"," : permet de chercher un mot ou une phrase spécifique dans un fichier.",[37,560,561,564,565,568],{},[47,562,563],{},"sed"," \u002F ",[47,566,567],{},"awk"," : des outils puissants pour manipuler et remplacer des éléments dans un fichier texte.",[265,570,572],{"id":571},"_2-comprendre-larchitecture-linux","2. Comprendre l'architecture Linux",[17,574,575],{},"Dans un monde idéal, il faudrait également comprendre un peu l'arborescence de Linux. Savoir à quoi servent certains répertoires clés vous sauvera la mise (liste non exhaustive) :",[34,577,578,584,590],{},[37,579,580,583],{},[47,581,582],{},"\u002Fetc"," : contient les fichiers de configuration du système et des applications.",[37,585,586,589],{},[47,587,588],{},"\u002Fbin"," : contient les exécutables binaires de base utilisables dans le terminal.",[37,591,592,595],{},[47,593,594],{},"\u002Ftmp"," : sert à stocker les fichiers et dossiers temporaires (il est vidé au redémarrage).",[265,597,599],{"id":598},"_3-avoir-un-vernis-en-développement","3. Avoir un vernis en développement",[17,601,602],{},"Enfin, avoir des notions de développement est un énorme plus pour bien \"packager\" vos applications. Certaines formations prennent d'ailleurs quelques semaines pour expliquer les bases du dev avant de passer à la pratique de l'infrastructure, et c'est une excellente approche.",[17,604,605,606],{},"Parce que soyons honnêtes : packager une application Java sans avoir jamais fait de Java... bon courage ! Même si l'IA peut faire le gros du travail aujourd'hui, restons pragmatiques : ",[21,607,608],{},"on veut comprendre ce que l'on fait et ce que l'on livre.",[17,610,611],{},"N'hésitez pas à vous intéresser aux différents langages et à leurs spécificités. Packager du PHP ou du Go, ça n'a rien à voir :",[34,613,614,620],{},[37,615,616,619],{},[21,617,618],{},"PHP"," a besoin d'un serveur web (comme Nginx) associé à un moteur comme PHP-FPM, ou d'un serveur moderne comme FrankenPHP.",[37,621,622,625],{},[21,623,624],{},"Go",", en revanche, est un langage compilé. L'application génère son propre binaire autonome qui embarque directement son serveur.",[276,627,629],{"title":628},"Le conseil",[17,630,631],{},"Faites un petit tour d'horizon des langages et des frameworks actuels pour comprendre les enjeux et les besoins de chacun en matière de configuration.",[265,633,635],{"id":634},"_4-avoir-quelques-notions-basiques-de-réseau","4. Avoir quelques notions basiques de réseau",[17,637,638],{},"Il n'y a pas besoin d'être un ingénieur réseau chevronné, mais Docker manipule énormément cet aspect pour faire communiquer vos applications. Deux concepts vont revenir en boucle et doivent être bien clairs :",[34,640,641,647],{},[37,642,643,646],{},[21,644,645],{},"Localhost (ou 127.0.0.1) :"," En gros, c'est \"chez vous\". C'est l'adresse de bouclage de votre propre machine. Quand vous tapez ça dans un navigateur, vous dites simplement à votre ordi de se parler à lui-même.",[37,648,649,652],{},[21,650,651],{},"Les ports :"," Imaginez que votre ordinateur (ou votre serveur) est un grand immeuble. L'adresse IP, c'est l'adresse du bâtiment dans la rue. Les ports, ce sont les numéros d'appartement ou les portes d'entrée. Par exemple, un serveur web classique écoute par défaut à la porte 80 (pour le HTTP) ou 443 (pour le HTTPS).",[326,654,656],{"title":655},"Ports courants",[34,657,658,664,670,676,682,688],{},[37,659,660,663],{},[21,661,662],{},"20 \u002F 21"," -> FTP (transfère de fichier)",[37,665,666,669],{},[21,667,668],{},"22"," -> SSH (connexion priver)",[37,671,672,675],{},[21,673,674],{},"25"," -> SMTP (email)",[37,677,678,681],{},[21,679,680],{},"53"," -> DNS (Traduction de nom de domaine)",[37,683,684,687],{},[21,685,686],{},"3306"," -> MYSQL",[37,689,690,693],{},[21,691,692],{},"5432"," -> PostgresSQL",[326,695,697],{"title":696},"Pourquoi c'est crucial avec Docker ?",[17,698,699,700,703],{},"Parce que chaque conteneur vit dans sa propre petite bulle isolée. Si votre super API en Go ou votre site Laravel tourne sur le port 8080 ",[283,701,702],{},"à l'intérieur"," de son conteneur, il va falloir expliquer à Docker comment relier ce \"numéro d'appartement\" à une vraie porte de votre machine physique pour que vous puissiez y accéder depuis votre navigateur.",[17,705,706],{},"Avec ces quelques cordes à votre arc, vous avez déjà tout ce qu'il faut pour commencer Docker de manière propre et sereine !",{"title":203,"searchDepth":204,"depth":204,"links":708},[],"Pour utiliser Docker correctement, il faut d'abord maîtriser quelques principes fondamentaux.",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-3-les-bases-a-savoir",{"title":465,"description":709},"courses\u002Fdocker\u002Fmodules\u002Fmodule-1-les-bases\u002Flesson-3-les-bases-a-savoir","1stC_UW5Ee3OwcuDI1j_UCWMhSnRYKpoRLTDOo-Xtyg",{"id":716,"title":717,"badge":238,"body":718,"category":238,"date":238,"description":722,"duration":723,"extension":221,"image":238,"level":238,"meta":724,"navigation":225,"order":204,"path":725,"seo":726,"stem":727,"tags":238,"__hash__":728},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Findex.md","Module 2 : Devenir familier avec le CLI de Docker",{"type":9,"value":719,"toc":720},[],{"title":203,"searchDepth":204,"depth":204,"links":721},[],"Maîtriser les commandes essentielles du CLI Docker et comprendre son écosystème.","1h 02m",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli",{"title":717,"description":722},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Findex","ARK2dNP9cM-dVE2JZ-kvHfPaeGi3NPeFEpVL4OezuH8",{"id":730,"title":731,"badge":238,"body":732,"category":238,"date":238,"description":2845,"duration":2846,"extension":221,"image":238,"level":238,"meta":2847,"navigation":225,"order":226,"path":2848,"seo":2849,"stem":2850,"tags":238,"__hash__":2851},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-1-intro-cli.md","2.1 Introduction au CLI de Docker",{"type":9,"value":733,"toc":2840},[734,744,747,783,791,795,802,805,848,851,858,861,868,872,879,899,921,936,939,1044,1054,1058,1068,1071,2823,2836],[17,735,736,737,491,740,743],{},"Avant toute chose, il faut commencer, selon moi, par la base des bases : le ",[21,738,739],{},"CLI",[283,741,742],{},"Command Line Interface",", ou interface en ligne de commande en bon français). Il va devenir votre meilleur ami tout au long de votre aventure avec Docker, et croyez-moi, vous allez l'utiliser de manière très active !",[17,745,746],{},"Voici une liste non exhaustive de ce que le CLI va vous permettre de faire au quotidien :",[34,748,749,755,761,767,773],{},[37,750,751,754],{},[21,752,753],{},"Lister les conteneurs"," (ceux qui sont en cours d'exécution comme ceux qui sont arrêtés).",[37,756,757,760],{},[21,758,759],{},"Consulter les logs"," de vos conteneurs pour comprendre ce qu'il s'y passe (et surtout débugger quand ça plante).",[37,762,763,766],{},[21,764,765],{},"Gérer le cycle de vie :"," créer, démarrer, mettre en pause et supprimer des conteneurs en un clin d'œil.",[37,768,769,772],{},[21,770,771],{},"Configurer à la volée :"," ajouter des options spécifiques à vos conteneurs lors du lancement (ouvrir des ports, attacher des volumes, injecter des variables d'environnement).",[37,774,775,778,779,782],{},[21,776,777],{},"Partager votre travail :"," pousser (",[283,780,781],{},"push",") vos images fraîchement créées vers un registre cloud (comme le Docker Hub).",[17,784,785,786,788,789,57],{},"Et ce n'est que la pointe de l'iceberg ! Le CLI permet de faire bien plus encore, et ça deviendra d'autant plus vrai quand on passera à la vitesse supérieure avec ",[21,787,56],{}," et ",[21,790,63],{},[29,792,794],{"id":793},"démarrer-le-daemon-docker","Démarrer le daemon Docker",[17,796,797,798,801],{},"Avant de pouvoir taper vos premières commandes et interagir avec Docker, il faut d'abord s'assurer que le moteur (le fameux ",[21,799,800],{},"daemon"," dont on a parlé plus tôt) tourne bien en arrière-plan.",[17,803,804],{},"La façon de l'allumer dépend de votre système d'exploitation :",[34,806,807,831],{},[37,808,809,812,813,822],{},[21,810,811],{},"Sur Linux :"," C'est le plus direct, vous lancez le service directement depuis votre terminal avec cette commande :\nBash\n",[814,815,820],"pre",{"className":816,"code":818,"language":819},[817],"language-text","sudo systemctl start docker\n","text",[47,821,818],{"__ignoreMap":203},[276,823,825],{"title":824},"Petite astuce",[17,826,827,828,57],{},"Si vous voulez qu'il se lance tout seul au démarrage de votre machine, vous pouvez utiliser ",[47,829,830],{},"sudo systemctl enable docker",[37,832,833,836,837,840,841],{},[21,834,835],{},"Sur Mac (et Windows) :"," Comme on l'a vu, l'architecture est un peu différente sous le capot. Vous n'avez pas de commande système directe pour lancer le daemon. La méthode standard est tout simplement d'ouvrir l'application ",[21,838,839],{},"Docker Desktop",". En se lançant, elle va démarrer sa machine virtuelle et allumer le daemon toute seule comme une grande. ",[283,842,843,844,847],{},"(Si vous êtes un pro du clavier sur Mac, taper ",[47,845,846],{},"open -a Docker"," dans le terminal ouvrira l'application pour vous).",[17,849,850],{},"Voici à quoi ressemble l'outil une fois lancé :",[17,852,853],{},[854,855],"img",{"alt":856,"src":857},"Aperçu de Docker Desktop","\u002Fcourses\u002Fdocker\u002Fdocker_desktop.png",[17,859,860],{},"De manière générale, vous ferez face à cette interface. Elle est plutôt agréable visuellement pour garder un œil sur ce qui tourne, surveiller la consommation de ressources ou purger le système.",[17,862,863,864,867],{},"Mais ne vous y trompez pas : ",[21,865,866],{},"vous aurez tout de même besoin de votre terminal (le fameux CLI) pour la très grande majorité des tâches essentielles."," Le vrai pouvoir de Docker réside dans la ligne de commande !",[29,869,871],{"id":870},"comment-interagir-avec-docker","Comment interagir avec Docker ?",[17,873,874,875,878],{},"Une fois le daemon Docker installé et lancé, pour interagir avec lui, vous n'aurez besoin que d'une simple commande : ",[47,876,877],{},"docker",". Ce mot-clé permet à votre système de comprendre que vous voulez utiliser l'outil.",[17,880,881,884,885,888,889,891,892,895,896,393],{},[21,882,883],{},"Mais comment ça marche, Jamy ?"," C'est très simple ! Sur Linux, par exemple, vous avez un fichier exécutable (généralement situé dans un dossier comme ",[47,886,887],{},"\u002Fusr\u002Fbin\u002F",") qui s'appelle ",[47,890,877],{},". Ce petit fichier contient tout le code nécessaire pour aller discuter avec le \"cerveau\" de Docker en arrière-plan (ce qu'on appelle le ",[283,893,894],{},"socket",", ou ",[47,897,898],{},"docker.sock",[326,900,902,908],{"title":901},"La petite subtilité sur macOS",[17,903,904,905],{},"Sur Mac, tout est verrouillé à la racine pour des questions de protection système. Le vrai binaire Docker se cache donc en réalité bien au chaud dans : ",[47,906,907],{},"~\u002FApplications\u002FDocker.app\u002FContents\u002FResources\u002Fbin\u002Fdocker",[17,909,910,911,914,915,917,918,920],{},"Pour que vous n'ayez pas à taper ce chemin à rallonge à chaque fois, votre terminal (ZSH par défaut sur les Mac récents) utilise une liste de dossiers autorisés appelée ",[47,912,913],{},"$PATH",". Quand vous tapez ",[47,916,877],{},", le terminal fouille dans le ",[47,919,913],{}," et trouve un raccourci qui pointe vers le vrai fichier caché.",[17,922,923,924,927,928,931,932,935],{},"Si vous êtes curieux ou si vous avez installé Docker via ",[21,925,926],{},"Homebrew",", vous pouvez jouer les détectives. Tapez simplement la commande ",[47,929,930],{},"which docker"," pour savoir où se trouve le raccourci, ou ",[47,933,934],{},"ls -l $(which docker)"," pour voir la cible exacte du binaire que vous utilisez.",[17,937,938],{},"Voici ce que ça donne en console :",[814,940,944],{"className":941,"code":942,"language":943,"meta":203,"style":203},"language-bash shiki shiki-themes material-theme-lighter github-light monokai","➜  ~ which docker\n\u002Fopt\u002Fhomebrew\u002Fbin\u002Fdocker\n\n➜  ~ ls -l $(which docker)\nlrwxr-xr-x  1 admin  admin  34 Mar 23  2025 \u002Fopt\u002Fhomebrew\u002Fbin\u002Fdocker -> ..\u002FCellar\u002Fdocker\u002F28.0.2\u002Fbin\u002Fdocker\n","bash",[47,945,946,964,969,974,1002],{"__ignoreMap":203},[947,948,950,954,958,961],"span",{"class":949,"line":226},"line",[947,951,953],{"class":952},"ssU3Q","➜",[947,955,957],{"class":956},"sqNgn","  ~",[947,959,960],{"class":956}," which",[947,962,963],{"class":956}," docker\n",[947,965,966],{"class":949,"line":204},[947,967,968],{"class":952},"\u002Fopt\u002Fhomebrew\u002Fbin\u002Fdocker\n",[947,970,971],{"class":949,"line":207},[947,972,973],{"emptyLinePlaceholder":225},"\n",[947,975,977,979,981,984,988,992,996,999],{"class":949,"line":976},4,[947,978,953],{"class":952},[947,980,957],{"class":956},[947,982,983],{"class":956}," ls",[947,985,987],{"class":986},"sZ_HY"," -l",[947,989,991],{"class":990},"sWZ6u"," $(",[947,993,995],{"class":994},"sOhXc","which",[947,997,998],{"class":956}," docker",[947,1000,1001],{"class":990},")\n",[947,1003,1005,1008,1012,1015,1018,1021,1024,1027,1030,1033,1037,1041],{"class":949,"line":1004},5,[947,1006,1007],{"class":952},"lrwxr-xr-x",[947,1009,1011],{"class":1010},"sYBsF","  1",[947,1013,1014],{"class":956}," admin",[947,1016,1017],{"class":956},"  admin",[947,1019,1020],{"class":1010},"  34",[947,1022,1023],{"class":956}," Mar",[947,1025,1026],{"class":1010}," 23",[947,1028,1029],{"class":1010},"  2025",[947,1031,1032],{"class":956}," \u002Fopt\u002Fhomebrew\u002Fbin\u002Fdocker",[947,1034,1036],{"class":1035},"s_bef"," -",[947,1038,1040],{"class":1039},"sBHfy",">",[947,1042,1043],{"class":956}," ..\u002FCellar\u002Fdocker\u002F28.0.2\u002Fbin\u002Fdocker\n",[276,1045,1047],{"title":1046},"Ce qu'il faut retenir",[17,1048,1049,1050,1053],{},"La petite flèche ",[47,1051,1052],{},"->"," vous montre bien que la commande que vous tapez n'est qu'un \"raccourci\" (un lien symbolique) qui redirige vers le véritable fichier installé par Homebrew !",[29,1055,1057],{"id":1056},"explorer-les-commandes-docker","Explorer les commandes Docker",[17,1059,1060,1061,1063,1064,1067],{},"Bon, maintenant qu'on est connectés au daemon, il faut savoir qu'il existe une myriade de commandes pour manipuler Docker. Pour les découvrir, rien de plus simple, il vous suffit de taper ",[47,1062,877],{}," (ou ",[47,1065,1066],{},"docker --help",") dans votre terminal.",[17,1069,1070],{},"Vous allez tomber sur une liste assez longue et impressionnante avec toutes les explications associées :",[814,1072,1074],{"className":941,"code":1073,"language":943,"meta":203,"style":203},"docker --help\n\nUsage:  docker [OPTIONS] COMMAND\n\n\n\nA self-sufficient runtime for containers\n\n\n\nCommon Commands:\n\n  run         Create and run a new container from an image\n\n  exec        Execute a command in a running container\n\n  ps          List containers\n\n  build       Build an image from a Dockerfile\n\n  pull        Download an image from a registry\n\n  push        Upload an image to a registry\n\n  images      List images\n\n  login       Authenticate to a registry\n\n  logout      Log out from a registry\n\n  search      Search Docker Hub for images\n\n  version     Show the Docker version information\n\n  info        Display system-wide information\n\n\n\nManagement Commands:\n\n  agent*      Docker AI Agent Runner\n\n  ai*         Docker AI Agent - Ask Gordon\n\n  builder     Manage builds\n\n  buildx*     Docker Buildx\n\n  compose*    Docker Compose\n\n  container   Manage containers\n\n  context     Manage contexts\n\n  debug*      Get a shell into any image or container\n\n  desktop*    Docker Desktop commands\n\n  dhi*        CLI for managing Docker Hardened Images\n\n  extension*  Manages Docker extensions\n\n  image       Manage images\n\n  init*       Creates Docker-related starter files for your project\n\n  manifest    Manage Docker image manifests and manifest lists\n\n  mcp*        Docker MCP Plugin\n\n  model*      Docker Model Runner\n\n  network     Manage networks\n\n  offload*    Docker Offload\n\n  pass*       Docker Pass Secrets Manager Plugin (beta)\n\n  plugin      Manage plugins\n\n  sandbox*    Docker Sandbox\n\n  sbom*       View the packaged-based Software Bill Of Materials (SBOM) for an image\n\n  scout*      Docker Scout\n\n  system      Manage Docker\n\n  trust       Manage trust on Docker images\n\n  volume      Manage volumes\n\n\n\nSwarm Commands:\n\n  swarm       Manage Swarm\n\n\n\nCommands:\n\n  attach      Attach local standard input, output, and error streams to a running container\n\n  commit      Create a new image from a container's changes\n\n  cp          Copy files\u002Ffolders between a container and the local filesystem\n\n  create      Create a new container\n\n  diff        Inspect changes to files or directories on a container's filesystem\n\n  events      Get real time events from the server\n\n  export      Export a container's filesystem as a tar archive\n\n  history     Show the history of an image\n\n  import      Import the contents from a tarball to create a filesystem image\n\n  inspect     Return low-level information on Docker objects\n\n  kill        Kill one or more running containers\n\n  load        Load an image from a tar archive or STDIN\n\n  logs        Fetch the logs of a container\n\n  pause       Pause all processes within one or more containers\n\n  port        List port mappings or a specific mapping for the container\n\n  rename      Rename a container\n\n  restart     Restart one or more containers\n\n  rm          Remove one or more containers\n\n  rmi         Remove one or more images\n\n  save        Save one or more images to a tar archive (streamed to STDOUT by default)\n\n  start       Start one or more stopped containers\n\n  stats       Display a live stream of container(s) resource usage statistics\n\n  stop        Stop one or more running containers\n\n  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE\n\n  top         Display the running processes of a container\n\n  unpause     Unpause all processes within one or more containers\n\n  update      Update configuration of one or more containers\n\n  wait        Block until one or more containers stop, then print their exit codes\n\n\n\nInvalid Plugins:\n\n  dev         failed to fetch metadata: fork\u002Fexec \u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fcli-plugins\u002Fdocker-dev: no such file or directory\n\n  feedback    failed to fetch metadata: fork\u002Fexec \u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fcli-plugins\u002Fdocker-feedback: no such file or directory\n\n\n\nGlobal Options:\n\n      --config string      Location of client config files (default\n\n                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\")\n\n  -c, --context string     Name of the context to use to connect to the\n\n                           daemon (overrides DOCKER_HOST env var and\n\n                           default context set with \"docker context use\")\n\n  -D, --debug              Enable debug mode\n\n  -H, --host list          Daemon socket to connect to\n\n  -l, --log-level string   Set the logging level (\"debug\", \"info\",\n\n                           \"warn\", \"error\", \"fatal\") (default \"info\")\n\n      --tls                Use TLS; implied by --tlsverify\n\n      --tlscacert string   Trust certs signed only by this CA (default\n\n                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fca.pem\")\n\n      --tlscert string     Path to TLS certificate file (default\n\n                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fcert.pem\")\n\n      --tlskey string      Path to TLS key file (default\n\n                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fkey.pem\")\n\n      --tlsverify          Use TLS and verify the remote\n\n  -v, --version            Print version information and quit\n\n\n\nRun 'docker COMMAND --help' for more information on a command.\n\n\n\nFor more help on how to use Docker, head to https:\u002F\u002Fdocs.docker.com\u002Fgo\u002Fguides\u002F\n",[47,1075,1076,1083,1087,1097,1101,1105,1110,1128,1133,1138,1143,1152,1157,1190,1195,1220,1225,1236,1241,1262,1267,1287,1292,1312,1317,1329,1334,1349,1354,1372,1377,1396,1401,1421,1426,1440,1445,1450,1455,1463,1468,1490,1495,1518,1523,1535,1540,1554,1559,1573,1578,1589,1594,1605,1610,1639,1644,1660,1665,1689,1694,1710,1715,1726,1731,1759,1764,1787,1792,1809,1814,1829,1834,1845,1850,1863,1868,1894,1899,1910,1915,1928,1933,1971,1976,1989,1994,2005,2010,2028,2033,2044,2049,2054,2059,2067,2072,2083,2088,2093,2098,2104,2109,2146,2151,2179,2184,2190,2195,2201,2206,2220,2225,2250,2255,2273,2278,2284,2289,2295,2300,2306,2311,2317,2322,2328,2333,2339,2344,2350,2355,2361,2366,2372,2377,2383,2388,2394,2399,2405,2410,2416,2421,2427,2432,2438,2443,2449,2454,2460,2465,2471,2476,2482,2487,2493,2498,2504,2509,2514,2519,2525,2530,2536,2541,2547,2552,2557,2562,2568,2573,2579,2584,2590,2595,2601,2606,2612,2617,2623,2628,2634,2639,2645,2650,2656,2661,2667,2672,2678,2683,2689,2694,2700,2705,2711,2716,2722,2727,2733,2738,2744,2749,2755,2760,2766,2771,2776,2781,2802,2807,2812,2817],{"__ignoreMap":203},[947,1077,1078,1080],{"class":949,"line":226},[947,1079,877],{"class":952},[947,1081,1082],{"class":986}," --help\n",[947,1084,1085],{"class":949,"line":204},[947,1086,973],{"emptyLinePlaceholder":225},[947,1088,1089,1092,1094],{"class":949,"line":207},[947,1090,1091],{"class":952},"Usage: ",[947,1093,998],{"class":956},[947,1095,1096],{"class":1035}," [OPTIONS] COMMAND\n",[947,1098,1099],{"class":949,"line":976},[947,1100,973],{"emptyLinePlaceholder":225},[947,1102,1103],{"class":949,"line":1004},[947,1104,973],{"emptyLinePlaceholder":225},[947,1106,1108],{"class":949,"line":1107},6,[947,1109,973],{"emptyLinePlaceholder":225},[947,1111,1113,1116,1119,1122,1125],{"class":949,"line":1112},7,[947,1114,1115],{"class":952},"A",[947,1117,1118],{"class":956}," self-sufficient",[947,1120,1121],{"class":956}," runtime",[947,1123,1124],{"class":956}," for",[947,1126,1127],{"class":956}," containers\n",[947,1129,1131],{"class":949,"line":1130},8,[947,1132,973],{"emptyLinePlaceholder":225},[947,1134,1136],{"class":949,"line":1135},9,[947,1137,973],{"emptyLinePlaceholder":225},[947,1139,1141],{"class":949,"line":1140},10,[947,1142,973],{"emptyLinePlaceholder":225},[947,1144,1146,1149],{"class":949,"line":1145},11,[947,1147,1148],{"class":952},"Common",[947,1150,1151],{"class":956}," Commands:\n",[947,1153,1155],{"class":949,"line":1154},12,[947,1156,973],{"emptyLinePlaceholder":225},[947,1158,1160,1163,1166,1169,1172,1175,1178,1181,1184,1187],{"class":949,"line":1159},13,[947,1161,1162],{"class":956},"  run",[947,1164,1165],{"class":956},"         Create",[947,1167,1168],{"class":956}," and",[947,1170,1171],{"class":956}," run",[947,1173,1174],{"class":956}," a",[947,1176,1177],{"class":956}," new",[947,1179,1180],{"class":956}," container",[947,1182,1183],{"class":956}," from",[947,1185,1186],{"class":956}," an",[947,1188,1189],{"class":956}," image\n",[947,1191,1193],{"class":949,"line":1192},14,[947,1194,973],{"emptyLinePlaceholder":225},[947,1196,1198,1201,1204,1206,1209,1212,1214,1217],{"class":949,"line":1197},15,[947,1199,1200],{"class":956},"  exec ",[947,1202,1203],{"class":956},"       Execute",[947,1205,1174],{"class":956},[947,1207,1208],{"class":956}," command",[947,1210,1211],{"class":956}," in",[947,1213,1174],{"class":956},[947,1215,1216],{"class":956}," running",[947,1218,1219],{"class":956}," container\n",[947,1221,1223],{"class":949,"line":1222},16,[947,1224,973],{"emptyLinePlaceholder":225},[947,1226,1228,1231,1234],{"class":949,"line":1227},17,[947,1229,1230],{"class":956},"  ps ",[947,1232,1233],{"class":956},"         List",[947,1235,1127],{"class":956},[947,1237,1239],{"class":949,"line":1238},18,[947,1240,973],{"emptyLinePlaceholder":225},[947,1242,1244,1247,1250,1252,1255,1257,1259],{"class":949,"line":1243},19,[947,1245,1246],{"class":956},"  build",[947,1248,1249],{"class":956},"       Build",[947,1251,1186],{"class":956},[947,1253,1254],{"class":956}," image",[947,1256,1183],{"class":956},[947,1258,1174],{"class":956},[947,1260,1261],{"class":956}," Dockerfile\n",[947,1263,1265],{"class":949,"line":1264},20,[947,1266,973],{"emptyLinePlaceholder":225},[947,1268,1270,1273,1276,1278,1280,1282,1284],{"class":949,"line":1269},21,[947,1271,1272],{"class":956},"  pull ",[947,1274,1275],{"class":956},"       Download",[947,1277,1186],{"class":956},[947,1279,1254],{"class":956},[947,1281,1183],{"class":956},[947,1283,1174],{"class":956},[947,1285,1286],{"class":956}," registry\n",[947,1288,1290],{"class":949,"line":1289},22,[947,1291,973],{"emptyLinePlaceholder":225},[947,1293,1295,1298,1301,1303,1305,1308,1310],{"class":949,"line":1294},23,[947,1296,1297],{"class":956},"  push ",[947,1299,1300],{"class":956},"       Upload",[947,1302,1186],{"class":956},[947,1304,1254],{"class":956},[947,1306,1307],{"class":956}," to",[947,1309,1174],{"class":956},[947,1311,1286],{"class":956},[947,1313,1315],{"class":949,"line":1314},24,[947,1316,973],{"emptyLinePlaceholder":225},[947,1318,1320,1323,1326],{"class":949,"line":1319},25,[947,1321,1322],{"class":956},"  images ",[947,1324,1325],{"class":956},"     List",[947,1327,1328],{"class":956}," images\n",[947,1330,1332],{"class":949,"line":1331},26,[947,1333,973],{"emptyLinePlaceholder":225},[947,1335,1337,1340,1343,1345,1347],{"class":949,"line":1336},27,[947,1338,1339],{"class":956},"  login",[947,1341,1342],{"class":956},"       Authenticate",[947,1344,1307],{"class":956},[947,1346,1174],{"class":956},[947,1348,1286],{"class":956},[947,1350,1352],{"class":949,"line":1351},28,[947,1353,973],{"emptyLinePlaceholder":225},[947,1355,1357,1360,1363,1366,1368,1370],{"class":949,"line":1356},29,[947,1358,1359],{"class":956},"  logout ",[947,1361,1362],{"class":956},"     Log",[947,1364,1365],{"class":956}," out",[947,1367,1183],{"class":956},[947,1369,1174],{"class":956},[947,1371,1286],{"class":956},[947,1373,1375],{"class":949,"line":1374},30,[947,1376,973],{"emptyLinePlaceholder":225},[947,1378,1380,1383,1386,1389,1392,1394],{"class":949,"line":1379},31,[947,1381,1382],{"class":956},"  search ",[947,1384,1385],{"class":956},"     Search",[947,1387,1388],{"class":956}," Docker",[947,1390,1391],{"class":956}," Hub",[947,1393,1124],{"class":956},[947,1395,1328],{"class":956},[947,1397,1399],{"class":949,"line":1398},32,[947,1400,973],{"emptyLinePlaceholder":225},[947,1402,1404,1407,1410,1413,1415,1418],{"class":949,"line":1403},33,[947,1405,1406],{"class":956},"  version",[947,1408,1409],{"class":956},"     Show",[947,1411,1412],{"class":956}," the",[947,1414,1388],{"class":956},[947,1416,1417],{"class":956}," version",[947,1419,1420],{"class":956}," information\n",[947,1422,1424],{"class":949,"line":1423},34,[947,1425,973],{"emptyLinePlaceholder":225},[947,1427,1429,1432,1435,1438],{"class":949,"line":1428},35,[947,1430,1431],{"class":956},"  info ",[947,1433,1434],{"class":956},"       Display",[947,1436,1437],{"class":956}," system-wide",[947,1439,1420],{"class":956},[947,1441,1443],{"class":949,"line":1442},36,[947,1444,973],{"emptyLinePlaceholder":225},[947,1446,1448],{"class":949,"line":1447},37,[947,1449,973],{"emptyLinePlaceholder":225},[947,1451,1453],{"class":949,"line":1452},38,[947,1454,973],{"emptyLinePlaceholder":225},[947,1456,1458,1461],{"class":949,"line":1457},39,[947,1459,1460],{"class":952},"Management",[947,1462,1151],{"class":956},[947,1464,1466],{"class":949,"line":1465},40,[947,1467,973],{"emptyLinePlaceholder":225},[947,1469,1471,1474,1478,1481,1484,1487],{"class":949,"line":1470},41,[947,1472,1473],{"class":956},"  agent",[947,1475,1477],{"class":1476},"sF94o","*",[947,1479,1480],{"class":956},"      Docker",[947,1482,1483],{"class":956}," AI",[947,1485,1486],{"class":956}," Agent",[947,1488,1489],{"class":956}," Runner\n",[947,1491,1493],{"class":949,"line":1492},42,[947,1494,973],{"emptyLinePlaceholder":225},[947,1496,1498,1501,1503,1506,1508,1510,1512,1515],{"class":949,"line":1497},43,[947,1499,1500],{"class":956},"  ai",[947,1502,1477],{"class":1476},[947,1504,1505],{"class":956},"         Docker",[947,1507,1483],{"class":956},[947,1509,1486],{"class":956},[947,1511,1036],{"class":956},[947,1513,1514],{"class":956}," Ask",[947,1516,1517],{"class":956}," Gordon\n",[947,1519,1521],{"class":949,"line":1520},44,[947,1522,973],{"emptyLinePlaceholder":225},[947,1524,1526,1529,1532],{"class":949,"line":1525},45,[947,1527,1528],{"class":956},"  builder",[947,1530,1531],{"class":956},"     Manage",[947,1533,1534],{"class":956}," builds\n",[947,1536,1538],{"class":949,"line":1537},46,[947,1539,973],{"emptyLinePlaceholder":225},[947,1541,1543,1546,1548,1551],{"class":949,"line":1542},47,[947,1544,1545],{"class":956},"  buildx",[947,1547,1477],{"class":1476},[947,1549,1550],{"class":956},"     Docker",[947,1552,1553],{"class":956}," Buildx\n",[947,1555,1557],{"class":949,"line":1556},48,[947,1558,973],{"emptyLinePlaceholder":225},[947,1560,1562,1565,1567,1570],{"class":949,"line":1561},49,[947,1563,1564],{"class":956},"  compose",[947,1566,1477],{"class":1476},[947,1568,1569],{"class":956},"    Docker",[947,1571,1572],{"class":956}," Compose\n",[947,1574,1576],{"class":949,"line":1575},50,[947,1577,973],{"emptyLinePlaceholder":225},[947,1579,1581,1584,1587],{"class":949,"line":1580},51,[947,1582,1583],{"class":956},"  container",[947,1585,1586],{"class":956},"   Manage",[947,1588,1127],{"class":956},[947,1590,1592],{"class":949,"line":1591},52,[947,1593,973],{"emptyLinePlaceholder":225},[947,1595,1597,1600,1602],{"class":949,"line":1596},53,[947,1598,1599],{"class":956},"  context",[947,1601,1531],{"class":956},[947,1603,1604],{"class":956}," contexts\n",[947,1606,1608],{"class":949,"line":1607},54,[947,1609,973],{"emptyLinePlaceholder":225},[947,1611,1613,1616,1618,1621,1623,1626,1629,1632,1634,1637],{"class":949,"line":1612},55,[947,1614,1615],{"class":956},"  debug",[947,1617,1477],{"class":1476},[947,1619,1620],{"class":956},"      Get",[947,1622,1174],{"class":956},[947,1624,1625],{"class":956}," shell",[947,1627,1628],{"class":956}," into",[947,1630,1631],{"class":956}," any",[947,1633,1254],{"class":956},[947,1635,1636],{"class":956}," or",[947,1638,1219],{"class":956},[947,1640,1642],{"class":949,"line":1641},56,[947,1643,973],{"emptyLinePlaceholder":225},[947,1645,1647,1650,1652,1654,1657],{"class":949,"line":1646},57,[947,1648,1649],{"class":956},"  desktop",[947,1651,1477],{"class":1476},[947,1653,1569],{"class":956},[947,1655,1656],{"class":956}," Desktop",[947,1658,1659],{"class":956}," commands\n",[947,1661,1663],{"class":949,"line":1662},58,[947,1664,973],{"emptyLinePlaceholder":225},[947,1666,1668,1671,1673,1676,1678,1681,1683,1686],{"class":949,"line":1667},59,[947,1669,1670],{"class":956},"  dhi",[947,1672,1477],{"class":1476},[947,1674,1675],{"class":956},"        CLI",[947,1677,1124],{"class":956},[947,1679,1680],{"class":956}," managing",[947,1682,1388],{"class":956},[947,1684,1685],{"class":956}," Hardened",[947,1687,1688],{"class":956}," Images\n",[947,1690,1692],{"class":949,"line":1691},60,[947,1693,973],{"emptyLinePlaceholder":225},[947,1695,1697,1700,1702,1705,1707],{"class":949,"line":1696},61,[947,1698,1699],{"class":956},"  extension",[947,1701,1477],{"class":1476},[947,1703,1704],{"class":956},"  Manages",[947,1706,1388],{"class":956},[947,1708,1709],{"class":956}," extensions\n",[947,1711,1713],{"class":949,"line":1712},62,[947,1714,973],{"emptyLinePlaceholder":225},[947,1716,1718,1721,1724],{"class":949,"line":1717},63,[947,1719,1720],{"class":956},"  image",[947,1722,1723],{"class":956},"       Manage",[947,1725,1328],{"class":956},[947,1727,1729],{"class":949,"line":1728},64,[947,1730,973],{"emptyLinePlaceholder":225},[947,1732,1734,1737,1739,1742,1745,1748,1751,1753,1756],{"class":949,"line":1733},65,[947,1735,1736],{"class":956},"  init",[947,1738,1477],{"class":1476},[947,1740,1741],{"class":956},"       Creates",[947,1743,1744],{"class":956}," Docker-related",[947,1746,1747],{"class":956}," starter",[947,1749,1750],{"class":956}," files",[947,1752,1124],{"class":956},[947,1754,1755],{"class":956}," your",[947,1757,1758],{"class":956}," project\n",[947,1760,1762],{"class":949,"line":1761},66,[947,1763,973],{"emptyLinePlaceholder":225},[947,1765,1767,1770,1772,1774,1776,1779,1781,1784],{"class":949,"line":1766},67,[947,1768,1769],{"class":956},"  manifest ",[947,1771,1586],{"class":956},[947,1773,1388],{"class":956},[947,1775,1254],{"class":956},[947,1777,1778],{"class":956}," manifests",[947,1780,1168],{"class":956},[947,1782,1783],{"class":956}," manifest",[947,1785,1786],{"class":956}," lists\n",[947,1788,1790],{"class":949,"line":1789},68,[947,1791,973],{"emptyLinePlaceholder":225},[947,1793,1795,1798,1800,1803,1806],{"class":949,"line":1794},69,[947,1796,1797],{"class":956},"  mcp",[947,1799,1477],{"class":1476},[947,1801,1802],{"class":956},"        Docker",[947,1804,1805],{"class":956}," MCP",[947,1807,1808],{"class":956}," Plugin\n",[947,1810,1812],{"class":949,"line":1811},70,[947,1813,973],{"emptyLinePlaceholder":225},[947,1815,1817,1820,1822,1824,1827],{"class":949,"line":1816},71,[947,1818,1819],{"class":956},"  model",[947,1821,1477],{"class":1476},[947,1823,1480],{"class":956},[947,1825,1826],{"class":956}," Model",[947,1828,1489],{"class":956},[947,1830,1832],{"class":949,"line":1831},72,[947,1833,973],{"emptyLinePlaceholder":225},[947,1835,1837,1840,1842],{"class":949,"line":1836},73,[947,1838,1839],{"class":956},"  network",[947,1841,1531],{"class":956},[947,1843,1844],{"class":956}," networks\n",[947,1846,1848],{"class":949,"line":1847},74,[947,1849,973],{"emptyLinePlaceholder":225},[947,1851,1853,1856,1858,1860],{"class":949,"line":1852},75,[947,1854,1855],{"class":956},"  offload",[947,1857,1477],{"class":1476},[947,1859,1569],{"class":956},[947,1861,1862],{"class":956}," Offload\n",[947,1864,1866],{"class":949,"line":1865},76,[947,1867,973],{"emptyLinePlaceholder":225},[947,1869,1871,1874,1876,1879,1882,1885,1888,1891],{"class":949,"line":1870},77,[947,1872,1873],{"class":956},"  pass",[947,1875,1477],{"class":1476},[947,1877,1878],{"class":956},"       Docker",[947,1880,1881],{"class":956}," Pass",[947,1883,1884],{"class":956}," Secrets",[947,1886,1887],{"class":956}," Manager",[947,1889,1890],{"class":956}," Plugin",[947,1892,1893],{"class":1035}," (beta)\n",[947,1895,1897],{"class":949,"line":1896},78,[947,1898,973],{"emptyLinePlaceholder":225},[947,1900,1902,1905,1907],{"class":949,"line":1901},79,[947,1903,1904],{"class":956},"  plugin ",[947,1906,1531],{"class":956},[947,1908,1909],{"class":956}," plugins\n",[947,1911,1913],{"class":949,"line":1912},80,[947,1914,973],{"emptyLinePlaceholder":225},[947,1916,1918,1921,1923,1925],{"class":949,"line":1917},81,[947,1919,1920],{"class":956},"  sandbox",[947,1922,1477],{"class":1476},[947,1924,1569],{"class":956},[947,1926,1927],{"class":956}," Sandbox\n",[947,1929,1931],{"class":949,"line":1930},82,[947,1932,973],{"emptyLinePlaceholder":225},[947,1934,1936,1939,1941,1944,1946,1949,1952,1955,1958,1961,1964,1968],{"class":949,"line":1935},83,[947,1937,1938],{"class":956},"  sbom",[947,1940,1477],{"class":1476},[947,1942,1943],{"class":956},"       View",[947,1945,1412],{"class":956},[947,1947,1948],{"class":956}," packaged-based",[947,1950,1951],{"class":956}," Software",[947,1953,1954],{"class":956}," Bill",[947,1956,1957],{"class":956}," Of",[947,1959,1960],{"class":956}," Materials",[947,1962,1963],{"class":1035}," (SBOM) ",[947,1965,1967],{"class":1966},"sLY2T","for",[947,1969,1970],{"class":1035}," an image\n",[947,1972,1974],{"class":949,"line":1973},84,[947,1975,973],{"emptyLinePlaceholder":225},[947,1977,1979,1982,1984,1986],{"class":949,"line":1978},85,[947,1980,1981],{"class":956},"  scout",[947,1983,1477],{"class":1476},[947,1985,1480],{"class":956},[947,1987,1988],{"class":956}," Scout\n",[947,1990,1992],{"class":949,"line":1991},86,[947,1993,973],{"emptyLinePlaceholder":225},[947,1995,1997,2000,2002],{"class":949,"line":1996},87,[947,1998,1999],{"class":956},"  system ",[947,2001,1531],{"class":956},[947,2003,2004],{"class":956}," Docker\n",[947,2006,2008],{"class":949,"line":2007},88,[947,2009,973],{"emptyLinePlaceholder":225},[947,2011,2013,2016,2018,2021,2024,2026],{"class":949,"line":2012},89,[947,2014,2015],{"class":956},"  trust",[947,2017,1723],{"class":956},[947,2019,2020],{"class":956}," trust",[947,2022,2023],{"class":956}," on",[947,2025,1388],{"class":956},[947,2027,1328],{"class":956},[947,2029,2031],{"class":949,"line":2030},90,[947,2032,973],{"emptyLinePlaceholder":225},[947,2034,2036,2039,2041],{"class":949,"line":2035},91,[947,2037,2038],{"class":956},"  volume ",[947,2040,1531],{"class":956},[947,2042,2043],{"class":956}," volumes\n",[947,2045,2047],{"class":949,"line":2046},92,[947,2048,973],{"emptyLinePlaceholder":225},[947,2050,2052],{"class":949,"line":2051},93,[947,2053,973],{"emptyLinePlaceholder":225},[947,2055,2057],{"class":949,"line":2056},94,[947,2058,973],{"emptyLinePlaceholder":225},[947,2060,2062,2065],{"class":949,"line":2061},95,[947,2063,2064],{"class":952},"Swarm",[947,2066,1151],{"class":956},[947,2068,2070],{"class":949,"line":2069},96,[947,2071,973],{"emptyLinePlaceholder":225},[947,2073,2075,2078,2080],{"class":949,"line":2074},97,[947,2076,2077],{"class":956},"  swarm",[947,2079,1723],{"class":956},[947,2081,2082],{"class":956}," Swarm\n",[947,2084,2086],{"class":949,"line":2085},98,[947,2087,973],{"emptyLinePlaceholder":225},[947,2089,2091],{"class":949,"line":2090},99,[947,2092,973],{"emptyLinePlaceholder":225},[947,2094,2096],{"class":949,"line":2095},100,[947,2097,973],{"emptyLinePlaceholder":225},[947,2099,2101],{"class":949,"line":2100},101,[947,2102,2103],{"class":952},"Commands:\n",[947,2105,2107],{"class":949,"line":2106},102,[947,2108,973],{"emptyLinePlaceholder":225},[947,2110,2112,2115,2118,2121,2124,2127,2130,2132,2135,2138,2140,2142,2144],{"class":949,"line":2111},103,[947,2113,2114],{"class":956},"  attach ",[947,2116,2117],{"class":956},"     Attach",[947,2119,2120],{"class":956}," local",[947,2122,2123],{"class":956}," standard",[947,2125,2126],{"class":956}," input,",[947,2128,2129],{"class":956}," output,",[947,2131,1168],{"class":956},[947,2133,2134],{"class":956}," error",[947,2136,2137],{"class":956}," streams",[947,2139,1307],{"class":956},[947,2141,1174],{"class":956},[947,2143,1216],{"class":956},[947,2145,1219],{"class":956},[947,2147,2149],{"class":949,"line":2148},104,[947,2150,973],{"emptyLinePlaceholder":225},[947,2152,2154,2157,2160,2162,2164,2166,2168,2170,2172,2176],{"class":949,"line":2153},105,[947,2155,2156],{"class":956},"  commit ",[947,2158,2159],{"class":956},"     Create",[947,2161,1174],{"class":956},[947,2163,1177],{"class":956},[947,2165,1254],{"class":956},[947,2167,1183],{"class":956},[947,2169,1174],{"class":956},[947,2171,1180],{"class":956},[947,2173,2175],{"class":2174},"ssona","'",[947,2177,2178],{"class":956},"s changes\n",[947,2180,2182],{"class":949,"line":2181},106,[947,2183,973],{"emptyLinePlaceholder":225},[947,2185,2187],{"class":949,"line":2186},107,[947,2188,2189],{"class":956},"  cp          Copy files\u002Ffolders between a container and the local filesystem\n",[947,2191,2193],{"class":949,"line":2192},108,[947,2194,973],{"emptyLinePlaceholder":225},[947,2196,2198],{"class":949,"line":2197},109,[947,2199,2200],{"class":956},"  create      Create a new container\n",[947,2202,2204],{"class":949,"line":2203},110,[947,2205,973],{"emptyLinePlaceholder":225},[947,2207,2209,2212,2214,2217],{"class":949,"line":2208},111,[947,2210,2211],{"class":956},"  diff        Inspect changes to files or directories on a container",[947,2213,2175],{"class":2174},[947,2215,2216],{"class":956},"s",[947,2218,2219],{"class":956}," filesystem\n",[947,2221,2223],{"class":949,"line":2222},112,[947,2224,973],{"emptyLinePlaceholder":225},[947,2226,2228,2231,2234,2237,2240,2243,2245,2247],{"class":949,"line":2227},113,[947,2229,2230],{"class":956},"  events ",[947,2232,2233],{"class":956},"     Get",[947,2235,2236],{"class":956}," real",[947,2238,2239],{"class":956}," time",[947,2241,2242],{"class":956}," events",[947,2244,1183],{"class":956},[947,2246,1412],{"class":956},[947,2248,2249],{"class":956}," server\n",[947,2251,2253],{"class":949,"line":2252},114,[947,2254,973],{"emptyLinePlaceholder":225},[947,2256,2258,2261,2264,2266,2268,2270],{"class":949,"line":2257},115,[947,2259,2260],{"class":956},"  export ",[947,2262,2263],{"class":956},"     Export",[947,2265,1174],{"class":956},[947,2267,1180],{"class":956},[947,2269,2175],{"class":2174},[947,2271,2272],{"class":956},"s filesystem as a tar archive\n",[947,2274,2276],{"class":949,"line":2275},116,[947,2277,973],{"emptyLinePlaceholder":225},[947,2279,2281],{"class":949,"line":2280},117,[947,2282,2283],{"class":956},"  history     Show the history of an image\n",[947,2285,2287],{"class":949,"line":2286},118,[947,2288,973],{"emptyLinePlaceholder":225},[947,2290,2292],{"class":949,"line":2291},119,[947,2293,2294],{"class":956},"  import      Import the contents from a tarball to create a filesystem image\n",[947,2296,2298],{"class":949,"line":2297},120,[947,2299,973],{"emptyLinePlaceholder":225},[947,2301,2303],{"class":949,"line":2302},121,[947,2304,2305],{"class":956},"  inspect     Return low-level information on Docker objects\n",[947,2307,2309],{"class":949,"line":2308},122,[947,2310,973],{"emptyLinePlaceholder":225},[947,2312,2314],{"class":949,"line":2313},123,[947,2315,2316],{"class":956},"  kill        Kill one or more running containers\n",[947,2318,2320],{"class":949,"line":2319},124,[947,2321,973],{"emptyLinePlaceholder":225},[947,2323,2325],{"class":949,"line":2324},125,[947,2326,2327],{"class":956},"  load        Load an image from a tar archive or STDIN\n",[947,2329,2331],{"class":949,"line":2330},126,[947,2332,973],{"emptyLinePlaceholder":225},[947,2334,2336],{"class":949,"line":2335},127,[947,2337,2338],{"class":956},"  logs        Fetch the logs of a container\n",[947,2340,2342],{"class":949,"line":2341},128,[947,2343,973],{"emptyLinePlaceholder":225},[947,2345,2347],{"class":949,"line":2346},129,[947,2348,2349],{"class":956},"  pause       Pause all processes within one or more containers\n",[947,2351,2353],{"class":949,"line":2352},130,[947,2354,973],{"emptyLinePlaceholder":225},[947,2356,2358],{"class":949,"line":2357},131,[947,2359,2360],{"class":956},"  port        List port mappings or a specific mapping for the container\n",[947,2362,2364],{"class":949,"line":2363},132,[947,2365,973],{"emptyLinePlaceholder":225},[947,2367,2369],{"class":949,"line":2368},133,[947,2370,2371],{"class":956},"  rename      Rename a container\n",[947,2373,2375],{"class":949,"line":2374},134,[947,2376,973],{"emptyLinePlaceholder":225},[947,2378,2380],{"class":949,"line":2379},135,[947,2381,2382],{"class":956},"  restart     Restart one or more containers\n",[947,2384,2386],{"class":949,"line":2385},136,[947,2387,973],{"emptyLinePlaceholder":225},[947,2389,2391],{"class":949,"line":2390},137,[947,2392,2393],{"class":956},"  rm          Remove one or more containers\n",[947,2395,2397],{"class":949,"line":2396},138,[947,2398,973],{"emptyLinePlaceholder":225},[947,2400,2402],{"class":949,"line":2401},139,[947,2403,2404],{"class":956},"  rmi         Remove one or more images\n",[947,2406,2408],{"class":949,"line":2407},140,[947,2409,973],{"emptyLinePlaceholder":225},[947,2411,2413],{"class":949,"line":2412},141,[947,2414,2415],{"class":956},"  save        Save one or more images to a tar archive (streamed to STDOUT by default)\n",[947,2417,2419],{"class":949,"line":2418},142,[947,2420,973],{"emptyLinePlaceholder":225},[947,2422,2424],{"class":949,"line":2423},143,[947,2425,2426],{"class":956},"  start       Start one or more stopped containers\n",[947,2428,2430],{"class":949,"line":2429},144,[947,2431,973],{"emptyLinePlaceholder":225},[947,2433,2435],{"class":949,"line":2434},145,[947,2436,2437],{"class":956},"  stats       Display a live stream of container(s) resource usage statistics\n",[947,2439,2441],{"class":949,"line":2440},146,[947,2442,973],{"emptyLinePlaceholder":225},[947,2444,2446],{"class":949,"line":2445},147,[947,2447,2448],{"class":956},"  stop        Stop one or more running containers\n",[947,2450,2452],{"class":949,"line":2451},148,[947,2453,973],{"emptyLinePlaceholder":225},[947,2455,2457],{"class":949,"line":2456},149,[947,2458,2459],{"class":956},"  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE\n",[947,2461,2463],{"class":949,"line":2462},150,[947,2464,973],{"emptyLinePlaceholder":225},[947,2466,2468],{"class":949,"line":2467},151,[947,2469,2470],{"class":956},"  top         Display the running processes of a container\n",[947,2472,2474],{"class":949,"line":2473},152,[947,2475,973],{"emptyLinePlaceholder":225},[947,2477,2479],{"class":949,"line":2478},153,[947,2480,2481],{"class":956},"  unpause     Unpause all processes within one or more containers\n",[947,2483,2485],{"class":949,"line":2484},154,[947,2486,973],{"emptyLinePlaceholder":225},[947,2488,2490],{"class":949,"line":2489},155,[947,2491,2492],{"class":956},"  update      Update configuration of one or more containers\n",[947,2494,2496],{"class":949,"line":2495},156,[947,2497,973],{"emptyLinePlaceholder":225},[947,2499,2501],{"class":949,"line":2500},157,[947,2502,2503],{"class":956},"  wait        Block until one or more containers stop, then print their exit codes\n",[947,2505,2507],{"class":949,"line":2506},158,[947,2508,973],{"emptyLinePlaceholder":225},[947,2510,2512],{"class":949,"line":2511},159,[947,2513,973],{"emptyLinePlaceholder":225},[947,2515,2517],{"class":949,"line":2516},160,[947,2518,973],{"emptyLinePlaceholder":225},[947,2520,2522],{"class":949,"line":2521},161,[947,2523,2524],{"class":956},"Invalid Plugins:\n",[947,2526,2528],{"class":949,"line":2527},162,[947,2529,973],{"emptyLinePlaceholder":225},[947,2531,2533],{"class":949,"line":2532},163,[947,2534,2535],{"class":956},"  dev         failed to fetch metadata: fork\u002Fexec \u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fcli-plugins\u002Fdocker-dev: no such file or directory\n",[947,2537,2539],{"class":949,"line":2538},164,[947,2540,973],{"emptyLinePlaceholder":225},[947,2542,2544],{"class":949,"line":2543},165,[947,2545,2546],{"class":956},"  feedback    failed to fetch metadata: fork\u002Fexec \u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fcli-plugins\u002Fdocker-feedback: no such file or directory\n",[947,2548,2550],{"class":949,"line":2549},166,[947,2551,973],{"emptyLinePlaceholder":225},[947,2553,2555],{"class":949,"line":2554},167,[947,2556,973],{"emptyLinePlaceholder":225},[947,2558,2560],{"class":949,"line":2559},168,[947,2561,973],{"emptyLinePlaceholder":225},[947,2563,2565],{"class":949,"line":2564},169,[947,2566,2567],{"class":956},"Global Options:\n",[947,2569,2571],{"class":949,"line":2570},170,[947,2572,973],{"emptyLinePlaceholder":225},[947,2574,2576],{"class":949,"line":2575},171,[947,2577,2578],{"class":956},"      --config string      Location of client config files (default\n",[947,2580,2582],{"class":949,"line":2581},172,[947,2583,973],{"emptyLinePlaceholder":225},[947,2585,2587],{"class":949,"line":2586},173,[947,2588,2589],{"class":956},"                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\")\n",[947,2591,2593],{"class":949,"line":2592},174,[947,2594,973],{"emptyLinePlaceholder":225},[947,2596,2598],{"class":949,"line":2597},175,[947,2599,2600],{"class":956},"  -c, --context string     Name of the context to use to connect to the\n",[947,2602,2604],{"class":949,"line":2603},176,[947,2605,973],{"emptyLinePlaceholder":225},[947,2607,2609],{"class":949,"line":2608},177,[947,2610,2611],{"class":956},"                           daemon (overrides DOCKER_HOST env var and\n",[947,2613,2615],{"class":949,"line":2614},178,[947,2616,973],{"emptyLinePlaceholder":225},[947,2618,2620],{"class":949,"line":2619},179,[947,2621,2622],{"class":956},"                           default context set with \"docker context use\")\n",[947,2624,2626],{"class":949,"line":2625},180,[947,2627,973],{"emptyLinePlaceholder":225},[947,2629,2631],{"class":949,"line":2630},181,[947,2632,2633],{"class":956},"  -D, --debug              Enable debug mode\n",[947,2635,2637],{"class":949,"line":2636},182,[947,2638,973],{"emptyLinePlaceholder":225},[947,2640,2642],{"class":949,"line":2641},183,[947,2643,2644],{"class":956},"  -H, --host list          Daemon socket to connect to\n",[947,2646,2648],{"class":949,"line":2647},184,[947,2649,973],{"emptyLinePlaceholder":225},[947,2651,2653],{"class":949,"line":2652},185,[947,2654,2655],{"class":956},"  -l, --log-level string   Set the logging level (\"debug\", \"info\",\n",[947,2657,2659],{"class":949,"line":2658},186,[947,2660,973],{"emptyLinePlaceholder":225},[947,2662,2664],{"class":949,"line":2663},187,[947,2665,2666],{"class":956},"                           \"warn\", \"error\", \"fatal\") (default \"info\")\n",[947,2668,2670],{"class":949,"line":2669},188,[947,2671,973],{"emptyLinePlaceholder":225},[947,2673,2675],{"class":949,"line":2674},189,[947,2676,2677],{"class":956},"      --tls                Use TLS; implied by --tlsverify\n",[947,2679,2681],{"class":949,"line":2680},190,[947,2682,973],{"emptyLinePlaceholder":225},[947,2684,2686],{"class":949,"line":2685},191,[947,2687,2688],{"class":956},"      --tlscacert string   Trust certs signed only by this CA (default\n",[947,2690,2692],{"class":949,"line":2691},192,[947,2693,973],{"emptyLinePlaceholder":225},[947,2695,2697],{"class":949,"line":2696},193,[947,2698,2699],{"class":956},"                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fca.pem\")\n",[947,2701,2703],{"class":949,"line":2702},194,[947,2704,973],{"emptyLinePlaceholder":225},[947,2706,2708],{"class":949,"line":2707},195,[947,2709,2710],{"class":956},"      --tlscert string     Path to TLS certificate file (default\n",[947,2712,2714],{"class":949,"line":2713},196,[947,2715,973],{"emptyLinePlaceholder":225},[947,2717,2719],{"class":949,"line":2718},197,[947,2720,2721],{"class":956},"                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fcert.pem\")\n",[947,2723,2725],{"class":949,"line":2724},198,[947,2726,973],{"emptyLinePlaceholder":225},[947,2728,2730],{"class":949,"line":2729},199,[947,2731,2732],{"class":956},"      --tlskey string      Path to TLS key file (default\n",[947,2734,2736],{"class":949,"line":2735},200,[947,2737,973],{"emptyLinePlaceholder":225},[947,2739,2741],{"class":949,"line":2740},201,[947,2742,2743],{"class":956},"                           \"\u002FUsers\u002Fdylanbouraoui\u002F.docker\u002Fkey.pem\")\n",[947,2745,2747],{"class":949,"line":2746},202,[947,2748,973],{"emptyLinePlaceholder":225},[947,2750,2752],{"class":949,"line":2751},203,[947,2753,2754],{"class":956},"      --tlsverify          Use TLS and verify the remote\n",[947,2756,2758],{"class":949,"line":2757},204,[947,2759,973],{"emptyLinePlaceholder":225},[947,2761,2763],{"class":949,"line":2762},205,[947,2764,2765],{"class":956},"  -v, --version            Print version information and quit\n",[947,2767,2769],{"class":949,"line":2768},206,[947,2770,973],{"emptyLinePlaceholder":225},[947,2772,2774],{"class":949,"line":2773},207,[947,2775,973],{"emptyLinePlaceholder":225},[947,2777,2779],{"class":949,"line":2778},208,[947,2780,973],{"emptyLinePlaceholder":225},[947,2782,2784,2787,2789,2791,2794,2797,2799],{"class":949,"line":2783},209,[947,2785,2786],{"class":956},"Run ",[947,2788,2175],{"class":2174},[947,2790,877],{"class":956},[947,2792,2793],{"class":956}," COMMAND",[947,2795,2796],{"class":986}," --help",[947,2798,2175],{"class":2174},[947,2800,2801],{"class":956}," for more information on a command.\n",[947,2803,2805],{"class":949,"line":2804},210,[947,2806,973],{"emptyLinePlaceholder":225},[947,2808,2810],{"class":949,"line":2809},211,[947,2811,973],{"emptyLinePlaceholder":225},[947,2813,2815],{"class":949,"line":2814},212,[947,2816,973],{"emptyLinePlaceholder":225},[947,2818,2820],{"class":949,"line":2819},213,[947,2821,2822],{"class":956},"For more help on how to use Docker, head to https:\u002F\u002Fdocs.docker.com\u002Fgo\u002Fguides\u002F\n",[326,2824,2826,2829],{"title":2825},"Pas de panique !",[17,2827,2828],{},"Vous n'avez absolument pas besoin de tout apprendre par cœur.",[17,2830,2831,2832,2835],{},"La beauté de cet outil, c'est que cette documentation intégrée au terminal est relativement bien fournie et très facile d'accès. Au début, vous ferez sûrement quelques allers-retours avec le ",[47,2833,2834],{},"--help"," (ou avec Google), mais avec le temps et la pratique, vous allez voir que les commandes récurrentes vont vite devenir des automatismes. Dans quelques semaines, vous les taperez de manière totalement naturelle !",[2837,2838,2839],"style",{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .sWZ6u, html code.shiki .sWZ6u{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .sOhXc, html code.shiki .sOhXc{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#66D9EF}html pre.shiki code .sYBsF, html code.shiki .sYBsF{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .s_bef, html code.shiki .s_bef{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .sBHfy, html code.shiki .sBHfy{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F92672}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sF94o, html code.shiki .sF94o{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#FD971F}html pre.shiki code .sLY2T, html code.shiki .sLY2T{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F92672;--shiki-dark-font-style:inherit}html pre.shiki code .ssona, html code.shiki .ssona{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#E6DB74}",{"title":203,"searchDepth":204,"depth":204,"links":2841},[2842,2843,2844],{"id":793,"depth":207,"text":794},{"id":870,"depth":207,"text":871},{"id":1056,"depth":207,"text":1057},"Comprendre le fonctionnement du CLI de Docker et ses commandes de base.","10m",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-1-intro-cli",{"title":731,"description":2845},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-1-intro-cli","9XJtiHnF2hYQNye8aLkFinV55uEgRple4IZT4KyY7k8",{"id":2853,"title":2854,"badge":238,"body":2855,"category":238,"date":238,"description":2845,"duration":2846,"extension":221,"image":238,"level":238,"meta":3393,"navigation":225,"order":204,"path":3394,"seo":3395,"stem":3396,"tags":238,"__hash__":3397},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-2-lister-les-container.md","2.2 Lister les conteneurs (la commande qu'on tape tout le temps)",{"type":9,"value":2856,"toc":3389},[2857,2864,2867,2909,2912,2959,2962,2966,2969,3051,3054,3111,3152,3156,3166,3172,3175,3185,3188,3194,3200,3202,3208,3212,3215,3229,3242,3246,3257,3263,3268,3287,3290,3312,3315,3319,3325,3350,3359,3376,3386],[17,2858,2859,2860,2863],{},"Bien, la toute première commande utile que l'on va utiliser est ",[47,2861,2862],{},"docker ps",". Elle va vous permettre d'afficher les différents conteneurs actuellement présents et lancés sur votre machine.",[17,2865,2866],{},"Si vous venez d'installer Docker, ça donnera simplement ça :",[814,2868,2870],{"className":941,"code":2869,"language":943,"meta":203,"style":203},"➜  ~ docker ps\nCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n",[47,2871,2872,2883],{"__ignoreMap":203},[947,2873,2874,2876,2878,2880],{"class":949,"line":226},[947,2875,953],{"class":952},[947,2877,957],{"class":956},[947,2879,998],{"class":956},[947,2881,2882],{"class":956}," ps\n",[947,2884,2885,2888,2891,2894,2897,2900,2903,2906],{"class":949,"line":204},[947,2886,2887],{"class":952},"CONTAINER",[947,2889,2890],{"class":956}," ID",[947,2892,2893],{"class":956},"   IMAGE",[947,2895,2896],{"class":956},"     COMMAND",[947,2898,2899],{"class":956},"   CREATED",[947,2901,2902],{"class":956},"   STATUS",[947,2904,2905],{"class":956},"    PORTS",[947,2907,2908],{"class":956},"     NAMES\n",[17,2910,2911],{},"On retient plusieurs choses. Il s'agit d'un tableau qui va vous montrer différentes informations cruciales :",[34,2913,2914,2920,2929,2935,2941,2947,2953],{},[37,2915,2916,2919],{},[21,2917,2918],{},"CONTAINER ID :"," L'identifiant unique du conteneur (ultra utile pour le cibler avec d'autres commandes par la suite).",[37,2921,2922,2925,2926,393],{},[21,2923,2924],{},"IMAGE :"," L'image utilisée par le conteneur pour tourner (ex : ",[47,2927,2928],{},"mysql:8.0",[37,2930,2931,2934],{},[21,2932,2933],{},"COMMAND :"," La commande exécutée par défaut au démarrage du conteneur.",[37,2936,2937,2940],{},[21,2938,2939],{},"CREATED :"," La date de création du conteneur.",[37,2942,2943,2946],{},[21,2944,2945],{},"STATUS :"," Le statut actuel du conteneur (s'il tourne, depuis combien de temps, ou s'il a planté).",[37,2948,2949,2952],{},[21,2950,2951],{},"PORTS :"," Les ports ouverts pour permettre la communication.",[37,2954,2955,2958],{},[21,2956,2957],{},"NAMES :"," Le nom du conteneur (que vous avez défini, ou que Docker a généré aléatoirement si vous n'avez rien dit).",[17,2960,2961],{},"Cette commande de base est redoutable. Elle vous permet, en un seul coup d'œil, de voir tout ce qui tourne sur votre machine.",[265,2963,2965],{"id":2964},"un-exemple-concret","Un exemple concret",[17,2967,2968],{},"Voici un exemple avec un conteneur PostgreSQL qui tournerait en ce moment même sur votre machine :",[814,2970,2972],{"className":941,"code":2971,"language":943,"meta":203,"style":203},"CONTAINER ID   IMAGE         COMMAND                  CREATED      STATUS         PORTS                                       NAMES\nc9bbfccc565d   postgres:18   \"docker-entrypoint.s…\"   5 days ago   Up 2 seconds   0.0.0.0:5432->5432\u002Ftcp, [::]:5432->5432\u002Ftcp   monolith_database\n",[47,2973,2974,2997],{"__ignoreMap":203},[947,2975,2976,2978,2980,2982,2985,2988,2991,2994],{"class":949,"line":226},[947,2977,2887],{"class":952},[947,2979,2890],{"class":956},[947,2981,2893],{"class":956},[947,2983,2984],{"class":956},"         COMMAND",[947,2986,2987],{"class":956},"                  CREATED",[947,2989,2990],{"class":956},"      STATUS",[947,2992,2993],{"class":956},"         PORTS",[947,2995,2996],{"class":956},"                                       NAMES\n",[947,2998,2999,3002,3005,3008,3011,3014,3017,3020,3023,3026,3029,3032,3035,3038,3040,3043,3046,3048],{"class":949,"line":204},[947,3000,3001],{"class":952},"c9bbfccc565d",[947,3003,3004],{"class":956},"   postgres:18",[947,3006,3007],{"class":2174},"   \"",[947,3009,3010],{"class":956},"docker-entrypoint.s…",[947,3012,3013],{"class":2174},"\"",[947,3015,3016],{"class":1010},"   5",[947,3018,3019],{"class":956}," days",[947,3021,3022],{"class":956}," ago",[947,3024,3025],{"class":956},"   Up",[947,3027,3028],{"class":1010}," 2",[947,3030,3031],{"class":956}," seconds",[947,3033,3034],{"class":956},"   0.0.0.0:5432",[947,3036,3037],{"class":1035},"-",[947,3039,1040],{"class":1039},[947,3041,3042],{"class":956},"5432\u002Ftcp,",[947,3044,3045],{"class":1035}," [::]:5432-",[947,3047,1040],{"class":1039},[947,3049,3050],{"class":1035},"5432\u002Ftcp   monolith_database\n",[17,3052,3053],{},"Là, on peut observer pas mal de choses intéressantes :",[34,3055,3056,3068,3076,3084,3092,3103],{},[37,3057,3058,3061,3062,3064,3065],{},[21,3059,3060],{},"CONTAINER ID"," -> ",[47,3063,3001],{}," ",[283,3066,3067],{},"(L'ID sera toujours généré aléatoirement et ne sera jamais identique à un autre).",[37,3069,3070,3061,3073],{},[21,3071,3072],{},"IMAGE",[47,3074,3075],{},"postgres:18",[37,3077,3078,3061,3081],{},[21,3079,3080],{},"COMMAND",[47,3082,3083],{},"\"docker-entrypoint.s…\"",[37,3085,3086,3061,3089],{},[21,3087,3088],{},"CREATED",[47,3090,3091],{},"5 days ago",[37,3093,3094,3061,3097,3064,3100],{},[21,3095,3096],{},"STATUS",[47,3098,3099],{},"Up 2 seconds",[283,3101,3102],{},"(Il a été créé il y a 5 jours, mais vient tout juste d'être redémarré il y a 2 secondes !)",[37,3104,3105,3061,3108],{},[21,3106,3107],{},"NAMES",[47,3109,3110],{},"monolith_database",[372,3112,3114,3124,3145],{"title":3113},"Le point super important : la colonne PORTS",[17,3115,3116,3117,3120,3121],{},"On peut voir que la connexion s'affiche comme ça : ",[47,3118,3119],{},"0.0.0.0:5432->5432\u002Ftcp",". Cette ligne ouvre un tunnel entre votre PC et le conteneur. ",[21,3122,3123],{},"Attention au sens de lecture :",[34,3125,3126,3136],{},[37,3127,3128,3129,491,3132,3135],{},"La partie de ",[21,3130,3131],{},"gauche",[47,3133,3134],{},"0.0.0.0:5432","), c'est le port ouvert sur votre machine hôte (votre PC).",[37,3137,3128,3138,491,3141,3144],{},[21,3139,3140],{},"droite",[47,3142,3143],{},"5432\u002Ftcp","), c'est le port à l'intérieur du conteneur.",[17,3146,3147,3148,3151],{},"En gros, la règle c'est ",[47,3149,3150],{},"HÔTE -> CONTENEUR",". Cela signifie que tout le trafic qui arrive sur le port 5432 de votre PC sera redirigé vers le port 5432 de votre conteneur Postgres.",[29,3153,3155],{"id":3154},"voir-les-fantômes-les-conteneurs-arrêtés","Voir les fantômes : les conteneurs arrêtés",[17,3157,3158,3159,3162,3163,3165],{},"Quand vous allez multiplier les manipulations et les expérimentations (surtout lors de vos futurs travaux pratiques ou ",[283,3160,3161],{},"labs","), vous allez vite vous rendre compte d'un détail : la commande ",[47,3164,2862],{}," ne vous dit pas tout.",[17,3167,3168,3169,57],{},"En fait, elle ne montre ",[21,3170,3171],{},"que les conteneurs qui sont actuellement en cours d'exécution",[17,3173,3174],{},"Mais que se passe-t-il si votre conteneur a planté au démarrage ? Ou s'il a simplement terminé sa tâche (comme un script d'installation) et s'est arrêté ? Il disparaît de l'écran radar. Pourtant, il n'est pas supprimé : il est toujours là, sur votre machine, dans un état \"dormant\".",[17,3176,3177,3178,3181,3182,393],{},"Pour voir absolument tous vos conteneurs, qu'ils soient en pleine forme ou complètement éteints, on ajoute une petite option magique : le ",[47,3179,3180],{},"-a"," (pour ",[283,3183,3184],{},"all",[17,3186,3187],{},"Bash",[814,3189,3192],{"className":3190,"code":3191,"language":819},[817],"➜  ~ docker ps -a\n",[47,3193,3191],{"__ignoreMap":203},[17,3195,3196,3197,3199],{},"Ce qui vous donnera un tableau similaire à ce qu'on a vu précédemment, mais avec quelques différences notables dans la colonne ",[21,3198,3096],{}," :",[17,3201,3187],{},[814,3203,3206],{"className":3204,"code":3205,"language":819},[817],"CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS                     PORTS     NAMES\nc9bbfccc565d   postgres:18   \"docker-entrypoint.s…\"   5 days ago    Up 2 hours                 5432\u002Ftcp  monolith_database\na1b2c3d4e5f6   ubuntu:22.04  \"bash\"                   10 days ago   Exited (0) 5 days ago                test_ubuntu\nf9e8d7c6b5a4   my_app:v1     \"npm start\"              2 hours ago   Exited (1) 2 hours ago               buggy_app\n",[47,3207,3205],{"__ignoreMap":203},[265,3209,3211],{"id":3210},"décrypter-le-statut-exited","Décrypter le statut \"Exited\"",[17,3213,3214],{},"C'est ici que ça devient super intéressant, notamment pour comprendre ce qui cloche dans votre architecture :",[34,3216,3217,3223],{},[37,3218,3219,3222],{},[21,3220,3221],{},"Exited (0) :"," Tout s'est bien passé ! Le conteneur a fait son travail et s'est arrêté proprement, sans aucune erreur. C'est typiquement le cas d'un conteneur qui devait juste lancer une commande ponctuelle.",[37,3224,3225,3228],{},[21,3226,3227],{},"Exited (1) (ou tout autre chiffre) :"," Aïe. Le processus a rencontré une erreur fatale et a crashé. C'est le signal qu'il va falloir enquêter.",[276,3230,3232],{"title":3231},"Le réflexe du développeur",[17,3233,3234,3235,3238,3239,3241],{},"Si votre application plante, son conteneur s'arrête instantanément. Sans ",[47,3236,3237],{},"docker ps -a",", vous n'auriez aucun moyen de retrouver son ",[21,3240,3060],{}," pour aller lire ses logs et comprendre ce qui a explosé !",[29,3243,3245],{"id":3244},"sortir-la-boîte-noire-lire-les-logs-dun-conteneur","Sortir la boîte noire : lire les logs d'un conteneur",[17,3247,3248,3249,3252,3253,3256],{},"On a vu juste avant que notre conteneur ",[47,3250,3251],{},"buggy_app"," avait crashé lamentablement avec un statut ",[47,3254,3255],{},"Exited (1)",". C'est le quotidien du développeur, pas de panique. Mais comment savoir ce qui s'est passé à l'intérieur de cette boîte isolée avant qu'elle ne rende l'âme ?",[17,3258,3259,3260,57],{},"C'est là qu'intervient la commande salvatrice : ",[47,3261,3262],{},"docker logs",[17,3264,3265,3266,57],{},"Pour l'utiliser, c'est très simple, il suffit de lui donner l'ID du conteneur (ou son nom) que vous avez récupéré grâce à votre ",[47,3267,3237],{},[814,3269,3271],{"className":941,"code":3270,"language":943,"meta":203,"style":203},"➜  ~ docker logs buggy_app\n",[47,3272,3273],{"__ignoreMap":203},[947,3274,3275,3277,3279,3281,3284],{"class":949,"line":226},[947,3276,953],{"class":952},[947,3278,957],{"class":956},[947,3280,998],{"class":956},[947,3282,3283],{"class":956}," logs",[947,3285,3286],{"class":956}," buggy_app\n",[17,3288,3289],{},"Et là, Docker va vous recracher tout ce que l'application a écrit dans le terminal avant de planter. Imaginons par exemple que cette application soit un petit agent de monitoring codé en Go qui essaie de parler à notre base de données :",[814,3291,3295],{"className":3292,"code":3293,"language":3294,"meta":203,"style":203},"language-plaintext shiki shiki-themes material-theme-lighter github-light monokai","2026\u002F07\u002F28 11:55:01 Starting Go monitoring agent...\n2026\u002F07\u002F28 11:55:01 Loading configuration from .env...\n2026\u002F07\u002F28 11:55:02 FATAL: could not connect to PostgreSQL on port 5432: dial tcp 127.0.0.1:5432: connect: connection refused\n","plaintext",[47,3296,3297,3302,3307],{"__ignoreMap":203},[947,3298,3299],{"class":949,"line":226},[947,3300,3301],{},"2026\u002F07\u002F28 11:55:01 Starting Go monitoring agent...\n",[947,3303,3304],{"class":949,"line":204},[947,3305,3306],{},"2026\u002F07\u002F28 11:55:01 Loading configuration from .env...\n",[947,3308,3309],{"class":949,"line":207},[947,3310,3311],{},"2026\u002F07\u002F28 11:55:02 FATAL: could not connect to PostgreSQL on port 5432: dial tcp 127.0.0.1:5432: connect: connection refused\n",[17,3313,3314],{},"Boum ! Le mystère est résolu. L'application a crashé parce qu'elle n'a pas réussi à se connecter à la base de données. Sans cette commande, vous auriez pu chercher l'erreur pendant des heures.",[265,3316,3318],{"id":3317},"les-options-indispensables-pour-ne-pas-devenir-fou","Les options indispensables pour ne pas devenir fou",[17,3320,3321,3322,3324],{},"Si votre conteneur tourne depuis des mois, taper un simple ",[47,3323,3262],{}," risque de vous afficher des milliers de lignes d'un coup et de bloquer votre terminal. Voici les deux options que vous allez utiliser tous les jours :",[34,3326,3327],{},[37,3328,3329,3339,3340,3343,3344],{},[21,3330,3331,3332,385,3335,3338],{},"Le mode \"Direct\" (",[47,3333,3334],{},"-f",[47,3336,3337],{},"--follow",") :"," Exactement comme un ",[47,3341,3342],{},"tail -f"," sous Linux, cette option permet de s'accrocher aux logs en temps réel. Parfait pour regarder ce qui se passe quand vous testez votre API.\nBash\n",[814,3345,3348],{"className":3346,"code":3347,"language":819},[817],"docker logs -f mon_api_laravel\n",[47,3349,3347],{"__ignoreMap":203},[326,3351,3353],{"title":3352},"Info pratique",[17,3354,3355,3356,57],{},"Pour en sortir et reprendre le contrôle du terminal, il suffit de faire un classique ",[47,3357,3358],{},"Ctrl + C",[34,3360,3361],{},[37,3362,3363,3369,3370],{},[21,3364,3365,3366,3338],{},"Le mode \"Juste la fin\" (",[47,3367,3368],{},"--tail"," Si vous voulez juste voir les 50 dernières lignes pour comprendre le dernier bug sans polluer votre écran :\nBash\n",[814,3371,3374],{"className":3372,"code":3373,"language":819},[817],"docker logs --tail 50 mon_api_laravel\n",[47,3375,3373],{"__ignoreMap":203},[276,3377,3379],{"title":3378},"L'astuce pro",[17,3380,3381,3382,3385],{},"Vous pouvez carrément combiner les deux ! ",[47,3383,3384],{},"docker logs -f --tail 20 mon_conteneur"," va vous afficher les 20 dernières lignes puis restera accroché pour vous montrer la suite en direct. C'est la configuration ultime pour débugger sereinement.",[2837,3387,3388],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .ssona, html code.shiki .ssona{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sYBsF, html code.shiki .sYBsF{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .s_bef, html code.shiki .s_bef{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .sBHfy, html code.shiki .sBHfy{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F92672}",{"title":203,"searchDepth":204,"depth":204,"links":3390},[3391,3392],{"id":3154,"depth":207,"text":3155},{"id":3244,"depth":207,"text":3245},{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-2-lister-les-container",{"title":2854,"description":2845},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-2-lister-les-container","t3wLDckxJGnSkSJIsp2L5UsEo_qqGTkJif3xKC_Ua_s",{"id":3399,"title":3400,"badge":238,"body":3401,"category":238,"date":238,"description":4243,"duration":2846,"extension":221,"image":238,"level":238,"meta":4244,"navigation":225,"order":207,"path":4245,"seo":4246,"stem":4247,"tags":238,"__hash__":4248},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-3-creer-premier-container.md","2.3 Créer notre premier container",{"type":9,"value":3402,"toc":4241},[3403,3406,3409,3423,3428,3431,3898,3903,3907,3913,3916,3949,3952,4161,4167,4170,4176,4180,4187,4232,4238],[17,3404,3405],{},"Bien maintenant que l'on a vue que nos container run ou pas... on vas lancer notre premier container de manière efficace et propre.\nPOur ce faire Docker fournie une image de base pour vérifier que notre installation vas bien et fonctionne parfaitement elle est nommée \"hello-world\".",[17,3407,3408],{},"Grace a la commande",[814,3410,3412],{"className":941,"code":3411,"language":943,"meta":203,"style":203},"docker run hello-world\n",[47,3413,3414],{"__ignoreMap":203},[947,3415,3416,3418,3420],{"class":949,"line":226},[947,3417,877],{"class":952},[947,3419,1171],{"class":956},[947,3421,3422],{"class":956}," hello-world\n",[326,3424,3425],{},[17,3426,3427],{},"Pas de panic docker s automatiquement télécharger l'image depuis le registre si besoin et de manière transparente ou presque.",[17,3429,3430],{},"Une fois la commande lancer vous devriez avoir ceci sur le Terminal :",[814,3432,3434],{"className":941,"code":3433,"language":943,"meta":203,"style":203},"**➜**  **~** docker run hello-world\n\nHello from Docker!\n\nThis message shows that your installation appears to be working correctly.\n\n\n\nTo generate this message, Docker took the following steps:\n\n 1. The Docker client contacted the Docker daemon.\n\n 2. The Docker daemon pulled the \"hello-world\" image from the Docker Hub.\n\n    (arm64v8)\n\n 3. The Docker daemon created a new container from that image which runs the\n\n    executable that produces the output you are currently reading.\n\n 4. The Docker daemon streamed that output to the Docker client, which sent it\n\n    to your terminal.\n\n\nTo try something more ambitious, you can run an Ubuntu container with:\n\n $ docker run -it ubuntu bash\n\n\n\nShare images, automate workflows, and more with a free Docker ID:\n\n https:\u002F\u002Fhub.docker.com\u002F\n\n\n\nFor more examples and ideas, visit:\n\n https:\u002F\u002Fdocs.docker.com\u002Fget-started\u002F\n",[47,3435,3436,3456,3460,3470,3474,3507,3511,3515,3519,3546,3550,3573,3577,3613,3617,3622,3626,3660,3664,3691,3695,3730,3734,3744,3748,3752,3785,3789,3807,3811,3815,3819,3850,3854,3859,3863,3867,3871,3889,3893],{"__ignoreMap":203},[947,3437,3438,3441,3443,3445,3448,3451,3453],{"class":949,"line":226},[947,3439,3440],{"class":1039},"**",[947,3442,953],{"class":1035},[947,3444,3440],{"class":1039},[947,3446,3447],{"class":1039},"  **",[947,3449,3450],{"class":1035},"~",[947,3452,3440],{"class":1039},[947,3454,3455],{"class":1035}," docker run hello-world\n",[947,3457,3458],{"class":949,"line":204},[947,3459,973],{"emptyLinePlaceholder":225},[947,3461,3462,3465,3467],{"class":949,"line":207},[947,3463,3464],{"class":952},"Hello",[947,3466,1183],{"class":956},[947,3468,3469],{"class":956}," Docker!\n",[947,3471,3472],{"class":949,"line":976},[947,3473,973],{"emptyLinePlaceholder":225},[947,3475,3476,3479,3482,3485,3488,3490,3493,3496,3498,3501,3504],{"class":949,"line":1004},[947,3477,3478],{"class":952},"This",[947,3480,3481],{"class":956}," message",[947,3483,3484],{"class":956}," shows",[947,3486,3487],{"class":956}," that",[947,3489,1755],{"class":956},[947,3491,3492],{"class":956}," installation",[947,3494,3495],{"class":956}," appears",[947,3497,1307],{"class":956},[947,3499,3500],{"class":956}," be",[947,3502,3503],{"class":956}," working",[947,3505,3506],{"class":956}," correctly.\n",[947,3508,3509],{"class":949,"line":1107},[947,3510,973],{"emptyLinePlaceholder":225},[947,3512,3513],{"class":949,"line":1112},[947,3514,973],{"emptyLinePlaceholder":225},[947,3516,3517],{"class":949,"line":1130},[947,3518,973],{"emptyLinePlaceholder":225},[947,3520,3521,3524,3527,3530,3533,3535,3538,3540,3543],{"class":949,"line":1135},[947,3522,3523],{"class":952},"To",[947,3525,3526],{"class":956}," generate",[947,3528,3529],{"class":956}," this",[947,3531,3532],{"class":956}," message,",[947,3534,1388],{"class":956},[947,3536,3537],{"class":956}," took",[947,3539,1412],{"class":956},[947,3541,3542],{"class":956}," following",[947,3544,3545],{"class":956}," steps:\n",[947,3547,3548],{"class":949,"line":1140},[947,3549,973],{"emptyLinePlaceholder":225},[947,3551,3552,3555,3558,3560,3563,3566,3568,3570],{"class":949,"line":1145},[947,3553,3554],{"class":952}," 1.",[947,3556,3557],{"class":956}," The",[947,3559,1388],{"class":956},[947,3561,3562],{"class":956}," client",[947,3564,3565],{"class":956}," contacted",[947,3567,1412],{"class":956},[947,3569,1388],{"class":956},[947,3571,3572],{"class":956}," daemon.\n",[947,3574,3575],{"class":949,"line":1154},[947,3576,973],{"emptyLinePlaceholder":225},[947,3578,3579,3582,3584,3586,3589,3592,3594,3597,3600,3602,3604,3606,3608,3610],{"class":949,"line":1159},[947,3580,3581],{"class":952}," 2.",[947,3583,3557],{"class":956},[947,3585,1388],{"class":956},[947,3587,3588],{"class":956}," daemon",[947,3590,3591],{"class":956}," pulled",[947,3593,1412],{"class":956},[947,3595,3596],{"class":2174}," \"",[947,3598,3599],{"class":956},"hello-world",[947,3601,3013],{"class":2174},[947,3603,1254],{"class":956},[947,3605,1183],{"class":956},[947,3607,1412],{"class":956},[947,3609,1388],{"class":956},[947,3611,3612],{"class":956}," Hub.\n",[947,3614,3615],{"class":949,"line":1192},[947,3616,973],{"emptyLinePlaceholder":225},[947,3618,3619],{"class":949,"line":1197},[947,3620,3621],{"class":1035},"    (arm64v8)\n",[947,3623,3624],{"class":949,"line":1222},[947,3625,973],{"emptyLinePlaceholder":225},[947,3627,3628,3631,3633,3635,3637,3640,3642,3644,3646,3648,3650,3652,3654,3657],{"class":949,"line":1227},[947,3629,3630],{"class":952}," 3.",[947,3632,3557],{"class":956},[947,3634,1388],{"class":956},[947,3636,3588],{"class":956},[947,3638,3639],{"class":956}," created",[947,3641,1174],{"class":956},[947,3643,1177],{"class":956},[947,3645,1180],{"class":956},[947,3647,1183],{"class":956},[947,3649,3487],{"class":956},[947,3651,1254],{"class":956},[947,3653,960],{"class":956},[947,3655,3656],{"class":956}," runs",[947,3658,3659],{"class":956}," the\n",[947,3661,3662],{"class":949,"line":1238},[947,3663,973],{"emptyLinePlaceholder":225},[947,3665,3666,3669,3671,3674,3676,3679,3682,3685,3688],{"class":949,"line":1243},[947,3667,3668],{"class":956},"    executable",[947,3670,3487],{"class":956},[947,3672,3673],{"class":956}," produces",[947,3675,1412],{"class":956},[947,3677,3678],{"class":956}," output",[947,3680,3681],{"class":956}," you",[947,3683,3684],{"class":956}," are",[947,3686,3687],{"class":956}," currently",[947,3689,3690],{"class":956}," reading.\n",[947,3692,3693],{"class":949,"line":1264},[947,3694,973],{"emptyLinePlaceholder":225},[947,3696,3697,3700,3702,3704,3706,3709,3711,3713,3715,3717,3719,3722,3724,3727],{"class":949,"line":1269},[947,3698,3699],{"class":952}," 4.",[947,3701,3557],{"class":956},[947,3703,1388],{"class":956},[947,3705,3588],{"class":956},[947,3707,3708],{"class":956}," streamed",[947,3710,3487],{"class":956},[947,3712,3678],{"class":956},[947,3714,1307],{"class":956},[947,3716,1412],{"class":956},[947,3718,1388],{"class":956},[947,3720,3721],{"class":956}," client,",[947,3723,960],{"class":956},[947,3725,3726],{"class":956}," sent",[947,3728,3729],{"class":956}," it\n",[947,3731,3732],{"class":949,"line":1289},[947,3733,973],{"emptyLinePlaceholder":225},[947,3735,3736,3739,3741],{"class":949,"line":1294},[947,3737,3738],{"class":956},"    to",[947,3740,1755],{"class":956},[947,3742,3743],{"class":956}," terminal.\n",[947,3745,3746],{"class":949,"line":1314},[947,3747,973],{"emptyLinePlaceholder":225},[947,3749,3750],{"class":949,"line":1319},[947,3751,973],{"emptyLinePlaceholder":225},[947,3753,3754,3756,3759,3762,3765,3768,3770,3773,3775,3777,3780,3782],{"class":949,"line":1331},[947,3755,3523],{"class":952},[947,3757,3758],{"class":956}," try",[947,3760,3761],{"class":956}," something",[947,3763,3764],{"class":956}," more",[947,3766,3767],{"class":956}," ambitious,",[947,3769,3681],{"class":956},[947,3771,3772],{"class":956}," can",[947,3774,1171],{"class":956},[947,3776,1186],{"class":956},[947,3778,3779],{"class":956}," Ubuntu",[947,3781,1180],{"class":956},[947,3783,3784],{"class":956}," with:\n",[947,3786,3787],{"class":949,"line":1336},[947,3788,973],{"emptyLinePlaceholder":225},[947,3790,3791,3794,3796,3798,3801,3804],{"class":949,"line":1351},[947,3792,3793],{"class":952}," $",[947,3795,998],{"class":956},[947,3797,1171],{"class":956},[947,3799,3800],{"class":986}," -it",[947,3802,3803],{"class":956}," ubuntu",[947,3805,3806],{"class":956}," bash\n",[947,3808,3809],{"class":949,"line":1356},[947,3810,973],{"emptyLinePlaceholder":225},[947,3812,3813],{"class":949,"line":1374},[947,3814,973],{"emptyLinePlaceholder":225},[947,3816,3817],{"class":949,"line":1379},[947,3818,973],{"emptyLinePlaceholder":225},[947,3820,3821,3824,3827,3830,3833,3835,3837,3840,3842,3845,3847],{"class":949,"line":1398},[947,3822,3823],{"class":952},"Share",[947,3825,3826],{"class":956}," images,",[947,3828,3829],{"class":956}," automate",[947,3831,3832],{"class":956}," workflows,",[947,3834,1168],{"class":956},[947,3836,3764],{"class":956},[947,3838,3839],{"class":956}," with",[947,3841,1174],{"class":956},[947,3843,3844],{"class":956}," free",[947,3846,1388],{"class":956},[947,3848,3849],{"class":956}," ID:\n",[947,3851,3852],{"class":949,"line":1403},[947,3853,973],{"emptyLinePlaceholder":225},[947,3855,3856],{"class":949,"line":1423},[947,3857,3858],{"class":952}," https:\u002F\u002Fhub.docker.com\u002F\n",[947,3860,3861],{"class":949,"line":1428},[947,3862,973],{"emptyLinePlaceholder":225},[947,3864,3865],{"class":949,"line":1442},[947,3866,973],{"emptyLinePlaceholder":225},[947,3868,3869],{"class":949,"line":1447},[947,3870,973],{"emptyLinePlaceholder":225},[947,3872,3873,3876,3878,3881,3883,3886],{"class":949,"line":1452},[947,3874,3875],{"class":952},"For",[947,3877,3764],{"class":956},[947,3879,3880],{"class":956}," examples",[947,3882,1168],{"class":956},[947,3884,3885],{"class":956}," ideas,",[947,3887,3888],{"class":956}," visit:\n",[947,3890,3891],{"class":949,"line":1457},[947,3892,973],{"emptyLinePlaceholder":225},[947,3894,3895],{"class":949,"line":1465},[947,3896,3897],{"class":952}," https:\u002F\u002Fdocs.docker.com\u002Fget-started\u002F\n",[326,3899,3900],{},[17,3901,3902],{},"On vois qu'il nous dit que tout a l'air correct et qu'on peut lancer ubuntu si on est ambitieux avec des commandes un peut spécial.",[265,3904,3906],{"id":3905},"un-vrai-cas-dusage-lancer-un-serveur-web","Un vrai cas d'usage : lancer un serveur Web",[17,3908,3909,3910,3912],{},"Le ",[47,3911,3599],{},", c'est mignon maintenant on va lancer un serveur web Nginx fonctionnel en une seule ligne de commande.",[17,3914,3915],{},"Tapez ceci (attention aux espaces) :",[814,3917,3919],{"className":941,"code":3918,"language":943,"meta":203,"style":203},"➜  ~ docker run -d -p 8080:80 --name mon_premier_site nginx\n",[47,3920,3921],{"__ignoreMap":203},[947,3922,3923,3925,3927,3929,3931,3934,3937,3940,3943,3946],{"class":949,"line":226},[947,3924,953],{"class":952},[947,3926,957],{"class":956},[947,3928,998],{"class":956},[947,3930,1171],{"class":956},[947,3932,3933],{"class":986}," -d",[947,3935,3936],{"class":986}," -p",[947,3938,3939],{"class":956}," 8080:80",[947,3941,3942],{"class":986}," --name",[947,3944,3945],{"class":956}," mon_premier_site",[947,3947,3948],{"class":956}," nginx\n",[17,3950,3951],{},"Laissez Docker télécharger l'image si elle n'est pas sur votre repository local.",[814,3953,3955],{"className":941,"code":3954,"language":943,"meta":203,"style":203}," **~** docker run -d -p 8080:80 --name mon_premier_site nginx \n\nUnable to find image 'nginx:latest' locally\n\nlatest: Pulling from library\u002Fnginx\n\n59f54fbcd984: Already exists \n\n54c3b3bebc0a: Pull complete \n\n9b1a2f3b8553: Pull complete \n\n627a5a63361a: Pull complete \n\n4cca0d328dc5: Pull complete \n\n94f27359a4c8: Pull complete \n\n9f270a0f328f: Pull complete \n\nDigest: sha256:5a88c9c45479443d7be2eadc894b4ed0a9801bae03d97a5760ae13b5c2005942\n\nStatus: Downloaded newer image for nginx:latest\n\n7fb193e996196a74e59c4e818a5bf4f1e0183b8eabac402ae9732a07a25b8dc4\n\n",[47,3956,3957,3979,3983,4006,4010,4023,4027,4038,4042,4053,4057,4066,4070,4079,4083,4092,4096,4105,4109,4118,4122,4130,4134,4152,4156],{"__ignoreMap":203},[947,3958,3959,3962,3964,3966,3968,3970,3972,3974,3976],{"class":949,"line":226},[947,3960,3961],{"class":952}," **~**",[947,3963,998],{"class":956},[947,3965,1171],{"class":956},[947,3967,3933],{"class":986},[947,3969,3936],{"class":986},[947,3971,3939],{"class":956},[947,3973,3942],{"class":986},[947,3975,3945],{"class":956},[947,3977,3978],{"class":956}," nginx \n",[947,3980,3981],{"class":949,"line":204},[947,3982,973],{"emptyLinePlaceholder":225},[947,3984,3985,3988,3990,3993,3995,3998,4001,4003],{"class":949,"line":207},[947,3986,3987],{"class":952},"Unable",[947,3989,1307],{"class":956},[947,3991,3992],{"class":956}," find",[947,3994,1254],{"class":956},[947,3996,3997],{"class":2174}," '",[947,3999,4000],{"class":956},"nginx:latest",[947,4002,2175],{"class":2174},[947,4004,4005],{"class":956}," locally\n",[947,4007,4008],{"class":949,"line":976},[947,4009,973],{"emptyLinePlaceholder":225},[947,4011,4012,4015,4018,4020],{"class":949,"line":1004},[947,4013,4014],{"class":952},"latest:",[947,4016,4017],{"class":956}," Pulling",[947,4019,1183],{"class":956},[947,4021,4022],{"class":956}," library\u002Fnginx\n",[947,4024,4025],{"class":949,"line":1107},[947,4026,973],{"emptyLinePlaceholder":225},[947,4028,4029,4032,4035],{"class":949,"line":1112},[947,4030,4031],{"class":952},"59f54fbcd984:",[947,4033,4034],{"class":956}," Already",[947,4036,4037],{"class":956}," exists \n",[947,4039,4040],{"class":949,"line":1130},[947,4041,973],{"emptyLinePlaceholder":225},[947,4043,4044,4047,4050],{"class":949,"line":1135},[947,4045,4046],{"class":952},"54c3b3bebc0a:",[947,4048,4049],{"class":956}," Pull",[947,4051,4052],{"class":956}," complete \n",[947,4054,4055],{"class":949,"line":1140},[947,4056,973],{"emptyLinePlaceholder":225},[947,4058,4059,4062,4064],{"class":949,"line":1145},[947,4060,4061],{"class":952},"9b1a2f3b8553:",[947,4063,4049],{"class":956},[947,4065,4052],{"class":956},[947,4067,4068],{"class":949,"line":1154},[947,4069,973],{"emptyLinePlaceholder":225},[947,4071,4072,4075,4077],{"class":949,"line":1159},[947,4073,4074],{"class":952},"627a5a63361a:",[947,4076,4049],{"class":956},[947,4078,4052],{"class":956},[947,4080,4081],{"class":949,"line":1192},[947,4082,973],{"emptyLinePlaceholder":225},[947,4084,4085,4088,4090],{"class":949,"line":1197},[947,4086,4087],{"class":952},"4cca0d328dc5:",[947,4089,4049],{"class":956},[947,4091,4052],{"class":956},[947,4093,4094],{"class":949,"line":1222},[947,4095,973],{"emptyLinePlaceholder":225},[947,4097,4098,4101,4103],{"class":949,"line":1227},[947,4099,4100],{"class":952},"94f27359a4c8:",[947,4102,4049],{"class":956},[947,4104,4052],{"class":956},[947,4106,4107],{"class":949,"line":1238},[947,4108,973],{"emptyLinePlaceholder":225},[947,4110,4111,4114,4116],{"class":949,"line":1243},[947,4112,4113],{"class":952},"9f270a0f328f:",[947,4115,4049],{"class":956},[947,4117,4052],{"class":956},[947,4119,4120],{"class":949,"line":1264},[947,4121,973],{"emptyLinePlaceholder":225},[947,4123,4124,4127],{"class":949,"line":1269},[947,4125,4126],{"class":952},"Digest:",[947,4128,4129],{"class":956}," sha256:5a88c9c45479443d7be2eadc894b4ed0a9801bae03d97a5760ae13b5c2005942\n",[947,4131,4132],{"class":949,"line":1289},[947,4133,973],{"emptyLinePlaceholder":225},[947,4135,4136,4139,4142,4145,4147,4149],{"class":949,"line":1294},[947,4137,4138],{"class":952},"Status:",[947,4140,4141],{"class":956}," Downloaded",[947,4143,4144],{"class":956}," newer",[947,4146,1254],{"class":956},[947,4148,1124],{"class":956},[947,4150,4151],{"class":956}," nginx:latest\n",[947,4153,4154],{"class":949,"line":1314},[947,4155,973],{"emptyLinePlaceholder":225},[947,4157,4158],{"class":949,"line":1319},[947,4159,4160],{"class":952},"7fb193e996196a74e59c4e818a5bf4f1e0183b8eabac402ae9732a07a25b8dc4\n",[17,4162,4163,4164,57],{},"Une fois qu'il vous rend la main avec une longue suite de lettres et de chiffres (l'ID complet du conteneur), ouvrez votre navigateur et tapez : ",[47,4165,4166],{},"http:\u002F\u002Flocalhost:8080",[17,4168,4169],{},"**Et voila votre page NGINX **",[17,4171,4172],{},[854,4173],{"alt":4174,"src":4175},"nginx_local","\u002Fcourses\u002Fdocker\u002Fnginx_local.png",[265,4177,4179],{"id":4178},"décryptage-de-la-commande-magique","Décryptage de la commande magique",[17,4181,4182,4183,4186],{},"Pourquoi a-t-on rajouté toutes ces lettres bizarres ? Voici les 3 options (",[47,4184,4185],{},"flags",") que vous allez utiliser en permanence :",[34,4188,4189,4198,4215],{},[37,4190,4191,491,4194,4197],{},[47,4192,4193],{},"-d",[21,4195,4196],{},"Detach",") : Demande à Docker de lancer le conteneur en arrière-plan. Sans ça, votre terminal serait bloqué sur les logs de Nginx, et si vous fermiez le terminal, le site s'éteindrait.",[37,4199,4200,491,4203,4206,4207,4210,4211,4214],{},[47,4201,4202],{},"-p 8080:80",[21,4204,4205],{},"Publish",") : On en a parlé tout à l'heure ! On branche le port ",[47,4208,4209],{},"8080"," de notre ordinateur vers le port ",[47,4212,4213],{},"80"," du conteneur (le port par défaut d'un serveur web).",[37,4216,4217,4220,4221,385,4224,4227,4228,4231],{},[47,4218,4219],{},"--name mon_premier_site"," : Par défaut, Docker donne des noms générés aléatoirement assez drôles (genre ",[47,4222,4223],{},"sleepy_einstein",[47,4225,4226],{},"crazy_hopper","). C'est marrant 5 minutes, mais pour s'y retrouver, c'est l'enfer. Avec ",[47,4229,4230],{},"--name",", on lui donne un nom clair pour le manipuler plus tard.",[276,4233,4235],{"title":4234},"Félicitations",[17,4236,4237],{},"Félicitations, vous venez de déployer votre premier véritable service isolé !",[2837,4239,4240],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBHfy, html code.shiki .sBHfy{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F92672}html pre.shiki code .s_bef, html code.shiki .s_bef{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .ssona, html code.shiki .ssona{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}",{"title":203,"searchDepth":204,"depth":204,"links":4242},[],"Apprendre à créer et lancer des conteneurs Docker efficacement.",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-3-creer-premier-container",{"title":3400,"description":4243},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-3-creer-premier-container","ulyRsXPQ5i7LlrjT4g7aHA-_nQWJnTzddiu-6G2vU58",{"id":4250,"title":4251,"badge":238,"body":4252,"category":238,"date":238,"description":4900,"duration":2846,"extension":221,"image":238,"level":238,"meta":4901,"navigation":225,"order":976,"path":4902,"seo":4903,"stem":4904,"tags":238,"__hash__":4905},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-4-rentrer-dans-un-container.md","2.4 Rentrer dans la matrice d'un container",{"type":9,"value":4253,"toc":4897},[4254,4258,4261,4270,4274,4281,4284,4368,4374,4536,4548,4552,4558,4578,4604,4622,4637,4641,4646,4707,4712,4715,4734,4737,4743,4746,4769,4775,4798,4809,4834,4856,4882,4894],[29,4255,4257],{"id":4256},"rentrer-dans-la-matrice-la-commande-docker-exec","Rentrer dans la matrice : la commande docker exec",[17,4259,4260],{},"Une fois que votre conteneur tourne, vous aurez souvent besoin d'interagir avec lui : vérifier qu'un fichier a bien été créé, lire le contenu d'un dossier de logs, ou tout simplement lancer un script à l'intérieur.",[17,4262,4263,4264,4266,4267,57],{},"Pour ça, il existe une commande reine : ",[47,4265,107],{},". Elle permet tout simplement d'exécuter une commande à l'intérieur d'un conteneur spécifique qui est ",[21,4268,4269],{},"déjà en cours d'exécution",[265,4271,4273],{"id":4272},"_1-lancer-une-commande-unique-le-one-shot","1. Lancer une commande unique (le \"One-shot\")",[17,4275,4276,4277,4280],{},"Imaginez que vous vouliez juste lister les fichiers à la racine de votre serveur Nginx. Vous pouvez envoyer la commande ",[47,4278,4279],{},"ls -l"," directement au conteneur.",[17,4282,4283],{},"Voyons ce que ça donne avec notre Nginx. D'abord, on liste nos conteneurs pour récupérer l'ID :",[814,4285,4287],{"className":941,"code":4286,"language":943,"meta":203,"style":203},"➜  ~ docker ps\nCONTAINER ID   IMAGE   COMMAND                  CREATED       STATUS       PORTS                                     NAMES\n7fb193e99619   nginx   \"\u002Fdocker-entrypoint.…\"   2 hours ago   Up 2 hours   0.0.0.0:8080->80\u002Ftcp, [::]:8080->80\u002Ftcp   mon_premier_site\n",[47,4288,4289,4299,4321],{"__ignoreMap":203},[947,4290,4291,4293,4295,4297],{"class":949,"line":226},[947,4292,953],{"class":952},[947,4294,957],{"class":956},[947,4296,998],{"class":956},[947,4298,2882],{"class":956},[947,4300,4301,4303,4305,4307,4310,4312,4315,4318],{"class":949,"line":204},[947,4302,2887],{"class":952},[947,4304,2890],{"class":956},[947,4306,2893],{"class":956},[947,4308,4309],{"class":956},"   COMMAND",[947,4311,2987],{"class":956},[947,4313,4314],{"class":956},"       STATUS",[947,4316,4317],{"class":956},"       PORTS",[947,4319,4320],{"class":956},"                                     NAMES\n",[947,4322,4323,4326,4329,4331,4334,4336,4339,4342,4344,4346,4348,4350,4353,4355,4357,4360,4363,4365],{"class":949,"line":207},[947,4324,4325],{"class":952},"7fb193e99619",[947,4327,4328],{"class":956},"   nginx",[947,4330,3007],{"class":2174},[947,4332,4333],{"class":956},"\u002Fdocker-entrypoint.…",[947,4335,3013],{"class":2174},[947,4337,4338],{"class":1010},"   2",[947,4340,4341],{"class":956}," hours",[947,4343,3022],{"class":956},[947,4345,3025],{"class":956},[947,4347,3028],{"class":1010},[947,4349,4341],{"class":956},[947,4351,4352],{"class":956},"   0.0.0.0:8080",[947,4354,3037],{"class":1035},[947,4356,1040],{"class":1039},[947,4358,4359],{"class":956},"80\u002Ftcp,",[947,4361,4362],{"class":1035}," [::]:8080-",[947,4364,1040],{"class":1039},[947,4366,4367],{"class":1035},"80\u002Ftcp   mon_premier_site\n",[17,4369,4370,4371,4373],{},"Maintenant, on envoie notre commande ",[47,4372,4279],{}," à ce conteneur précis :",[814,4375,4377],{"className":941,"code":4376,"language":943,"meta":203,"style":203},"➜  ~ docker exec 7fb193e99619 ls -l\ntotal 64\nlrwxrwxrwx   1 root root    7 Jul  4 09:05 bin -> usr\u002Fbin\ndrwxr-xr-x   2 root root 4096 Jul  4 09:05 boot\ndrwxr-xr-x   5 root root  340 Jul 28 10:12 dev\ndrwxr-xr-x   1 root root 4096 Jul 28 10:12 etc\ndrwxr-xr-x   2 root root 4096 Jul  4 09:05 home\n# ... (le reste des dossiers système s'affiche) ...\n",[47,4378,4379,4398,4406,4441,4464,4488,4509,4530],{"__ignoreMap":203},[947,4380,4381,4383,4385,4387,4390,4393,4395],{"class":949,"line":226},[947,4382,953],{"class":952},[947,4384,957],{"class":956},[947,4386,998],{"class":956},[947,4388,4389],{"class":956}," exec",[947,4391,4392],{"class":956}," 7fb193e99619",[947,4394,983],{"class":956},[947,4396,4397],{"class":986}," -l\n",[947,4399,4400,4403],{"class":949,"line":204},[947,4401,4402],{"class":952},"total",[947,4404,4405],{"class":1010}," 64\n",[947,4407,4408,4411,4414,4417,4419,4422,4425,4428,4431,4434,4436,4438],{"class":949,"line":207},[947,4409,4410],{"class":952},"lrwxrwxrwx",[947,4412,4413],{"class":1010},"   1",[947,4415,4416],{"class":956}," root",[947,4418,4416],{"class":956},[947,4420,4421],{"class":1010},"    7",[947,4423,4424],{"class":956}," Jul",[947,4426,4427],{"class":1010},"  4",[947,4429,4430],{"class":956}," 09:05",[947,4432,4433],{"class":956}," bin",[947,4435,1036],{"class":1035},[947,4437,1040],{"class":1039},[947,4439,4440],{"class":956}," usr\u002Fbin\n",[947,4442,4443,4446,4448,4450,4452,4455,4457,4459,4461],{"class":949,"line":976},[947,4444,4445],{"class":952},"drwxr-xr-x",[947,4447,4338],{"class":1010},[947,4449,4416],{"class":956},[947,4451,4416],{"class":956},[947,4453,4454],{"class":1010}," 4096",[947,4456,4424],{"class":956},[947,4458,4427],{"class":1010},[947,4460,4430],{"class":956},[947,4462,4463],{"class":956}," boot\n",[947,4465,4466,4468,4470,4472,4474,4477,4479,4482,4485],{"class":949,"line":1004},[947,4467,4445],{"class":952},[947,4469,3016],{"class":1010},[947,4471,4416],{"class":956},[947,4473,4416],{"class":956},[947,4475,4476],{"class":1010},"  340",[947,4478,4424],{"class":956},[947,4480,4481],{"class":1010}," 28",[947,4483,4484],{"class":956}," 10:12",[947,4486,4487],{"class":956}," dev\n",[947,4489,4490,4492,4494,4496,4498,4500,4502,4504,4506],{"class":949,"line":1107},[947,4491,4445],{"class":952},[947,4493,4413],{"class":1010},[947,4495,4416],{"class":956},[947,4497,4416],{"class":956},[947,4499,4454],{"class":1010},[947,4501,4424],{"class":956},[947,4503,4481],{"class":1010},[947,4505,4484],{"class":956},[947,4507,4508],{"class":956}," etc\n",[947,4510,4511,4513,4515,4517,4519,4521,4523,4525,4527],{"class":949,"line":1112},[947,4512,4445],{"class":952},[947,4514,4338],{"class":1010},[947,4516,4416],{"class":956},[947,4518,4416],{"class":956},[947,4520,4454],{"class":1010},[947,4522,4424],{"class":956},[947,4524,4427],{"class":1010},[947,4526,4430],{"class":956},[947,4528,4529],{"class":956}," home\n",[947,4531,4532],{"class":949,"line":1130},[947,4533,4535],{"class":4534},"skxtS","# ... (le reste des dossiers système s'affiche) ...\n",[326,4537,4539],{"title":4538},"Que s'est-il passé ?",[17,4540,4541,4542,4544,4545,4547],{},"Docker a ciblé le conteneur (",[47,4543,4325],{},"), s'y est infiltré une fraction de seconde pour exécuter ",[47,4546,4279],{},", nous a renvoyé le résultat dans notre terminal, puis est ressorti. Efficace et rapide !",[265,4549,4551],{"id":4550},"_2-garder-la-porte-ouverte-le-mode-interactif","2. Garder la porte ouverte : le mode interactif",[17,4553,4554,4555,4557],{},"C'est très pratique pour une seule commande, mais si on veut fouiller un peu plus, taper ",[47,4556,107],{}," à chaque fois devient vite lourd.",[17,4559,4560,4561,4564,4565,4568,4569,4572,4573,1063,4575,393],{},"On peut aller beaucoup plus loin en utilisant le flag ",[47,4562,4563],{},"-it"," (qui signifie ",[21,4566,4567],{},"I","nteractif + allocation d'un ",[21,4570,4571],{},"T","TY). Ce flag permet de créer un \"tunnel\" maintenu ouvert entre notre terminal et le conteneur. On va l'associer à l'ouverture d'un interpréteur de commandes, comme ",[47,4574,943],{},[47,4576,4577],{},"sh",[814,4579,4581],{"className":941,"code":4580,"language":943,"meta":203,"style":203},"➜  ~ docker exec -it 7fb193e99619 bash\nroot@7fb193e99619:\u002F#\n",[47,4582,4583,4599],{"__ignoreMap":203},[947,4584,4585,4587,4589,4591,4593,4595,4597],{"class":949,"line":226},[947,4586,953],{"class":952},[947,4588,957],{"class":956},[947,4590,998],{"class":956},[947,4592,4389],{"class":956},[947,4594,3800],{"class":986},[947,4596,4392],{"class":956},[947,4598,3806],{"class":956},[947,4600,4601],{"class":949,"line":204},[947,4602,4603],{"class":952},"root@7fb193e99619:\u002F#\n",[326,4605,4607],{"title":4606},"Observez bien ce qui a changé",[17,4608,4609,4610,4613,4614,4617,4618,4621],{},"Votre invite de commande (le prompt) n'est plus la même. Vous êtes passé de ",[47,4611,4612],{},"➜ ~"," à ",[47,4615,4616],{},"root@7fb193e99619:\u002F#",". Cela signifie que vous êtes littéralement connecté en direct à l'intérieur de votre conteneur, avec les droits ",[47,4619,4620],{},"root"," (administrateur). C'est exactement comme si vous étiez connecté en SSH sur un serveur distant !",[17,4623,4624,4625,4627,4628,4627,4630,4632,4633,4636],{},"Vous pouvez taper toutes vos commandes (",[47,4626,500],{},", ",[47,4629,490],{},[47,4631,542],{},") de manière successive. Une fois que vous avez fini votre investigation, il suffit de taper ",[47,4634,4635],{},"exit"," pour quitter le conteneur et revenir à votre PC.",[265,4638,4640],{"id":4639},"_3-les-options-utiles-pour-aller-plus-loin","3. Les options utiles pour aller plus loin",[17,4642,4643,4644,3199],{},"Il existe plusieurs options super intéressantes pour chaîner les comportements avec ",[47,4645,107],{},[34,4647,4648,4655,4669,4681,4689,4698],{},[37,4649,4650,4654],{},[21,4651,4652],{},[47,4653,4563],{}," : Lance le terminal en mode interactif.",[37,4656,4657,4663,4664,4666,4667,57],{},[21,4658,4659,385,4661],{},[47,4660,943],{},[47,4662,4577],{}," : C'est le programme qu'on lance à l'intérieur. Attention, les images très légères (comme Alpine Linux) n'ont pas ",[47,4665,943],{}," installé. Dans ce cas, on utilise toujours ",[47,4668,4577],{},[37,4670,4671,4677,4678,4680],{},[21,4672,4673,4676],{},[47,4674,4675],{},"-u"," (User)"," : Permet de choisir un utilisateur spécifique au lieu du compte ",[47,4679,4620],{},". C'est une excellente pratique de sécurité pour tester les droits d'un dossier par exemple.",[37,4682,4683,4688],{},[21,4684,4685,4687],{},[47,4686,4193],{}," (Detach)"," : Exécute une commande en arrière-plan sans bloquer votre terminal (utile pour lancer un script de nettoyage silencieux dans le conteneur).",[37,4690,4691,4697],{},[21,4692,4693,4696],{},[47,4694,4695],{},"-w"," (Workdir)"," : Permet de spécifier dans quel dossier la commande doit s'exécuter.",[37,4699,4700,4706],{},[21,4701,4702,4705],{},[47,4703,4704],{},"-e"," (Env)"," : Permet de passer une variable d'environnement temporaire juste pour cette commande.",[17,4708,4709],{},[21,4710,4711],{},"Quelques exemples concrets pour la route :",[17,4713,4714],{},"Ouvrir un shell sur une image légère (qui n'a pas bash) :",[814,4716,4718],{"className":941,"code":4717,"language":943,"meta":203,"style":203},"docker exec -it mon_container sh\n",[47,4719,4720],{"__ignoreMap":203},[947,4721,4722,4724,4726,4728,4731],{"class":949,"line":226},[947,4723,877],{"class":952},[947,4725,4389],{"class":956},[947,4727,3800],{"class":986},[947,4729,4730],{"class":956}," mon_container",[947,4732,4733],{"class":956}," sh\n",[17,4735,4736],{},"Lancer un script en tâche de fond, sans bloquer le terminal :",[814,4738,4741],{"className":4739,"code":4740,"language":819},[817],"docker exec -d mon_container python script_de_fond.py\n",[47,4742,4740],{"__ignoreMap":203},[17,4744,4745],{},"Se connecter en tant qu'utilisateur \"debian\" pour des raisons de sécurité :",[814,4747,4749],{"className":941,"code":4748,"language":943,"meta":203,"style":203},"docker exec -u debian -it mon_container bash\n",[47,4750,4751],{"__ignoreMap":203},[947,4752,4753,4755,4757,4760,4763,4765,4767],{"class":949,"line":226},[947,4754,877],{"class":952},[947,4756,4389],{"class":956},[947,4758,4759],{"class":986}," -u",[947,4761,4762],{"class":956}," debian",[947,4764,3800],{"class":986},[947,4766,4730],{"class":956},[947,4768,3806],{"class":956},[17,4770,4771,4772,3338],{},"Exécuter une commande directement dans un dossier spécifique (ici ",[47,4773,4774],{},"\u002Fapp",[814,4776,4778],{"className":941,"code":4777,"language":943,"meta":203,"style":203},"docker exec -w \u002Fapp mon_container ls -l\n",[47,4779,4780],{"__ignoreMap":203},[947,4781,4782,4784,4786,4789,4792,4794,4796],{"class":949,"line":226},[947,4783,877],{"class":952},[947,4785,4389],{"class":956},[947,4787,4788],{"class":986}," -w",[947,4790,4791],{"class":956}," \u002Fapp",[947,4793,4730],{"class":956},[947,4795,983],{"class":956},[947,4797,4397],{"class":986},[17,4799,4800,4801,4804,4805,4808],{},"Ici, le script Python aura accès à la variable ",[47,4802,4803],{},"APP_ENV"," avec la valeur ",[47,4806,4807],{},"development"," uniquement le temps de son exécution.",[814,4810,4812],{"className":941,"code":4811,"language":943,"meta":203,"style":203},"docker exec -e APP_ENV=development mon_container python script.py\n",[47,4813,4814],{"__ignoreMap":203},[947,4815,4816,4818,4820,4823,4826,4828,4831],{"class":949,"line":226},[947,4817,877],{"class":952},[947,4819,4389],{"class":956},[947,4821,4822],{"class":986}," -e",[947,4824,4825],{"class":956}," APP_ENV=development",[947,4827,4730],{"class":956},[947,4829,4830],{"class":956}," python",[947,4832,4833],{"class":956}," script.py\n",[326,4835,4836,4853],{},[17,4837,4838,4839,4842,4843,4845,4846,4849,4850,57],{},"Même si on peut l'utiliser avec ",[47,4840,4841],{},"exec",", dans la vraie vie, tu vas utiliser le flag ",[47,4844,4704],{}," à 90 % du temps quand on ",[21,4847,4848],{},"crées"," ton conteneur avec ",[47,4851,4852],{},"docker run",[17,4854,4855],{},"C'est d'ailleurs obligatoire pour des images comme MySQL qui exigent un mot de passe administrateur pour démarrer :",[814,4857,4859],{"className":941,"code":4858,"language":943,"meta":203,"style":203},"docker run -d -e MYSQL_ROOT_PASSWORD=mon_super_mot_de_passe --name ma_base_de_donnees mysql:8.0\n",[47,4860,4861],{"__ignoreMap":203},[947,4862,4863,4865,4867,4869,4871,4874,4876,4879],{"class":949,"line":226},[947,4864,877],{"class":952},[947,4866,1171],{"class":956},[947,4868,3933],{"class":986},[947,4870,4822],{"class":986},[947,4872,4873],{"class":956}," MYSQL_ROOT_PASSWORD=mon_super_mot_de_passe",[947,4875,3942],{"class":986},[947,4877,4878],{"class":956}," ma_base_de_donnees",[947,4880,4881],{"class":956}," mysql:8.0\n",[276,4883,4885],{"title":4884},"L'astuce",[17,4886,4887,4888,4890,4891],{},"Tu peux mettre autant de flags ",[47,4889,4704],{}," que tu veux dans une seule commande si tu as plusieurs variables à passer : ",[47,4892,4893],{},"docker run -e USER=dylan -e ROLE=admin -e THEME=dark mon_image",[2837,4895,4896],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .ssona, html code.shiki .ssona{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sYBsF, html code.shiki .sYBsF{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .s_bef, html code.shiki .s_bef{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .sBHfy, html code.shiki .sBHfy{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F92672}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .skxtS, html code.shiki .skxtS{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#88846F;--shiki-dark-font-style:inherit}",{"title":203,"searchDepth":204,"depth":204,"links":4898},[4899],{"id":4256,"depth":207,"text":4257},"Apprendre à interagir avec un conteneur en cours d'exécution.",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-4-rentrer-dans-un-container",{"title":4251,"description":4900},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-4-rentrer-dans-un-container","RfeF49yG1ZAu1Cu3SD9j72evcxMjyN9LsZX4au3KJcs",{"id":4907,"title":4908,"badge":238,"body":4909,"category":238,"date":238,"description":5105,"duration":334,"extension":221,"image":238,"level":238,"meta":5106,"navigation":225,"order":1004,"path":5107,"seo":5108,"stem":5109,"tags":238,"__hash__":5110},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-5-on-off-container.md","2.5 Gérer le bouton On\u002FOff (Start, Stop & Restart)",{"type":9,"value":4910,"toc":5102},[4911,4915,4918,4921,4928,4934,4952,4967,4974,4980,4998,5001,5011,5018,5021,5023,5029,5038,5041,5059,5067,5079,5081,5087,5099],[29,4912,4914],{"id":4913},"gérer-le-bouton-onoff-start-stop-pause-destroy","Gérer le bouton On\u002FOff : Start, Stop, Pause & Destroy",[17,4916,4917],{},"Ce qui est génial avec Docker, c'est que toutes vos applications peuvent tourner de manière claire et isolée sur notre machine. Mais justement, empiler les conteneurs en tâche de fond, c'est le meilleur moyen de grignoter toute notre RAM et de faire ramer notre PC !",[17,4919,4920],{},"Il est donc crucial de veiller à éteindre les bonnes applications au bon moment et de les relancer uniquement quand c'est nécessaire. Pour cela, Docker offre des commandes extrêmement simples.",[265,4922,4924,4925],{"id":4923},"_1-éteindre-proprement-docker-stop","1. Éteindre proprement : ",[47,4926,4927],{},"docker stop",[17,4929,4930,4931,4933],{},"Quand nous avons fini de travailler sur un projet, il faut éteindre le conteneur. La commande ",[47,4932,4927],{}," envoie un signal au conteneur pour lui dire de s'arrêter proprement (il sauvegarde ses états en cours et ferme ses processus sans violence).",[814,4935,4937],{"className":941,"code":4936,"language":943,"meta":203,"style":203},"➜  ~ docker stop nginx\n",[47,4938,4939],{"__ignoreMap":203},[947,4940,4941,4943,4945,4947,4950],{"class":949,"line":226},[947,4942,953],{"class":952},[947,4944,957],{"class":956},[947,4946,998],{"class":956},[947,4948,4949],{"class":956}," stop",[947,4951,3948],{"class":956},[17,4953,4954],{},[283,4955,4956,4957,4960,4961,4964,4965,393],{},"Le conteneur s'arrête, libère la mémoire vive (RAM) de votre PC, mais ",[21,4958,4959],{},"il n'est pas supprimé",". Il passe juste en statut ",[47,4962,4963],{},"Exited"," (visible avec un ",[47,4966,3237],{},[265,4968,4970,4971],{"id":4969},"_2-relancer-la-machine-docker-start","2. Relancer la machine : ",[47,4972,4973],{},"docker start",[17,4975,4976,4977,4979],{},"Le lendemain matin, nous reprenons notre travail. Pas besoin de refaire un ",[47,4978,4852],{}," compliqué avec tous les ports et les variables d'environnement ! Le conteneur existe déjà, il dort. Il suffit de le réveiller :",[814,4981,4983],{"className":941,"code":4982,"language":943,"meta":203,"style":203},"➜  ~ docker start nginx\n",[47,4984,4985],{"__ignoreMap":203},[947,4986,4987,4989,4991,4993,4996],{"class":949,"line":226},[947,4988,953],{"class":952},[947,4990,957],{"class":956},[947,4992,998],{"class":956},[947,4994,4995],{"class":956}," start",[947,4997,3948],{"class":956},[17,4999,5000],{},"Hop, le conteneur repart avec exactement la même configuration que la veille.",[276,5002,5004],{"title":5003},"Le joker : docker restart",[17,5005,5006,5007,5010],{},"Si votre application bug ou que vous venez de changer un fichier de configuration majeur, vous pouvez redémarrer le conteneur d'un seul coup avec ",[47,5008,5009],{},"docker restart mon_premier_site",". C'est l'équivalent du fameux \"Avez-vous essayé de redémarrer la box ?\".",[265,5012,5014,5015],{"id":5013},"_3-geler-le-temps-docker-pause","3. Geler le temps : ",[47,5016,5017],{},"docker pause",[17,5019,5020],{},"Celle-ci est moins connue mais très pratique. Imaginez que vous ayez besoin de 100% de la puissance de votre processeur (CPU) pendant 5 minutes, mais que vous ne voulez pas éteindre votre conteneur Docker. Vous pouvez le \"mettre sur pause\".",[17,5022,3187],{},[814,5024,5027],{"className":5025,"code":5026,"language":819},[817],"➜  ~ docker pause nginx\n",[47,5028,5026],{"__ignoreMap":203},[17,5030,5031],{},[283,5032,5033,5034,5037],{},"Le conteneur est \"gelé\". Il reste en RAM, mais il ne consomme plus ",[21,5035,5036],{},"aucune"," ressource processeur.",[17,5039,5040],{},"Pour le dégeler et reprendre exactement là où il en était :",[814,5042,5044],{"className":941,"code":5043,"language":943,"meta":203,"style":203},"➜  ~ docker unpause nginx\n",[47,5045,5046],{"__ignoreMap":203},[947,5047,5048,5050,5052,5054,5057],{"class":949,"line":226},[947,5049,953],{"class":952},[947,5051,957],{"class":956},[947,5053,998],{"class":956},[947,5055,5056],{"class":956}," unpause",[947,5058,3948],{"class":956},[265,5060,5062,5063,5066],{"id":5061},"_4-la-destruction-finale-docker-rm-destroy","4. La destruction finale : ",[47,5064,5065],{},"docker rm"," (Destroy)",[17,5068,5069,5070,5072,5073,3181,5076,393],{},"Un conteneur arrêté avec ",[47,5071,4927],{}," ne consomme plus de RAM, mais il prend toujours de la place sur votre disque dur. Si vous n'en avez plus du tout besoin, il faut le détruire définitivement avec ",[47,5074,5075],{},"rm",[283,5077,5078],{},"remove",[17,5080,3187],{},[814,5082,5085],{"className":5083,"code":5084,"language":819},[817],"➜  ~ docker rm nginx\n",[47,5086,5084],{"__ignoreMap":203},[372,5088,5090],{"title":5089},"Attention",[17,5091,5092,5093,5096,5097,57],{},"Docker refuse par défaut de détruire un conteneur qui est en cours d'exécution. Vous devez d'abord le ",[47,5094,5095],{},"stop",", puis le ",[47,5098,5075],{},[2837,5100,5101],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":203,"searchDepth":204,"depth":204,"links":5103},[5104],{"id":4913,"depth":207,"text":4914},"Gérer le cycle de vie d'un conteneur.",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-5-on-off-container",{"title":4908,"description":5105},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-5-on-off-container","mslwEH8iKGb__lS7qxhJmNJvER0BffL_5ou-EZk3LIE",{"id":5112,"title":5113,"badge":238,"body":5114,"category":238,"date":238,"description":5301,"duration":334,"extension":221,"image":238,"level":238,"meta":5302,"navigation":225,"order":1107,"path":5303,"seo":5304,"stem":5305,"tags":238,"__hash__":5306},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-6-le-nettoyage.md","2.6 Nettoyer un peut notre bazaar et libérer de l'espace",{"type":9,"value":5115,"toc":5299},[5116,5119,5122,5129,5135,5138,5153,5156,5165,5184,5195,5202,5205,5224,5227,5241,5253,5257,5264,5285,5291,5296],[17,5117,5118],{},"Docker est un outil incroyable, mais il a un léger défaut : c'est un accumulateur compulsif. Si vous ne faites pas attention, entre les anciens conteneurs arrêtés et les dizaines d'images téléchargées pour des tests, Docker va discrètement engloutir des dizaines de gigaoctets sur votre disque dur.",[17,5120,5121],{},"Il est temps de sortir le balai et d'apprendre à faire le ménage.",[265,5123,5125,5126],{"id":5124},"_1-supprimer-les-images-docker-rmi","1. Supprimer les images : ",[47,5127,5128],{},"docker rmi",[17,5130,5131,5132,5134],{},"On a vu comment supprimer un conteneur avec ",[47,5133,5065],{},". Mais rappelez-vous : le conteneur n'est que le résultat final (le gâteau). Ce qui pèse vraiment lourd, c'est l'image de base qui a servi à le créer (le moule).",[17,5136,5137],{},"Pour voir toutes les images stockées sur votre PC, tapez :",[814,5139,5141],{"className":941,"code":5140,"language":943,"meta":203,"style":203},"➜  ~ docker images\n",[47,5142,5143],{"__ignoreMap":203},[947,5144,5145,5147,5149,5151],{"class":949,"line":226},[947,5146,953],{"class":952},[947,5148,957],{"class":956},[947,5150,998],{"class":956},[947,5152,1328],{"class":956},[17,5154,5155],{},"Vous verrez une liste avec le poids de chaque image (certaines bases de données ou frameworks peuvent peser plus d'un gigaoctet !).",[17,5157,5158,5159,3181,5161,5164],{},"Pour supprimer une image dont vous n'avez plus besoin, on utilise ",[47,5160,5128],{},[283,5162,5163],{},"Remove Image",") suivi du nom de l'image ou de son ID :",[814,5166,5168],{"className":941,"code":5167,"language":943,"meta":203,"style":203},"➜  ~ docker rmi postgres:18\n",[47,5169,5170],{"__ignoreMap":203},[947,5171,5172,5174,5176,5178,5181],{"class":949,"line":226},[947,5173,953],{"class":952},[947,5175,957],{"class":956},[947,5177,998],{"class":956},[947,5179,5180],{"class":956}," rmi",[947,5182,5183],{"class":956}," postgres:18\n",[372,5185,5187],{"title":5186},"Petite sécurité de Docker",[17,5188,5189,5190,5192,5193,393],{},"Il refusera catégoriquement de supprimer une image si un conteneur (même arrêté) l'utilise encore. Il faut d'abord détruire le conteneur (",[47,5191,5065],{},"), puis l'image (",[47,5194,5128],{},[265,5196,5198,5199],{"id":5197},"_2-larme-de-destruction-massive-docker-system-prune","2. L'arme de destruction massive : ",[47,5200,5201],{},"docker system prune",[17,5203,5204],{},"Supprimer les éléments un par un à la main, c'est bien pour comprendre, mais au quotidien on n'a pas le temps pour ça. Heureusement, Docker a prévu la commande ultime de nettoyage :",[814,5206,5208],{"className":941,"code":5207,"language":943,"meta":203,"style":203},"➜  ~ docker system prune\n",[47,5209,5210],{"__ignoreMap":203},[947,5211,5212,5214,5216,5218,5221],{"class":949,"line":226},[947,5213,953],{"class":952},[947,5215,957],{"class":956},[947,5217,998],{"class":956},[947,5219,5220],{"class":956}," system",[947,5222,5223],{"class":956}," prune\n",[17,5225,5226],{},"Quand vous lancez cette commande, Docker va vous demander confirmation, car il s'apprête à faire un grand ménage automatique. Il va supprimer :",[34,5228,5229,5232,5235,5238],{},[37,5230,5231],{},"Tous les conteneurs arrêtés.",[37,5233,5234],{},"Tous les réseaux qui ne sont utilisés par aucun conteneur.",[37,5236,5237],{},"Toutes les images \"dangling\" (ce sont des images fantômes qui n'ont plus de nom ni de tag, souvent créées suite à des erreurs de compilation).",[37,5239,5240],{},"Tout le cache de compilation inutile.",[326,5242,5243],{},[17,5244,5245,5246,5249,5250],{},"C'est une commande totalement ",[283,5247,5248],{},"safe"," : ",[21,5251,5252],{},"elle ne touchera jamais à un conteneur qui est en cours d'exécution.",[265,5254,5256],{"id":5255},"_3-le-nettoyage-extrême","3. Le nettoyage extrême",[17,5258,5259,5260,3181,5262,393],{},"Si votre disque dur est vraiment dans le rouge, vous pouvez ajouter une petite option nucléaire à la commande précédente : le flag ",[47,5261,3180],{},[283,5263,3184],{},[814,5265,5267],{"className":941,"code":5266,"language":943,"meta":203,"style":203},"➜  ~ docker system prune -a\n",[47,5268,5269],{"__ignoreMap":203},[947,5270,5271,5273,5275,5277,5279,5282],{"class":949,"line":226},[947,5272,953],{"class":952},[947,5274,957],{"class":956},[947,5276,998],{"class":956},[947,5278,5220],{"class":956},[947,5280,5281],{"class":956}," prune",[947,5283,5284],{"class":986}," -a\n",[17,5286,5287,5288,57],{},"Là, Docker ne va pas faire dans le détail. En plus de ce qu'on a vu au-dessus, ",[21,5289,5290],{},"il va supprimer absolument TOUTES les images qui ne sont pas actuellement rattachées à un conteneur en cours d'exécution",[372,5292,5293],{},[17,5294,5295],{},"C'est hyper efficace pour retrouver 30 Go d'espace libre d'un coup, mais attention : la prochaine fois que vous voudrez relancer un vieux projet, Docker devra retélécharger toutes les images depuis internet.",[2837,5297,5298],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}",{"title":203,"searchDepth":204,"depth":204,"links":5300},[],"Nettoyer Docker et libérer de l'espace",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-6-le-nettoyage",{"title":5113,"description":5301},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-6-le-nettoyage","xrbidT2_lIuBfzJmaWBqSB5ZV5oZ-2bAe13H_dtK62w",{"id":5308,"title":5309,"badge":238,"body":5310,"category":238,"date":238,"description":5638,"duration":334,"extension":221,"image":238,"level":238,"meta":5639,"navigation":225,"order":1112,"path":5640,"seo":5641,"stem":5642,"tags":238,"__hash__":5643},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-7-image-vs-container.md","2.7 Démystifier les Images vs Conteneurs",{"type":9,"value":5311,"toc":5636},[5312,5323,5326,5340,5344,5354,5357,5363,5464,5467,5471,5476,5497,5504,5508,5511,5514,5540,5557,5562,5628,5633],[17,5313,5314,5315,5318,5319,5322],{},"Faisons une pause rapide sur un sujet crucial. Ce point va mettre en lumière la différence — pas toujours très claire au début — entre un ",[21,5316,5317],{},"conteneur"," et une ",[21,5320,5321],{},"image"," Docker.",[17,5324,5325],{},"Pour faire simple :",[34,5327,5328,5334],{},[37,5329,5330,5333],{},[21,5331,5332],{},"L'image, c'est la recette (ou le moule)."," C'est une description inerte de votre application et de ses dépendances.",[37,5335,5336,5339],{},[21,5337,5338],{},"Le conteneur, c'est le gâteau."," C'est l'application bien vivante qui s'exécute, créée à partir de la recette.",[265,5341,5343],{"id":5342},"_1-limage-docker-le-plan-de-construction","1. L'Image Docker : le plan de construction",[17,5345,5346,5347,5349,5350,5353],{},"Pour dockeriser une application, il faut écrire un fichier nommé ",[47,5348,49],{},". Ce fichier vient décrire toutes les étapes de ",[283,5351,5352],{},"packaging"," de votre application de manière extrêmement factuelle.",[17,5355,5356],{},"En soi, l'image n'est qu'une \"facette non vivante\" de votre application. C'est un assemblage de fichiers qui va donner à Docker toutes les informations nécessaires pour la faire tourner.",[17,5358,5359,5360,5362],{},"Prenons l'exemple d'un ",[47,5361,49],{}," créé spécialement pour une API en Python avec FastAPI :",[814,5364,5368],{"className":5365,"code":5366,"language":5367,"meta":203,"style":203},"language-dockerfile shiki shiki-themes material-theme-lighter github-light monokai","FROM python:3.14\n\nWORKDIR \u002Fcode\n\nCOPY .\u002Frequirements.txt \u002Fcode\u002Frequirements.txt\n\nRUN pip install --no-cache-dir --upgrade -r \u002Fcode\u002Frequirements.txt\n\nCOPY .\u002Fapp \u002Fcode\u002Fapp\n\nCMD [\"fastapi\", \"run\", \"app\u002Fmain.py\", \"--port\", \"80\"]\n","dockerfile",[47,5369,5370,5379,5383,5391,5395,5403,5407,5415,5419,5426,5430],{"__ignoreMap":203},[947,5371,5372,5376],{"class":949,"line":226},[947,5373,5375],{"class":5374},"s4Wmr","FROM",[947,5377,5378],{"class":1035}," python:3.14\n",[947,5380,5381],{"class":949,"line":204},[947,5382,973],{"emptyLinePlaceholder":225},[947,5384,5385,5388],{"class":949,"line":207},[947,5386,5387],{"class":5374},"WORKDIR",[947,5389,5390],{"class":1035}," \u002Fcode\n",[947,5392,5393],{"class":949,"line":976},[947,5394,973],{"emptyLinePlaceholder":225},[947,5396,5397,5400],{"class":949,"line":1004},[947,5398,5399],{"class":5374},"COPY",[947,5401,5402],{"class":1035}," .\u002Frequirements.txt \u002Fcode\u002Frequirements.txt\n",[947,5404,5405],{"class":949,"line":1107},[947,5406,973],{"emptyLinePlaceholder":225},[947,5408,5409,5412],{"class":949,"line":1112},[947,5410,5411],{"class":5374},"RUN",[947,5413,5414],{"class":1035}," pip install --no-cache-dir --upgrade -r \u002Fcode\u002Frequirements.txt\n",[947,5416,5417],{"class":949,"line":1130},[947,5418,973],{"emptyLinePlaceholder":225},[947,5420,5421,5423],{"class":949,"line":1135},[947,5422,5399],{"class":5374},[947,5424,5425],{"class":1035}," .\u002Fapp \u002Fcode\u002Fapp\n",[947,5427,5428],{"class":949,"line":1140},[947,5429,973],{"emptyLinePlaceholder":225},[947,5431,5432,5435,5438,5441,5443,5446,5448,5451,5453,5456,5458,5461],{"class":949,"line":1145},[947,5433,5434],{"class":5374},"CMD",[947,5436,5437],{"class":1035}," [",[947,5439,5440],{"class":956},"\"fastapi\"",[947,5442,4627],{"class":1035},[947,5444,5445],{"class":956},"\"run\"",[947,5447,4627],{"class":1035},[947,5449,5450],{"class":956},"\"app\u002Fmain.py\"",[947,5452,4627],{"class":1035},[947,5454,5455],{"class":956},"\"--port\"",[947,5457,4627],{"class":1035},[947,5459,5460],{"class":956},"\"80\"",[947,5462,5463],{"class":1035},"]\n",[17,5465,5466],{},"On voit clairement que chaque ligne donne une instruction précise à Docker pour assembler notre future boîte.",[265,5468,5470],{"id":5469},"_2-de-limage-au-conteneur-la-compilation","2. De l'Image au Conteneur : la compilation",[17,5472,5473,5474,3199],{},"Une fois notre fichier prêt, nous allons demander à Docker de lire ces instructions et de générer l'image. On utilise pour cela la commande de ",[283,5475,416],{},[814,5477,5479],{"className":941,"code":5478,"language":943,"meta":203,"style":203},"docker build -t myimage .\n",[47,5480,5481],{"__ignoreMap":203},[947,5482,5483,5485,5488,5491,5494],{"class":949,"line":226},[947,5484,877],{"class":952},[947,5486,5487],{"class":956}," build",[947,5489,5490],{"class":986}," -t",[947,5492,5493],{"class":956}," myimage",[947,5495,5496],{"class":956}," .\n",[326,5498,5499],{},[17,5500,5501],{},[283,5502,5503],{},"(Cette commande crée notre image et on lui donne le tag \"myimage\").",[265,5505,5507],{"id":5506},"_3-le-conteneur-lapplication-en-vie","3. Le Conteneur : l'application en vie",[17,5509,5510],{},"Maintenant que notre image est prête, on peut enfin créer notre conteneur. Le conteneur, c'est l'environnement isolé (la \"boîte\") qui embarque tout ce qui a été demandé dans l'image et qui exécute le code.",[17,5512,5513],{},"On le lance avec les paramètres requis :",[814,5515,5517],{"className":941,"code":5516,"language":943,"meta":203,"style":203},"docker run -d --name mycontainer -p 80:80 myimage\n",[47,5518,5519],{"__ignoreMap":203},[947,5520,5521,5523,5525,5527,5529,5532,5534,5537],{"class":949,"line":226},[947,5522,877],{"class":952},[947,5524,1171],{"class":956},[947,5526,3933],{"class":986},[947,5528,3942],{"class":986},[947,5530,5531],{"class":956}," mycontainer",[947,5533,3936],{"class":986},[947,5535,5536],{"class":956}," 80:80",[947,5538,5539],{"class":956}," myimage\n",[326,5541,5542],{},[17,5543,5544],{},[283,5545,5546,5547,5549,5550,5552,5553,5556],{},"(On reconnaît au passage les flags qu'on a vus précédemment : ",[47,5548,4193],{}," pour lancer en arrière-plan, ",[47,5551,4230],{}," pour nommer le conteneur, et ",[47,5554,5555],{},"-p"," pour rediriger les ports).",[17,5558,5559,5560,3199],{},"C'est à ce moment précis que notre application prend vie. On peut d'ailleurs voir notre nouveau conteneur en action grâce à notre fameux ",[47,5561,2862],{},[814,5563,5565],{"className":941,"code":5564,"language":943,"meta":203,"style":203},"CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                NAMES\nc9bbfccc565d   myimage   \"fastapi run app\u002Fma…\"   10 seconds ago   Up 9 seconds   0.0.0.0:80->80\u002Ftcp   mycontainer\n",[47,5566,5567,5587],{"__ignoreMap":203},[947,5568,5569,5571,5573,5575,5577,5579,5582,5584],{"class":949,"line":226},[947,5570,2887],{"class":952},[947,5572,2890],{"class":956},[947,5574,2893],{"class":956},[947,5576,2896],{"class":956},[947,5578,2987],{"class":956},[947,5580,5581],{"class":956},"          STATUS",[947,5583,2993],{"class":956},[947,5585,5586],{"class":956},"                NAMES\n",[947,5588,5589,5591,5594,5596,5599,5601,5604,5606,5608,5610,5613,5615,5618,5620,5622,5625],{"class":949,"line":204},[947,5590,3001],{"class":952},[947,5592,5593],{"class":956},"   myimage",[947,5595,3007],{"class":2174},[947,5597,5598],{"class":956},"fastapi run app\u002Fma…",[947,5600,3013],{"class":2174},[947,5602,5603],{"class":1010},"   10",[947,5605,3031],{"class":956},[947,5607,3022],{"class":956},[947,5609,3025],{"class":956},[947,5611,5612],{"class":1010}," 9",[947,5614,3031],{"class":956},[947,5616,5617],{"class":956},"   0.0.0.0:80",[947,5619,3037],{"class":1035},[947,5621,1040],{"class":1039},[947,5623,5624],{"class":956},"80\u002Ftcp",[947,5626,5627],{"class":956},"   mycontainer\n",[276,5629,5630],{"title":328},[17,5631,5632],{},"L'image est une suite d'instructions données à Docker pour créer le conteneur. Et le conteneur, c'est votre application enfermée dans sa boîte, prête à servir vos utilisateurs !",[2837,5634,5635],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .ssona, html code.shiki .ssona{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sYBsF, html code.shiki .sYBsF{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .s_bef, html code.shiki .s_bef{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .sBHfy, html code.shiki .sBHfy{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F92672}html pre.shiki code .s4Wmr, html code.shiki .s4Wmr{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F92672}",{"title":203,"searchDepth":204,"depth":204,"links":5637},[],"Comprendre la différence entre une image et un conteneur Docker.",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-7-image-vs-container",{"title":5309,"description":5638},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-7-image-vs-container","dT4D2LVIZQC09-1o18SgxNepjXXMPG4tVDAhOhJIloM",{"id":5645,"title":5646,"badge":238,"body":5647,"category":238,"date":238,"description":6330,"duration":6331,"extension":221,"image":238,"level":238,"meta":6332,"navigation":225,"order":1130,"path":6333,"seo":6334,"stem":6335,"tags":238,"__hash__":6336},"courses\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-8-liste-commande-bonus.md","2.8 Le Cheat Sheet Ultime : liste exhaustive (ou presque) des commandes",{"type":9,"value":5648,"toc":6328},[5649,5653,5659,5735,5741,5821,5825,5831,5958,5967,6002,6006,6012,6110,6114,6120,6144,6150,6205,6211,6260,6266,6325],[265,5650,5652],{"id":5651},"_1-observer-et-monitorer","1. Observer et Monitorer",[17,5654,5655],{},[21,5656,5657],{},[47,5658,2862],{},[34,5660,5661,5667,5691],{},[37,5662,5663,5666],{},[21,5664,5665],{},"À quoi ça sert :"," Lister les conteneurs sur votre machine.",[37,5668,5669,5672],{},[21,5670,5671],{},"Flags utiles :",[34,5673,5674,5682],{},[37,5675,5676,491,5678,5681],{},[47,5677,3180],{},[47,5679,5680],{},"--all",") : Affiche TOUS les conteneurs (même ceux qui sont arrêtés ou qui ont crashé).",[37,5683,5684,491,5687,5690],{},[47,5685,5686],{},"-q",[47,5688,5689],{},"--quiet",") : N'affiche que les IDs des conteneurs (super pratique pour scripter).",[37,5692,5693,5696],{},[21,5694,5695],{},"Exemples :",[814,5697,5699],{"className":941,"code":5698,"language":943,"meta":203,"style":203},"docker ps          # Liste les conteneurs en cours d'exécution\ndocker ps -a       # Liste absolument tout\ndocker ps -aq      # Renvoie juste une liste d'IDs\n",[47,5700,5701,5711,5723],{"__ignoreMap":203},[947,5702,5703,5705,5708],{"class":949,"line":226},[947,5704,877],{"class":952},[947,5706,5707],{"class":956}," ps",[947,5709,5710],{"class":4534},"          # Liste les conteneurs en cours d'exécution\n",[947,5712,5713,5715,5717,5720],{"class":949,"line":204},[947,5714,877],{"class":952},[947,5716,5707],{"class":956},[947,5718,5719],{"class":986}," -a",[947,5721,5722],{"class":4534},"       # Liste absolument tout\n",[947,5724,5725,5727,5729,5732],{"class":949,"line":207},[947,5726,877],{"class":952},[947,5728,5707],{"class":956},[947,5730,5731],{"class":986}," -aq",[947,5733,5734],{"class":4534},"      # Renvoie juste une liste d'IDs\n",[17,5736,5737],{},[21,5738,5739],{},[47,5740,3262],{},[34,5742,5743,5748,5767],{},[37,5744,5745,5747],{},[21,5746,5665],{}," Lire les journaux (logs) d'un conteneur pour débugger.",[37,5749,5750,5752],{},[21,5751,5671],{},[34,5753,5754,5761],{},[37,5755,5756,491,5758,5760],{},[47,5757,3334],{},[47,5759,3337],{},") : Reste accroché aux logs en temps réel (comme un direct à la télé).",[37,5762,5763,5766],{},[47,5764,5765],{},"--tail [nombre]"," : N'affiche que les X dernières lignes.",[37,5768,5769,5771],{},[21,5770,5695],{},[814,5772,5774],{"className":941,"code":5773,"language":943,"meta":203,"style":203},"docker logs mon_api                  # Affiche tout l'historique\ndocker logs -f mon_api               # Affiche les logs en direct\ndocker logs --tail 50 -f mon_api     # Affiche les 50 dernières lignes puis passe en direct\n",[47,5775,5776,5788,5802],{"__ignoreMap":203},[947,5777,5778,5780,5782,5785],{"class":949,"line":226},[947,5779,877],{"class":952},[947,5781,3283],{"class":956},[947,5783,5784],{"class":956}," mon_api",[947,5786,5787],{"class":4534},"                  # Affiche tout l'historique\n",[947,5789,5790,5792,5794,5797,5799],{"class":949,"line":204},[947,5791,877],{"class":952},[947,5793,3283],{"class":956},[947,5795,5796],{"class":986}," -f",[947,5798,5784],{"class":956},[947,5800,5801],{"class":4534},"               # Affiche les logs en direct\n",[947,5803,5804,5806,5808,5811,5814,5816,5818],{"class":949,"line":207},[947,5805,877],{"class":952},[947,5807,3283],{"class":956},[947,5809,5810],{"class":986}," --tail",[947,5812,5813],{"class":1010}," 50",[947,5815,5796],{"class":986},[947,5817,5784],{"class":956},[947,5819,5820],{"class":4534},"     # Affiche les 50 dernières lignes puis passe en direct\n",[265,5822,5824],{"id":5823},"_2-créer-et-démarrer","2. Créer et Démarrer",[17,5826,5827],{},[21,5828,5829],{},[47,5830,4852],{},[34,5832,5833,5838,5891],{},[37,5834,5835,5837],{},[21,5836,5665],{}," C'est LA commande reine. Elle télécharge l'image (si besoin), crée le conteneur et le démarre dans la foulée.",[37,5839,5840,5842],{},[21,5841,5671],{},[34,5843,5844,5852,5863,5868,5876,5885],{},[37,5845,5846,491,5848,5851],{},[47,5847,4193],{},[47,5849,5850],{},"--detach",") : Lance le conteneur en arrière-plan (libère votre terminal).",[37,5853,5854,491,5856,5859,5860,393],{},[47,5855,5555],{},[47,5857,5858],{},"--publish",") : Fait le pont entre un port de votre PC et un port du conteneur (",[47,5861,5862],{},"HOTE:CONTENEUR",[37,5864,5865,5867],{},[47,5866,4230],{}," : Donne un nom lisible à votre conteneur.",[37,5869,5870,491,5872,5875],{},[47,5871,4704],{},[47,5873,5874],{},"--env",") : Injecte une variable d'environnement.",[37,5877,5878,491,5881,5884],{},[47,5879,5880],{},"-v",[47,5882,5883],{},"--volume",") : Lie un dossier de votre PC à un dossier du conteneur (pour sauvegarder les données).",[37,5886,5887,5890],{},[47,5888,5889],{},"--rm"," : Détruit automatiquement le conteneur dès qu'il s'arrête (parfait pour les tests jetables).",[37,5892,5893,5895],{},[21,5894,5695],{},[814,5896,5898],{"className":941,"code":5897,"language":943,"meta":203,"style":203},"docker run -d --name mon_site -p 8080:80 nginx\ndocker run -d -e MYSQL_ROOT_PASSWORD=secret --name ma_bdd mysql:8.0\ndocker run --rm -it ubuntu bash      # Conteneur jetable pour faire un test rapide\n",[47,5899,5900,5919,5939],{"__ignoreMap":203},[947,5901,5902,5904,5906,5908,5910,5913,5915,5917],{"class":949,"line":226},[947,5903,877],{"class":952},[947,5905,1171],{"class":956},[947,5907,3933],{"class":986},[947,5909,3942],{"class":986},[947,5911,5912],{"class":956}," mon_site",[947,5914,3936],{"class":986},[947,5916,3939],{"class":956},[947,5918,3948],{"class":956},[947,5920,5921,5923,5925,5927,5929,5932,5934,5937],{"class":949,"line":204},[947,5922,877],{"class":952},[947,5924,1171],{"class":956},[947,5926,3933],{"class":986},[947,5928,4822],{"class":986},[947,5930,5931],{"class":956}," MYSQL_ROOT_PASSWORD=secret",[947,5933,3942],{"class":986},[947,5935,5936],{"class":956}," ma_bdd",[947,5938,4881],{"class":956},[947,5940,5941,5943,5945,5948,5950,5952,5955],{"class":949,"line":207},[947,5942,877],{"class":952},[947,5944,1171],{"class":956},[947,5946,5947],{"class":986}," --rm",[947,5949,3800],{"class":986},[947,5951,3803],{"class":956},[947,5953,5954],{"class":956}," bash",[947,5956,5957],{"class":4534},"      # Conteneur jetable pour faire un test rapide\n",[17,5959,5960],{},[21,5961,5962,564,5964],{},[47,5963,4973],{},[47,5965,5966],{},"docker restart",[34,5968,5969,5974],{},[37,5970,5971,5973],{},[21,5972,5665],{}," Démarrer un conteneur qui était arrêté (sans le recréer), ou redémarrer un conteneur qui tourne déjà.",[37,5975,5976,5978],{},[21,5977,5695],{},[814,5979,5981],{"className":941,"code":5980,"language":943,"meta":203,"style":203},"docker start mon_site\ndocker restart ma_bdd\n",[47,5982,5983,5992],{"__ignoreMap":203},[947,5984,5985,5987,5989],{"class":949,"line":226},[947,5986,877],{"class":952},[947,5988,4995],{"class":956},[947,5990,5991],{"class":956}," mon_site\n",[947,5993,5994,5996,5999],{"class":949,"line":204},[947,5995,877],{"class":952},[947,5997,5998],{"class":956}," restart",[947,6000,6001],{"class":956}," ma_bdd\n",[265,6003,6005],{"id":6004},"_3-interagir-rentrer-dans-la-matrice","3. Interagir (Rentrer dans la matrice)",[17,6007,6008],{},[21,6009,6010],{},[47,6011,107],{},[34,6013,6014,6021,6048],{},[37,6015,6016,6018,6019,57],{},[21,6017,5665],{}," Exécuter une commande à l'intérieur d'un conteneur qui est ",[283,6020,4269],{},[37,6022,6023,6025],{},[21,6024,5671],{},[34,6026,6027,6032,6040],{},[37,6028,6029,6031],{},[47,6030,4563],{}," : Ouvre un terminal interactif (le combo indispensable pour rentrer dans le conteneur).",[37,6033,6034,491,6036,6039],{},[47,6035,4675],{},[47,6037,6038],{},"--user",") : Précise avec quel utilisateur on veut se connecter.",[37,6041,6042,491,6044,6047],{},[47,6043,4695],{},[47,6045,6046],{},"--workdir",") : Définit le dossier de départ de la commande.",[37,6049,6050,6052],{},[21,6051,5695],{},[814,6053,6055],{"className":941,"code":6054,"language":943,"meta":203,"style":203},"docker exec -it mon_site bash              # Rentre dans le conteneur\ndocker exec mon_site ls -l \u002Fvar\u002Fwww\u002Fhtml   # Lance une commande et ressort direct\ndocker exec -u root -it mon_site sh        # Rentre en tant qu'administrateur\n",[47,6056,6057,6072,6090],{"__ignoreMap":203},[947,6058,6059,6061,6063,6065,6067,6069],{"class":949,"line":226},[947,6060,877],{"class":952},[947,6062,4389],{"class":956},[947,6064,3800],{"class":986},[947,6066,5912],{"class":956},[947,6068,5954],{"class":956},[947,6070,6071],{"class":4534},"              # Rentre dans le conteneur\n",[947,6073,6074,6076,6078,6080,6082,6084,6087],{"class":949,"line":204},[947,6075,877],{"class":952},[947,6077,4389],{"class":956},[947,6079,5912],{"class":956},[947,6081,983],{"class":956},[947,6083,987],{"class":986},[947,6085,6086],{"class":956}," \u002Fvar\u002Fwww\u002Fhtml",[947,6088,6089],{"class":4534},"   # Lance une commande et ressort direct\n",[947,6091,6092,6094,6096,6098,6100,6102,6104,6107],{"class":949,"line":207},[947,6093,877],{"class":952},[947,6095,4389],{"class":956},[947,6097,4759],{"class":986},[947,6099,4416],{"class":956},[947,6101,3800],{"class":986},[947,6103,5912],{"class":956},[947,6105,6106],{"class":956}," sh",[947,6108,6109],{"class":4534},"        # Rentre en tant qu'administrateur\n",[265,6111,6113],{"id":6112},"_4-nettoyer-et-détruire-le-grand-ménage","4. Nettoyer et Détruire (Le grand ménage)",[17,6115,6116],{},[21,6117,6118],{},[47,6119,4927],{},[34,6121,6122,6127],{},[37,6123,6124,6126],{},[21,6125,5665],{}," Demande gentiment au conteneur de s'arrêter (sauvegarde ses processus en cours).",[37,6128,6129,6131],{},[21,6130,5695],{},[814,6132,6134],{"className":941,"code":6133,"language":943,"meta":203,"style":203},"docker stop mon_site\n",[47,6135,6136],{"__ignoreMap":203},[947,6137,6138,6140,6142],{"class":949,"line":226},[947,6139,877],{"class":952},[947,6141,4949],{"class":956},[947,6143,5991],{"class":956},[17,6145,6146],{},[21,6147,6148],{},[47,6149,5065],{},[34,6151,6152,6157,6171],{},[37,6153,6154,6156],{},[21,6155,5665],{}," Supprime définitivement un conteneur de votre disque dur.",[37,6158,6159,6161],{},[21,6160,5671],{},[34,6162,6163],{},[37,6164,6165,491,6167,6170],{},[47,6166,3334],{},[47,6168,6169],{},"--force",") : Force la suppression, même si le conteneur est en train de tourner (le mode bourrin).",[37,6172,6173,6175],{},[21,6174,5695],{},[814,6176,6178],{"className":941,"code":6177,"language":943,"meta":203,"style":203},"docker rm mon_site           # Ne marche que si le conteneur est arrêté\ndocker rm -f mon_site        # Arrête et détruit le conteneur d'un coup\n",[47,6179,6180,6192],{"__ignoreMap":203},[947,6181,6182,6184,6187,6189],{"class":949,"line":226},[947,6183,877],{"class":952},[947,6185,6186],{"class":956}," rm",[947,6188,5912],{"class":956},[947,6190,6191],{"class":4534},"           # Ne marche que si le conteneur est arrêté\n",[947,6193,6194,6196,6198,6200,6202],{"class":949,"line":204},[947,6195,877],{"class":952},[947,6197,6186],{"class":956},[947,6199,5796],{"class":986},[947,6201,5912],{"class":956},[947,6203,6204],{"class":4534},"        # Arrête et détruit le conteneur d'un coup\n",[17,6206,6207],{},[21,6208,6209],{},[47,6210,5128],{},[34,6212,6213,6218,6231],{},[37,6214,6215,6217],{},[21,6216,5665],{}," Supprime une image téléchargée (le moule).",[37,6219,6220,6222],{},[21,6221,5671],{},[34,6223,6224],{},[37,6225,6226,491,6228,6230],{},[47,6227,3334],{},[47,6229,6169],{},") : Force la suppression.",[37,6232,6233,6235],{},[21,6234,5695],{},[814,6236,6238],{"className":941,"code":6237,"language":943,"meta":203,"style":203},"docker rmi nginx             # Supprime la version \"latest\" par défaut\ndocker rmi postgres:18\n",[47,6239,6240,6252],{"__ignoreMap":203},[947,6241,6242,6244,6246,6249],{"class":949,"line":226},[947,6243,877],{"class":952},[947,6245,5180],{"class":956},[947,6247,6248],{"class":956}," nginx",[947,6250,6251],{"class":4534},"             # Supprime la version \"latest\" par défaut\n",[947,6253,6254,6256,6258],{"class":949,"line":204},[947,6255,877],{"class":952},[947,6257,5180],{"class":956},[947,6259,5183],{"class":956},[17,6261,6262],{},[21,6263,6264],{},[47,6265,5201],{},[34,6267,6268,6273,6292],{},[37,6269,6270,6272],{},[21,6271,5665],{}," Le bouton magique pour récupérer de l'espace disque. Supprime tout ce qui ne sert plus.",[37,6274,6275,6277],{},[21,6276,5671],{},[34,6278,6279,6286],{},[37,6280,6281,491,6283,6285],{},[47,6282,3180],{},[47,6284,5680],{},") : Supprime TOUTES les images qui ne sont pas actuellement utilisées par un conteneur actif.",[37,6287,6288,6291],{},[47,6289,6290],{},"--volumes"," : Supprime également les volumes de données non rattachés (attention, perte de données !).",[37,6293,6294,6296],{},[21,6295,5695],{},[814,6297,6299],{"className":941,"code":6298,"language":943,"meta":203,"style":203},"docker system prune          # Le nettoyage standard et sûr\ndocker system prune -a       # Le grand nettoyage de printemps (attention au téléchargement après !)\n",[47,6300,6301,6312],{"__ignoreMap":203},[947,6302,6303,6305,6307,6309],{"class":949,"line":226},[947,6304,877],{"class":952},[947,6306,5220],{"class":956},[947,6308,5281],{"class":956},[947,6310,6311],{"class":4534},"          # Le nettoyage standard et sûr\n",[947,6313,6314,6316,6318,6320,6322],{"class":949,"line":204},[947,6315,877],{"class":952},[947,6317,5220],{"class":956},[947,6319,5281],{"class":956},[947,6321,5719],{"class":986},[947,6323,6324],{"class":4534},"       # Le grand nettoyage de printemps (attention au téléchargement après !)\n",[2837,6326,6327],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .skxtS, html code.shiki .skxtS{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#88846F;--shiki-dark-font-style:inherit}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sYBsF, html code.shiki .sYBsF{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#AE81FF}",{"title":203,"searchDepth":204,"depth":204,"links":6329},[],"Voici une liste des commandes les plus utiles à retenir pour bien maîtriser le CLI de Docker.","7m",{},"\u002Fcourses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-8-liste-commande-bonus",{"title":5646,"description":6330},"courses\u002Fdocker\u002Fmodules\u002Fmodule-2-le-cli\u002Flesson-8-liste-commande-bonus","YRjGaUtuq4SV5C370gYiaPZ9NXxgDJDIV_kObQjUyNY",1785319261180]