Conteneurs
et Docker
Le problème - l'environnement
Toute application a besoin d'un environnement précis pour fonctionner - une version de Python, certaines bibliothèques, un serveur de base de données configuré d'une certaine manière, des variables d'environnement.
La phrase la plus coûteuse de l'informatique. Le code passe sur le poste du développeur, échoue sur le serveur du collègue, plante différemment en production. Les conteneurs existent pour rendre cette phrase obsolète.
L'idée - emballer l'environnement avec l'application
Plutôt que de demander au serveur d'avoir le bon environnement, on emballe l'application avec son environnement complet dans un paquet qu'on appelle un conteneur.
Si ça fonctionne sur le poste du développeur, ça fonctionnera ailleurs - parce que c'est exactement le même paquet, avec la même version de Python, les mêmes bibliothèques, les mêmes fichiers de configuration.
Conteneur ou machine virtuelle ?
La VM virtualise le matériel et embarque un système d'exploitation complet. Le conteneur, lui, partage le noyau de l'hôte et n'embarque que ce qui change - les bibliothèques et les fichiers de l'application.
Les trois concepts à retenir
Image et conteneur - la différence clé
Une même image peut donner naissance à plusieurs conteneurs identiques. Quand on supprime un conteneur, l'image reste et peut servir à en créer d'autres.
Le Dockerfile - la recette de l'image
Pour construire une image, on écrit un fichier de recette nommé Dockerfile. Il décrit étape par étape comment préparer l'environnement.
# Dockerfile - une application Python toute simple FROM python:3.12-slim WORKDIR /application COPY exigences.txt . RUN pip install -r exigences.txt COPY . . CMD ["python", "main.py"]
On part d'une image de base (FROM), on copie les fichiers, on installe les dépendances, on précise la commande à lancer au démarrage du conteneur.
Les commandes essentielles
| Commande | Effet |
|---|---|
docker build -t mon-image . | Construit une image à partir du Dockerfile du dossier courant et la nomme mon-image. |
docker run mon-image | Démarre un conteneur basé sur l'image. Avec -d en arrière-plan, avec -p 8080:80 pour exposer un port. |
docker ps | Liste les conteneurs en marche. Avec -a, inclut aussi les arrêtés. |
docker logs nom-conteneur | Affiche la sortie du conteneur. Indispensable pour déboguer. |
docker exec -it nom-conteneur bash | Ouvre un terminal à l'intérieur du conteneur en marche. |
docker stop nom-conteneur | Arrête proprement un conteneur. |
docker rm nom-conteneur | Supprime un conteneur arrêté. |
Docker Hub - on ne part pas de zéro
Docker Hub (hub.docker.com) est un registre public d'images. On y trouve des images officielles maintenues par les éditeurs des logiciels - prêtes à utiliser.
Le format est nom:tag. Le tag identifie une version - sans tag, Docker prend par défaut latest, ce qu'on évite en production.
Volumes - garder les données
Un conteneur est jetable - quand on le supprime, ce qu'il contenait disparaît. Pour conserver les données (base de données, fichiers utilisateurs, configurations), on utilise des volumes.
Ici le volume nommé donnees-postgres est branché sur le dossier où Postgres écrit ses données. Le conteneur peut être détruit et recréé, les données restent.
Docker Compose - plusieurs conteneurs ensemble
La plupart des applications utilisent plusieurs services - un site web, une base de données, un cache. Docker Compose permet de décrire l'ensemble dans un seul fichier docker-compose.yml et de tout démarrer d'un coup.
services: site: image: nginx:alpine ports: ["8080:80"] base: image: postgres:16 volumes: ["donnees:/var/lib/postgresql/data"] volumes: donnees:
Une seule commande démarre les deux services, crée le volume, configure le réseau interne entre eux. docker compose down arrête tout proprement.
Premiers pas - votre premier conteneur en 3 commandes
Une fois Docker installé, voici la séquence minimale pour faire tourner un vrai service. On lance un serveur web nginx accessible dans le navigateur.