« Ça marche sur ma machine » : la phrase que tout développeur a déjà entendue. L’application fonctionne en local, mais en production la version de Node, une bibliothèque système ou une variable d’environnement diffère. Docker règle ce problème en empaquetant l’application avec tout son environnement dans une image qui s’exécute de la même façon partout.
Le vocabulaire
- Image : modèle en lecture seule (système de fichiers + métadonnées), construit en couches successives. Exemple :
node:22-slim. - Conteneur : une instance en cours d’exécution d’une image, avec sa propre couche inscriptible. On peut lancer dix conteneurs à partir d’une même image.
- Registre : dépôt d’images (Docker Hub, GitHub Container Registry, registres des clouds).
Contrairement à une machine virtuelle, un conteneur n’embarque pas de système d’exploitation complet : il partage le noyau de l’hôte et s’isole grâce aux namespaces et cgroups de Linux. Il démarre en une fraction de seconde et pèse quelques dizaines de Mo.
Le cycle de vie d’un conteneur
# Télécharger une image depuis Docker Hub
docker pull nginx:1.27-alpine
# Lancer un conteneur en arrière-plan (-d), nommé, port 8080 de l'hôte -> 80 du conteneur
docker run -d --name web -p 8080:80 nginx:1.27-alpine
# http://localhost:8080 affiche la page d'accueil de nginx
docker ps # conteneurs en cours (-a pour inclure les arrêtés)
docker logs -f web # suivre les journaux (sortie standard du processus)
docker exec -it web sh # ouvrir un shell DANS le conteneur
docker stop web # arrêter proprement (signal SIGTERM puis SIGKILL)
docker rm web # supprimer le conteneur
docker images # images présentes localement
Un conteneur vit aussi longtemps que son processus principal. Si ce processus se termine, le conteneur s’arrête.
Publier des ports
Par défaut, un conteneur est isolé du réseau de l’hôte. L’option -p HOTE:CONTENEUR publie un port : -p 3000:3000 rend une API Node accessible sur localhost:3000. Pour n’exposer que localement : -p 127.0.0.1:3000:3000.
Persister les données
Tout ce qui est écrit dans le conteneur est perdu quand on le supprime. Pour une base de données, on utilise un volume :
docker volume create pgdata
docker run -d --name db \
-e POSTGRES_PASSWORD=dev_seulement \
-v pgdata:/var/lib/postgresql/data \
-p 127.0.0.1:5432:5432 \
postgres:17
-edéfinit une variable d’environnement ;-v pgdata:/cheminmonte le volume nommé : on peut supprimer et recréer le conteneur sans perdre les données.
En développement, on monte aussi un dossier de l’hôte (bind mount) : -v "$PWD":/app.
Le ménage
docker system df # espace utilisé
docker container prune # supprime les conteneurs arrêtés
docker image prune # supprime les images sans tag
À retenir
Image = modèle, conteneur = instance. docker run avec -d, -p, -e, -v et --name couvre la majorité des usages ; ps, logs et exec servent au diagnostic.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Lancer et inspecter un serveur web
Lancez un conteneur
nginx:1.27-alpinenommévitrine, en arrière-plan, accessible sur le port 8080 de votre machine. Vérifiez qu’il répond, consultez ses journaux, ouvrez un shell dedans pour lister/usr/share/nginx/html, puis arrêtez-le et supprimez-le.- `docker ps` affiche le conteneur `vitrine` avec `0.0.0.0:8080->80/tcp`
- `curl -I http://localhost:8080` renvoie `HTTP/1.1 200 OK`
- `docker logs vitrine` montre la requête GET effectuée par curl
- `docker exec vitrine ls /usr/share/nginx/html` liste `index.html`
- Après `docker stop vitrine && docker rm vitrine`, `docker ps -a` ne l'affiche plus
Persister des données avec un volume
Créez un volume
notes. Lancez un conteneuralpine:3.20qui écrit la date dans/data/journal.txten montant ce volume sur/data, puis supprimez le conteneur. Lancez un second conteneur avec le même volume et affichez le fichier.- `docker volume ls` liste le volume `notes`
- Le premier conteneur est lancé avec `-v notes:/data` et l'option `--rm`
- Le second conteneur affiche le contenu de `/data/journal.txt` avec `cat`
- La date écrite par le premier conteneur est bien présente
Image ou conteneur ?
Vous lancez trois fois
docker run -d nginx:1.27-alpine. Combien d’images et de conteneurs avez-vous ?- 3 images et 3 conteneurs
- 1 image et 3 conteneurs
- 1 image et 1 conteneur
- 3 images et 1 conteneur
Quiz de fin de leçon
Que partage un conteneur avec la machine hôte ?
- Rien, il embarque son propre noyau
- Le noyau du système d'exploitation
- Sa base de données
Que fait
-p 8080:3000?- Publie le port 3000 du conteneur sur le port 8080 de l'hôte
- Publie le port 8080 du conteneur sur le port 3000 de l'hôte
- Limite la mémoire
Quelle commande ouvre un shell dans un conteneur en cours d’exécution ?
- docker run -it nom sh
- docker exec -it nom sh
- docker logs nom
La suite du cours
- Écrire un Dockerfile pour son application18 min
- Optimiser et sécuriser ses images18 min
- Docker Compose : orchestrer une application multi-services18 min
- Déployer en production : registre, CI/CD et HTTPS20 min