Table des matières
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 dansdata/ restart: unless-stoppedsur les services à garder actifs- Lier les ports à l'IP LAN du serveur plutôt qu'à
0.0.0.0 docker compose up -daprès chaque modif du compose (pasrestart)- 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)
