Docker simplifie le déploiement d'applications, mais les mauvaises configurations peuvent compromettre ses avantages. Des paramètres par défaut non sécurisés à une utilisation inefficace des ressources, les erreurs courantes provoquent des temps d'arrêt, des failles de sécurité et une dégradation des performances. Ce guide propose une approche pratique, étape par étape, pour identifier, corriger et éviter ces pièges à l'aide d'exemples concrets et de techniques de validation applicables immédiatement. ## Inventaire des versions et de l'environnement Avant d'apporter des modifications, établissez une base de référence claire de votre configuration actuelle. Omettre cette étape entraîne des changements qui cassent des dépendances ou introduisent des incompatibilités de versions. Capturez les éléments essentiels : - Versions de Docker Engine et Compose : Exécutez docker version et docker compose version . La disponibilité des fonctionnalités (comme deploy.resources dans les fichiers Compose ou BuildKit) dépend de ces versions. - Conteneurs et images en cours d'exécution : Utilisez docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" et docker images pour cartographier la topologie de votre application. - Sources de configuration : Faites l'inventaire des variables d'environnement, fichiers de configuration, secrets Docker et montages bind. Notez quels services tirent leur configuration de fichiers .env versus des secrets au niveau de l'orchestration. Documentez les résultats dans un tableau de référence que vous pourrez mettre à jour pendant la remédiation :
| Composant | Version / Valeur | Notes |
|---|---|---|
| Docker Engine | 24.0.7 | Dernière version LTS ; supporte le plugin docker compose nativement |
| Docker Compose | v2.24.0 | Plugin inclus avec Docker Desktop ; binaire autonome disponible |
| Image de base (service API) | python:3.11-slim-bookworm | Base Debian 12 ; surface d'attaque plus réduite que l'image complète |
| Image de base (Worker) | node:20-alpine | libc Musl ; vérifier que les dépendances natives compilent correctement |
| Orchestration | Docker Compose (local), Swarm (staging) | Les fichiers Compose doivent être compatibles avec les deux |
| Commande | Objectif | Sections clés à vérifier |
|---|---|---|
docker inspect <conteneur> | Configuration complète à l'exécution | HostConfig.Memory, HostConfig.CapDrop, Mounts, NetworkSettings |
docker compose config | Configuration Compose rendue | Valide la substitution de variables, la logique de fusion, extends |
docker exec <conteneur> cat /proc/self/status | Vue interne des limites | VmRSS, VmPeak, CapEff (capacités effectives) |
docker diff <conteneur> | Changements du système de fichiers depuis le démarrage | Détecte les écritures inattendues sur les couches en lecture seule |
docker stats --no-stream <conteneur> | Instantané de l'utilisation des ressources | CPU %, MEM %, NET I/O, BLOCK I/O, PIDs |
| Vérification | Attendu | Résultat réel | Statut |
|---|---|---|---|
| Limite mémoire appliquée | RSS du conteneur ≤ 512 Mo sous charge | 498 Mo en pointe | Pass |
| Système de fichiers racine en lecture seule | touch /test échoue avec Read-only file system | Erreur loguée, application inchangée | Pass |
| Capacités retirées | CAP_NET_BIND_SERVICE seulement ; CAP_SYS_ADMIN absent | CapEff: 00000000a80425fb (seulement NET_BIND, CHOWN, DAC_OVERRIDE, FOWNER, FSETID, KILL, SETGID, SETUID) | Pass |
| Portée de liaison du port | Écoute sur 127.0.0.1:8000 seulement | ss -ltnp montre 127.0.0.1:8000 | Pass |
| Sortie des logs | Logs JSON structurés vers stdout | Lignes JSON présentes dans docker compose logs api | Pass |
| Mode de défaillance | Symptômes | Commandes de diagnostic | Cause racine typique |
|---|---|---|---|
| Conflit de port | Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use | docker compose ps, ss -ltnp | grep 8080 | Un autre service/processus occupe le port ; collision de mappage de port hôte |
| Boucle OOM kill | Le conteneur redémarre en boucle ; docker inspect montre OOMKilled: true | docker stats, docker compose logs, dmesg | grep -i oom | Limite trop basse pour la charge réelle ; fuite de mémoire |
| Permission volume refusée | L'application logue PermissionError: [Errno 13] Permission denied: '/data' | docker inspect --format '{{.Mounts}}' <conteneur>, ls -la /chemin/hote | Désaccord UID/GID entre utilisateur conteneur et répertoire hôte ; SELinux/AppArmor |
| Erreur de syntaxe config | docker compose up échoue avec yaml: line X: did not find expected key | docker compose config | Erreur d'indentation, guillemets manquants autour de caractères spéciaux, référence extends incorrecte |
| Échec de pull d'image | pull access denied ou manifest unknown | docker pull <image>:<tag> manuellement | Authentification registre privé manquante ; typo dans le tag ; incompatibilité d'architecture (arm64 vs amd64) |