Docker DevOps
Mémo
1. Docker2. Docker Compose3. Repères de syntaxe4. Volumes, bind mounts et permissions5. Réseaux, DNS et ports6. Moteur ciblé, clients et API7. Repères de sécurité et d’exploitation
TP
TP-01 — Exécuter et observer un premier conteneurTP-02 — Construire et mettre à jour une image webTP-03 — Réduire une image avec une construction multistageTP-04 — Comprendre le cycle de vie d’un conteneurTP-05 — Conserver les données au-delà du conteneurTP-06 — Faire communiquer une application et sa base de donnéesTP-07 — Piloter Docker par son API localeTP-08 — Publier des images dans un registre privé sécuriséTP-09 — Déployer une application et sa base avec ComposeTP-10 — Déployer et dépanner une application complète
Chapitres
1 Architecture Docker, isolation et microservices
1.1 Pourquoi isoler une application ?1.2 Monolithe et microservices1.3 Virtualisation et conteneurisation1.4 Comment Linux isole les conteneurs1.5 Les composants de Docker1.6 Patterns : service principal, sidecar et initialisation1.7 Exemple : une application web et ses services1.7.1 Expliquons ce qui se passe dans notre architecture1.7.2 Les besoins techniques de notre architecture Docker1.8 Ce qu’il faut retenir
2 Installation Docker et environnement de travail
2.1 Pourquoi préparer un environnement Docker ?2.2 Docker Engine : les composants installés2.3 Ubuntu : installation et gestion du service2.4 Droits d’accès : pourquoi le socket Docker est important2.4.1 Le besoin : autoriser le client à piloter le moteur2.4.2 Deux façons courantes de donner cet accès2.4.3 Pourquoi existe-t-il un mode rootless ?2.5 Comprendre le contexte Docker2.5.1 Exemple de contextes disponibles2.5.2 Choisir explicitement un moteur2.6 Bonus — Windows : WSL 2 et Docker Desktop2.6.1 Référence — Docker Engine sur Ubuntu Linux2.6.2 Bonus — Ubuntu sous WSL 2 : utiliser son propre Docker Engine2.6.3 Bonus — Docker Desktop : utiliser son moteur2.7 Vérifier et diagnostiquer son environnement Docker2.7.1 Les vérifications essentielles2.7.2 Si cela ne fonctionne pas : par où commencer ?2.8 Ce qu’il faut retenir
3 Images Docker : structure, construction et registres
3.1 Pourquoi une image Docker ?3.2 Couches, système de fichiers et cache3.2.1 Les couches3.2.2 Pourquoi l’ordre des instructions compte3.3 Dockerfile : décrire la construction3.3.1 Exemple commenté3.3.2 Les directives à reconnaître3.3.3 CMD et ENTRYPOINT : qui démarre quoi ?3.4 Contexte de construction et .dockerignore3.4.1 Pourquoi filtrer le contexte ?3.4.2 Comment utiliser un secret sans l’intégrer à l’image ?3.5 Identifier les images : noms, tags et digests3.5.1 Lire le nom d’une image3.5.2 Versionner avec des tags3.5.3 Pourquoi utiliser un digest ?3.5.4 Tag ou digest ?3.6 Registres publics et registres privés3.7 Optimiser une image avec un build multi-stage3.7.1 Le principe du multi-stage3.7.2 Comment les couches sont-elles créées ?3.7.3 Pourquoi Docker réutilise-t-il certaines couches ?3.7.4 Et dans notre exemple multi-stage ?3.8 Bonnes pratiques et points de vigilance3.9 Ce qu’il faut retenir
4 Cycle de vie des conteneurs
4.1 Pourquoi gérer le cycle de vie d’un conteneur ?4.2 De l’image au conteneur : création et démarrage4.3 Les états d’un conteneur4.3.1 Les états4.3.2 Comprendre pourquoi un conteneur s’arrête4.4 Démarrer, arrêter et redémarrer4.5 Observer : processus, journaux et inspection4.5.1 Les commandes essentielles4.5.2 Comprendre les résultats4.6 Interagir avec un conteneur4.7 Supprimer et recréer : ce qui est conservé4.8 Un scénario complet pour relier les commandes4.9 Ce qu’il faut retenir
5 Ressources Docker : stockage, réseau et configuration
Pourquoi distinguer les ressources d’un conteneur ?5.1 Stockage : volumes Docker et bind mounts5.1.1 Pourquoi la couche écrivable ne suffit pas5.1.2 Deux mécanismes de montage5.1.3 Syntaxe5.1.4 Les volumes : où sont-ils stockés ?5.1.5 Qui accède aux fichiers montés ?5.2 Réseaux Docker : isolation et communication5.2.1 Réseau bridge par défaut et réseaux bridge utilisateur5.2.2 Créer un réseau et connecter les conteneurs5.2.3 Résolution DNS sur un réseau bridge utilisateur5.2.4 Règles de communication et sécurisation5.3 Ports : exposition interne et publication vers l’hôte5.3.1 Comment une application écoute-t-elle dans un conteneur ?5.3.2 Comment deux conteneurs communiquent-ils ?5.3.3 Publier un port sur l’hôte5.3.4 Déclarer un port avec EXPOSE5.3.5 Contrôler l’exposition réseau5.4 Configuration : variables d’environnement et fichiers5.4.1 Variables d’environnement5.4.2 Fichiers de configuration5.4.3 Ne pas confondre configuration et secret5.5 Ressources système : CPU, mémoire et limites5.6 Ce qu’il faut retenir
6. Piloter Docker : CLI, daemon, socket et API
6.1 Qui pilote réellement Docker ?6.2 La CLI Docker6.3 Le daemon Docker (dockerd)6.4 Le socket Docker6.5 L’API REST Docker Engine6.6 Pilotage local et distant6.7 Ce qu’il faut retenir
7. Docker Compose
7.1 Pourquoi Docker Compose ?7.2 Le modèle déclaratif et le projet Compose7.3 La structure d’un fichier compose.yaml7.4 Services, images et construction7.5 Réseaux et communication entre services7.6 Volumes et persistance des données7.7 Configuration, variables et secrets7.8 Dépendances et disponibilité des services7.9 Cycle de vie et portée de Compose7.10 Compose et Kubernetes : deux niveaux différents7.11 Scénario : NGINX, WordPress et MariaDB1. Architecture2. Le fichier de configuration3. Services et communications4. Configuration et données persistantes5. Paramètres et accès aux secrets6. Ordre de démarrage et disponibilité7.12 Ce qu’il faut retenir
8. Clients Docker
8.1 Pourquoi plusieurs clients Docker ?8.2 Client, API et daemon : retrouver la frontièreDu client à l’exécution du conteneur1. Comprendre une demande et sa réponse2. Bind mount : le dossier source se trouve sur l’hôte Docker8.3 Docker Desktop : un environnement de développement intégré8.4 Portainer : administrer depuis une interface web8.5 Le SDK Python : piloter Docker depuis un programme8.6 Choisir le bon outil8.7 Scénario de lecture : une application, plusieurs vues1. Observer le même déploiement2. Comprendre une divergence de vue3. Comprendre une action partagée8.8 Ce qu’il faut retenirQuestions de mémorisation8.9 Documentation de référence
9. Sécurité Docker
Sécuriser une application conteneurisée : quel objectif ?9.1 Identifier les frontières de confiance9.1.1 Définition d’une frontière9.1.2 Frontière de confiance9.1.3 Règle du moindre privilège9.2 Protéger le daemon, le socket et les clients9.2.1 Contrôler les droits d’administration du moteur Docker9.2.2 Accès distant : transport et autorisation9.2.3 Les consoles et la CI/CD font partie du périmètre9.2.4 Comprendre un enchaînement de compromission9.3 Utilisateur non-root, rootless et remappage : trois notions9.3.1 Contexte : quel utilisateur exécute quoi ?9.3.2 Réponse aux problèmes : choisir la protection au bon niveau9.4 Capabilities et acquisition de privilèges9.4.1 Comprendre les capabilities : des pouvoirs séparés9.4.2 Choisir les pouvoirs accordés au conteneur9.4.3 Comprendre un refus avant d’ajouter des privilèges9.4.4 Réponse au problème : accorder uniquement les capabilities nécessaires9.4.5 Exemple : attribuer et lire les capabilities du conteneur web9.5 Seccomp, AppArmor et SELinux : limiter les actions possibles9.5.1 Que sont Seccomp, AppArmor et SELinux ?9.5.2 Quels problèmes ces protections peuvent-elles empêcher ?9.5.3 Comment ces protections se complètent-elles ?9.5.4 Exemples d’attribution de mécanismes de sécurité9.6 Images et chaîne de construction9.6.1 Choisir et identifier l’image9.6.2 Construire sans embarquer l’inutile9.6.3 Vérifier et maintenir9.6.4 Lire un scénario de mise à jour9.7 Registres : confidentialité, authentification et droits9.7.1 Contexte : à quoi sert un registre privé ?9.7.2 Problèmes : un registre privé ne suffit pas à protéger les images9.7.3 Réponses : protéger la connexion et séparer les droits9.8 Secrets et configuration sensible9.8.1 Contexte : reconnaître un secret9.8.2 Problèmes : les secrets peuvent être copiés et exposés9.8.3 Réponses : distribuer le secret au seul service concerné9.8.4 Exemple : limiter l’accès au mot de passe SQL9.9 Réseau : limiter ce qui est joignable9.9.1 Contexte : distinguer accès public et communication entre services9.9.2 Problèmes : ne pas publier un port ne suffit pas à isoler un service9.9.3 Réponses : ouvrir seulement les communications nécessaires9.9.4 Exemple : suivre une requête vers WordPress9.10 Fichiers, volumes et montages : limiter les dégâts9.10.1 Contexte : les montages donnent accès à des données9.10.2 Problèmes : un accès trop large augmente les dégâts possibles9.10.3 Réponses : limiter les chemins, les écritures et les droits9.10.4 Exemple : NGINX lit, MariaDB écrit9.11 Ressources, disponibilité et exploitation9.11.1 Contexte : les conteneurs partagent les ressources de l’hôte9.11.2 Problèmes : une application peut épuiser les ressources communes9.11.3 Réponses : limiter, surveiller et maintenir9.11.4 Comprendre la reprise après une compromission9.12 Lire une configuration durcie sans la recopier aveuglément9.12.1 Contexte : lire l’intention avant les options9.12.2 Problèmes : une configuration copiée peut être inadaptée9.12.3 Réponses : associer chaque réglage à son effet9.12.4 Comprendre ce que le fragment ne couvre pas9.13 Ce qu’il faut retenir9.13.1 Contexte : relier les protections entre elles9.13.2 Problèmes : éviter les fausses garanties9.13.3 Réponses : garder une grille de lecture commune9.13.4 Questions de mémorisation9.14 Documentation de référence9.14.1 Contexte : utiliser les références officielles9.14.2 Problèmes : un exemple peut concerner un autre environnement9.14.3 Réponses : choisir la référence correspondant au besoin9.15 Grille finale de lecture des risques9.15.1 Contrôle du moteur9.15.2 Image compromise ou vulnérable9.15.3 Fuite de secret9.15.4 Pouvoir excessif du processus9.15.5 Atteinte au noyau ou à l’hôte9.15.6 Altération ou lecture de fichiers hôte9.15.7 Exposition réseau9.15.8 Saturation9.15.9 Perte de données9.15.10 Configuration non fiable9.15.11 Compromission durable
Cours stricts
1. Introduction - strict
1.1 Compétences Acquises1.1.1 Prérequis1.2 a - L'ère des microservices1.3 b - Les microservices1.4 c - Microservice vs monolithe1.5 d - L'approche monolithique1.6 e - L'approche microservice1.7 f - Liberté de choix technologique1.8 g - Déploiement indépendant des microservices1.9 h - Avantages des Microservices1.10 i - Inconvénients des Microservices1.11 j - Microservices avec docker
2. Isolation et virtualisation - strict
2.1 a - Principe de l'isolation2.2 b - Isolation par virtualisation
3. Docker en théorie - strict
3.1 a. Technologie de containerisation3.2 b. Docker3.3 c - Fonctionnement de Docker
4. Manipuler des conteneurs et des images - strict
4.1 a - Premières commandes Docker4.2 b - Communication avec les containers4.2.1 Conclusion
5. Persistance des données - strict
5.1 a - Présentation5.2 b - Qu'est-ce qu'un volume Docker ?5.3 c - Mise en pratique
6. Les images Docker - strict
6.1 a - Présentation6.2 b - Anatomie d'une image Docker6.3 c - Couche Docker6.4 d - Couche de conteneur6.5 e - Créer une image
7. Docker Compose - strict
7.1 a - Présentation7.2 b - Comprendre les mots-clés dans un fichier docker-compose.yaml7.2.1 Définition des réseaux personnalisés :7.2.2 Exposer les ports7.2.3 Définition des volumes dans Docker Compose :7.2.4 Attacher des volumes aux services7.2.5 Lier les montages et les volumes7.2.6 Partage des volumes entre les services7.2.7 Persistance des données pour les bases de données7.2.8 Mise à l'échelle des services avec Docker Compose7.2.9 Dépendances de service avec depends_on7.2.10 Contrôles de santé pour garantir la disponibilité du service7.2.11 Gestion des contraintes de ressources7.2.12 Utilisation des politiques de redémarrage pour la résilience des services7.3 c - Mise en pratique
8. Docker Socket - strict
8.1 a. Introduction8.2 b. Communiquer avec le socket Docker grâce à curl8.3 c. Créer un conteneur en interagissant avec la socket Docker8.4 Conclusion
9. Registre privé avec Docker - strict
9.1 a. Présentation9.2 b. Configurer un registre privé9.3 c. Exécuter un registre Docker privé9.4 d. Transférer une image vers le registre privé9.5 e. Extraire une image du registre privé9.6 f. Configurer l'authentification pour un registre privé9.7 Conclusion
10. Clients Docker - strict
10.1 a. Docker Desktop10.2 b. Portainer10.3 c. Client Python
11. Docker Multi-Build - strict
11.1 a - Présentation11.2 b - Docker Multi-Build11.3 c - Caractéristiques11.4 d - Création d'une image Docker11.4.1 Points clés :11.4.2 Création de l'image Docker11.4.3 Exécution du conteneur11.4.4 Conclusion