====== Docker & Docker Compose ====== Dernière mise à jour : juin 2026 Procédure d'installation de Docker CE depuis le dépôt officiel sur Debian Trixie, et commandes de base pour l'utilisation au quotidien. ===== Pourquoi le dépôt officiel ? ===== Debian fournit un paquet ''docker.io'', mais il est souvent en retard sur les versions. Le dépôt officiel Docker fournit ''docker-ce'', plus à jour, avec le plugin Compose v2 intégré (commande ''docker compose'' sans tiret). ===== Installation ===== ==== 1. Prérequis ==== apt install -y ca-certificates curl gnupg ==== 2. Clé GPG et dépôt ==== install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg \ | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/debian trixie stable" \ > /etc/apt/sources.list.d/docker.list ==== 3. Installation des paquets ==== apt update apt install -y \ docker-ce \ docker-ce-cli \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin ==== 4. Vérification ==== docker version docker compose version systemctl status docker ==== 5. Utiliser Docker sans sudo (optionnel) ==== usermod -aG docker tonuser # se déconnecter / reconnecter pour que le groupe soit pris en compte ===== Mises à jour automatiques ===== Docker se met à jour avec le système via ''apt''. Pour inclure Docker dans les mises à jour de sécurité automatiques : apt install -y unattended-upgrades apt-listchanges dpkg-reconfigure unattended-upgrades # répondre "Oui" Dans ''/etc/apt/apt.conf.d/50unattended-upgrades'', ajouter la ligne Docker dans le bloc Origins-Pattern : Unattended-Upgrade::Origins-Pattern { "origin=Debian,codename=${distro_codename},label=Debian-Security"; "origin=Docker"; }; Vérifier que Docker est bien pris en compte : unattended-upgrade --dry-run --debug 2>&1 | grep -i docker **Note :** une mise à jour de Docker redémarre le daemon. Les conteneurs avec ''restart: unless-stopped'' redémarrent automatiquement. Pour un homelab sans contrainte de disponibilité stricte, les mises à jour automatiques sont adaptées. ===== Structure des projets ===== Convention utilisée sur le serveur principal : /mnt/stockage/docker/ ├── compose/ ← un sous-dossier par stack, contenant docker-compose.yml │ ├── surveillance/ │ ├── auth/ │ ├── nextcloud/ │ └── ... └── data/ ← données persistantes (bind mounts vers le RAID) ├── uptime-kuma/ ├── kanidm/ └── ... **Principe clé :** les données persistantes vivent dans ''data/'', jamais dans les conteneurs. Un conteneur est jetable ; les données ne le sont pas. ===== Utilisation de base ===== ==== Cycle de vie d'une stack ==== Depuis le répertoire contenant le ''docker-compose.yml'' : # Démarrer / créer / mettre à jour (recrée les conteneurs qui ont changé) docker compose up -d # État des conteneurs de la stack docker compose ps # Arrêter la stack (conserve les conteneurs) docker compose stop # Arrêter et supprimer les conteneurs (conserve les volumes/données) docker compose down # Redémarrer un service (SANS relire le compose) docker compose restart nom_service **Important :** ''docker compose restart'' ne relit pas le fichier ''docker-compose.yml''. Après toute modification du compose, utiliser ''docker compose up -d'' pour appliquer les changements. ==== Logs ==== # Logs d'un service en continu docker compose logs -f nom_service # Logs de toute la stack docker compose logs -f # Dernières lignes seulement docker compose logs --tail 50 nom_service ==== Mise à jour des images ==== # Récupérer les dernières images docker compose pull # Recréer les conteneurs avec les nouvelles images docker compose up -d ==== Exécuter une commande dans un conteneur ==== # Shell interactif docker compose exec nom_service bash # ou directement avec docker docker exec -it nom_conteneur bash # Commande ponctuelle docker exec -it nom_conteneur une_commande ==== Lancer un conteneur jetable ==== Utile pour des opérations ponctuelles (ex. génération de certificats, outils CLI) : docker run --rm -it \ -v /chemin/hote:/chemin/conteneur \ image:tag \ commande * ''--rm'' : supprime le conteneur après exécution * ''-it'' : mode interactif avec terminal * ''-v'' : montage d'un volume ===== Réseaux et ports ===== ==== Syntaxe des ports ==== Dans le compose : ''"PORT_HOTE:PORT_CONTENEUR"'' ports: - "3002:3000" # écoute sur toutes les interfaces de l'hôte - "192.168.1.9:3002:3000" # écoute uniquement sur l'IP LAN - "127.0.0.1:3002:3000" # écoute uniquement en local (accès via tunnel/proxy) Lier les ports à une IP précise est plus sûr que d'exposer sur ''0.0.0.0'' (toutes les interfaces). ==== Communication entre conteneurs ==== * Les conteneurs d'une même stack se joignent par leur **nom de service** sur le réseau Docker interne * Un conteneur qui veut joindre un service de l'**hôte** (ex. MariaDB bare-metal) passe par l'IP de la gateway Docker, pas par ''127.0.0.1'' (qui désigne le conteneur lui-même) # Trouver l'IP de la gateway d'un réseau docker network inspect nom_reseau | grep Gateway ===== Diagnostic ===== # Lister tous les conteneurs (y compris arrêtés) docker ps -a # Inspecter un conteneur docker inspect nom_conteneur # Voir l'utilisation des ressources en temps réel docker stats # Lister les réseaux docker network ls # Lister les volumes docker volume ls # Nettoyer les ressources inutilisées (images, conteneurs, réseaux orphelins) docker system prune # Espace disque utilisé par Docker docker system df ===== Bonnes pratiques retenues ===== * Un sous-dossier ''compose/'' par stack, données dans ''data/'' * ''restart: unless-stopped'' sur les services à garder actifs * Lier les ports à l'IP LAN du serveur plutôt qu'à ''0.0.0.0'' * ''docker compose up -d'' après chaque modif du compose (pas ''restart'') * Données persistantes sur le RAID via bind mounts, jamais dans les conteneurs * Surveiller les ports déjà utilisés sur l'hôte avant d'exposer un service (''ss -tlnp | grep PORT'')