Docker
Mise à jour : 2026-10-19 | Relu intégralement : 2026-10-19
Docker permet d'empaqueter une application avec tout ce dont elle a besoin (dépendances, configuration) dans un conteneur : une unité isolée, légère et reproductible, qui tourne de la même façon sur n'importe quelle machine.
Analogie : un conteneur Docker est comme un conteneur maritime. Peu importe ce qu'il y a dedans, il a toujours la même forme standard, s'empile avec les autres, et voyage à l'identique d'un port à l'autre. Le navire (votre serveur) n'a pas besoin de savoir ce que chaque conteneur transporte.
Image, conteneur, volume
- Image : le modèle figé d'une application (ex.
nginx:1.27). On la télécharge depuis un registre comme Docker Hub. - Conteneur : une instance en cours d'exécution d'une image. On peut en lancer plusieurs à partir de la même image.
- Volume : un espace de stockage qui survit à la suppression d'un conteneur. C'est là qu'on met les données à conserver (bases de données, fichiers), car un conteneur est par nature jetable.
Installer Docker
Sur Debian ou Ubuntu, utilisez le dépôt officiel de Docker plutôt que le paquet de la distribution, souvent plus ancien :
curl -fsSL https://get.docker.com -o get-docker.sh
less get-docker.sh # lire le script avant de l'exécuter
sudo sh get-docker.sh
Vérifiez :
Utiliser Docker sans sudo
Ajouter votre utilisateur au groupe docker évite de taper sudo à chaque commande :
Déconnectez-vous et reconnectez-vous pour que ce soit pris en compte. Attention : ce groupe donne un accès équivalent à root sur la machine. Ne l'accordez qu'à des utilisateurs de confiance.
Docker Compose
docker compose décrit une application (un ou plusieurs conteneurs) dans un fichier compose.yml, plutôt que d'enchaîner de longues commandes docker run. C'est la méthode recommandée pour tout ce qui doit durer.
Exemple minimal, un serveur web :
services:
web:
image: nginx:1.27
container_name: mon-web
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./site:/usr/share/nginx/html:ro
compose.yml ou docker-compose.yml ?
Les deux noms fonctionnent. compose.yml est le nom moderne recommandé ; docker-compose.yml reste reconnu pour la compatibilité. De même, la commande moderne est docker compose (avec un espace) ; l'ancienne docker-compose (avec un tiret) est un outil séparé, désormais obsolète.
N'utilisez jamais le tag latest en production
C'est la règle à retenir pour des déploiements fiables (voir la référence en fin de fiche : cryptolab.re).
Quand vous écrivez image: nginx ou image: nginx:latest, vous ne demandez pas "une version précise" mais "la dernière du moment". Et latest est un tag mouvant : il pointe aujourd'hui vers une version, demain vers une autre.
Les problèmes que cela crée :
- Des mises à jour non maîtrisées. Un
docker compose pullpeut récupérer une nouvelle version majeure qui casse votre configuration, sans que vous l'ayez décidé. - Des machines qui divergent. Deux serveurs installés à deux semaines d'écart avec
latestne tournent pas forcément la même version, ce qui rend les pannes difficiles à reproduire. - Pas de retour arrière. Si la nouvelle version pose problème,
latestne vous dit pas vers quelle version revenir. - Un piège spécifique à certains projets. Chez quelques éditeurs,
latestne pointe même pas vers la dernière version. Uptime Kuma en est l'exemple : son taglatestdésigne encore l'ancienne version 1 alors que la 2 est la version stable, et l'éditeur a lui-même marqué ce tag comme déprécié sur Docker Hub.
La bonne pratique : épingler la version.
# À éviter
image: nginx
image: nginx:latest
# Recommandé : une version précise, ou au moins une branche majeure
image: nginx:1.27.3 # version exacte, le plus reproductible
image: nginx:1.27 # branche mineure : reçoit les correctifs, sans saut majeur
Épingler la version fait de la mise à jour un acte volontaire : vous changez le numéro dans compose.yml quand vous le décidez, après avoir lu les notes de version, et vous savez exactement vers quoi revenir en cas de souci.
Mettre à jour proprement
# 1. Modifier le tag de l'image dans compose.yml (ex. 1.27.3 → 1.27.4)
# 2. Appliquer
docker compose pull
docker compose up -d
# 3. Vérifier
docker compose logs -f
Pour suivre les versions disponibles sans tout casser, un outil comme Diun prévient quand une nouvelle image sort, sans rien modifier. Évitez les outils de mise à jour automatique : ils réintroduisent exactement le problème de latest.
Bonnes pratiques de sécurité
- Socket Docker = accès root. Monter
/var/run/docker.sockdans un conteneur lui donne, de fait, le contrôle de l'hôte. Ne le faites que si c'est indispensable, en lecture seule (:ro), et envisagez un proxy de socket pour limiter les droits. -
no-new-privileges. Empêche un conteneur d'élever ses privilèges : -
Docker contourne le pare-feu de l'hôte. Un port publié (
ports: ["8080:80"]) est ouvert sur toutes les interfaces, même si UFW le bloque : Docker insère ses règles avant celles d'UFW. Pour n'exposer un service qu'en local, précisez l'adresse :"127.0.0.1:8080:80". Pour le filtrage réel, comptez sur un pare-feu en amont (hébergeur, hyperviseur) ou sur la chaîneDOCKER-USER, la seule que Docker laisse à votre main (voir la fiche CrowdSec). - Ne mettez pas de secrets dans
compose.yml. Utilisez un fichier.env(en permissions600, non versionné) ou les secrets Docker. Attention au caractère$dans un.env: Compose l'interprète comme une variable, doublez-le ($$). - Ne tournez pas en root quand l'image le permet. Beaucoup d'images acceptent
user: "1000:1000"; un conteneur compromis a alors les droits d'un simple utilisateur. - Réseaux séparés. Placez les services internes (base de données...) sur un réseau Docker
internal: true, sans accès à Internet ni exposition.
Commandes utiles
docker ps # conteneurs en cours
docker ps -a # tous, y compris arrêtés
docker compose up -d # démarrer (en arrière-plan)
docker compose down # arrêter et supprimer les conteneurs
docker compose restart # redémarrer
docker compose logs -f # suivre les journaux en direct
docker compose pull # récupérer les nouvelles images
docker compose config # valider et afficher la config résolue
docker exec -it NOM bash # ouvrir un shell dans un conteneur
docker image ls # lister les images
docker system df # espace disque utilisé par Docker
docker system prune # nettoyer ce qui est inutilisé (prudence)
docker stats # CPU et mémoire de chaque conteneur en direct
docker compose down supprime les conteneurs
down arrête et supprime les conteneurs (les volumes nommés sont conservés, sauf si vous ajoutez -v). Pour juste arrêter sans supprimer, utilisez docker compose stop.