À la fin de cette page, tu seras capable de :
.envpull → run → compose → buildlatest en production.env — Fichier texte qui contient les variables sensibles (mots de passe, clés API)Quand on débute avec Docker, il y a une progression logique à suivre. On ne commence pas à construire ses propres images dès le premier jour.
Niveau 1 │ docker pull + docker run
│ → Utiliser des images existantes
│
Niveau 2 │ docker-compose.yml
│ → Orchestrer plusieurs services ensemble
│
Niveau 3 │ Dockerfile + docker build
│ → Créer ses propres images personnalisées
│
Niveau 4 │ Dockerfile + Compose + .env + volumes + réseaux
│ → Projet complet, propre, reproductible
Ne saute pas les étapes. Même les pros commencent par chercher si une image officielle existe avant d'en créer une.
Par défaut, Docker donne un nom aléatoire (comme eloquent_turing ou funny_hopper). C'est illisible.
# ❌ À éviter
docker run -d -p 8080:80 nginx
# ✅ Bonne pratique
docker run -d --name site-vitrine -p 8080:80 nginx
Avec un nom, les commandes suivantes deviennent lisibles :
docker logs site-vitrine
docker stop site-vitrine
docker exec -it site-vitrine bash
L'étiquette latest est pratique mais dangereuse : si l'image est mise à jour avec une version majeure, ton application peut se casser sans prévenir.
# ❌ Risqué en projet sérieux
docker run mysql
# ✅ Stable et prévisible
docker run mysql:8.0
docker run php:8.3-apache
docker run node:20-alpine
Consulte les tags disponibles sur hub.docker.com pour chaque image.
💡 Exception : En phase d'exploration / apprentissage,
latestest acceptable. Mais dès qu'un projet est partagé avec d'autres ou mis en production, on fixe la version.
# ❌ Le mot de passe est visible dans l'historique du terminal
docker run -e MYSQL_ROOT_PASSWORD=monsecret mysql:8.0
# ✅ On utilise un fichier .env
docker run --env-file .env mysql:8.0
.envCrée un fichier nommé .env dans ton dossier de projet :
# .env
MYSQL_ROOT_PASSWORD=monsecret
MYSQL_DATABASE=monprojet
MYSQL_USER=dev
MYSQL_PASSWORD=devpass
Docker Compose charge automatiquement ce fichier s'il se trouve dans le même dossier que docker-compose.yml.
⚠️ Important : Ajoute
.envdans ton.gitignore. On ne met jamais de mots de passe dans un dépôt Git.
# .gitignore
.env
Un conteneur ne doit faire qu'une seule chose. On ne met pas Apache + MySQL + PHP dans un seul conteneur comme on le ferait avec XAMPP.
# ❌ Mauvaise approche
Un conteneur "tout en un" avec Apache + MySQL + PHP
# ✅ Bonne approche
Conteneur 1 : PHP + Apache
Conteneur 2 : MySQL
Conteneur 3 : phpMyAdmin
Avantages :
Un conteneur est éphémère : dès qu'on le supprime, toutes ses données disparaissent. Pour les bases de données, les fichiers uploadés, les logs importants, il faut utiliser un volume.
# ❌ Les données disparaissent si le conteneur est supprimé
docker run -d --name ma-db mysql:8.0
# ✅ Les données survivent au conteneur
docker run -d --name ma-db \
-v mysql_data:/var/lib/mysql \
mysql:8.0
La page suivante explique les volumes en détail.
--restart unless-stopped pour les services permanentsSi tu héberges un service qui doit toujours être disponible (un serveur web, une base de données), configure le redémarrage automatique.
docker run -d --name mon-site \
--restart unless-stopped \
-p 80:80 \
nginx:1.25
Ainsi, si le serveur redémarre ou si Docker redémarre, le conteneur repart automatiquement.
La page suivante détaille toutes les politiques de redémarrage.
Docker garde en cache toutes les images téléchargées et les conteneurs arrêtés. Ça peut vite occuper plusieurs dizaines de gigaoctets.
# Supprimer les conteneurs arrêtés
docker container prune
# Supprimer les images sans conteneur associé
docker image prune
# Supprimer les volumes non utilisés
docker volume prune
# Tout nettoyer d'un coup (images, conteneurs, réseaux inutilisés)
docker system prune
# Voir l'espace utilisé par Docker
docker system df
Voici comment un développeur ou technicien aborde un nouveau projet Docker de A à Z.
Avant tout, on vérifie si une image officielle existe sur hub.docker.com.
docker search nginx
docker search mysql
On regarde les étoiles, si l'image est marquée "Official" et on note la version stable.
docker runOn lance un conteneur temporaire pour vérifier que ça fonctionne.
docker run --rm -d -p 8080:80 --name test-nginx nginx:1.25
# --rm = suppression automatique à l'arrêt
docker-compose.ymlUne fois que ça fonctionne, on formalise dans un fichier Compose. Plus besoin de retaper des longues commandes.
services:
web:
image: nginx:1.25
container_name: mon-site
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
.env et le .gitignore# .env
APP_PORT=80
DB_PASSWORD=secret
# .gitignore
.env
On commit le docker-compose.yml, le Dockerfile (si on en a un), le .gitignore, mais pas le .env. On fournit un .env.example à la place :
# .env.example — à copier en .env et à remplir
MYSQL_ROOT_PASSWORD=
MYSQL_DATABASE=
MYSQL_USER=
MYSQL_PASSWORD=
N'importe qui peut cloner le projet et démarrer l'environnement complet avec :
git clone https://github.com/mon-org/mon-projet
cd mon-projet
cp .env.example .env
# (remplir le .env)
docker compose up -d
C'est ça, la vraie puissance de Docker : l'environnement est reproductible en quelques secondes sur n'importe quelle machine.
| Situation | Commande recommandée |
|---|---|
| Tester une image rapidement | docker run --rm -p 8080:80 nginx:1.25 |
| Lancer un service permanent | docker run -d --name X --restart unless-stopped ... |
| Projet multi-services | docker compose up -d |
| Voir ce qui tourne | docker ps |
| Nettoyer | docker system prune |
| Voir l'espace utilisé | docker system df |