Conteneurs
et Docker

Introduction
Du problème de l'environnement à l'orchestration légère

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.

Ça marche sur ma machine

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.

Définition Un conteneur est une enveloppe légère qui contient l'application et tout ce qu'il lui faut pour fonctionner, isolée du reste du système.

Conteneur ou machine virtuelle ?

Machine virtuelle
App A | App B | App C
OS invité (Ubuntu, Win, ...)
OS invité (Ubuntu, Win, ...)
Hyperviseur
OS hôte
Matériel
Lourd Plusieurs Go par VM, démarrage en minutes
Conteneur
App A | App B | App C
Moteur de conteneurs (Docker)
OS hôte (noyau partagé)
Matériel
Léger Quelques Mo, démarrage en secondes

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

IM
Image
Le modèle - un paquet en lecture seule contenant l'application et son environnement. On la construit une fois, on la réutilise partout.
CO
Conteneur
Une instance en exécution d'une image. On peut en démarrer plusieurs à partir de la même image, elles sont indépendantes l'une de l'autre.
RG
Registre
Un dépôt qui stocke et distribue des images. Docker Hub est le registre public le plus connu, on y trouve des images officielles.

Image et conteneur - la différence clé

IMAGE
Comme une recette de cuisine
Lecture seule, stable, partageable. Une fois écrite, elle ne change pas.
CONTENEUR
Comme un repas que l'on cuisine
En cours d'exécution, modifiable, jetable. On peut en faire plusieurs avec la même recette.

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-imageDémarre un conteneur basé sur l'image. Avec -d en arrière-plan, avec -p 8080:80 pour exposer un port.
docker psListe les conteneurs en marche. Avec -a, inclut aussi les arrêtés.
docker logs nom-conteneurAffiche la sortie du conteneur. Indispensable pour déboguer.
docker exec -it nom-conteneur bashOuvre un terminal à l'intérieur du conteneur en marche.
docker stop nom-conteneurArrête proprement un conteneur.
docker rm nom-conteneurSupprime 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.

python:3.12
Interpréteur Python prêt
nginx:alpine
Serveur web léger
postgres:16
Base de données
node:20
Runtime JavaScript
redis:7
Cache mémoire
mariadb:11
Base de données SQL
docker pull nginx:alpine

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.

Un volume vit en dehors du conteneur. Le conteneur s'y connecte au démarrage, lit et écrit dedans. Quand le conteneur est supprimé, le volume reste. On peut le rebrancher à un nouveau conteneur.
docker run -v donnees-postgres:/var/lib/postgresql/data postgres:16

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:
docker compose up -d

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.

1
docker run -d -p 8080:80 --name mon-site nginx:alpine
Télécharge l'image nginx, démarre un conteneur en arrière-plan (-d), redirige le port 8080 du poste vers le port 80 du conteneur (-p 8080:80), nomme le conteneur mon-site.
2
Ouvrir http://localhost:8080 dans le navigateur
La page d'accueil de nginx s'affiche - votre conteneur sert du contenu web. Aucune installation locale de nginx n'a été faite sur votre poste.
3
docker stop mon-site && docker rm mon-site
Arrête et supprime le conteneur. Aucune trace ne reste sur le poste, sauf l'image nginx en cache qu'on peut réutiliser instantanément.
À retenir Lancer un service complet, l'utiliser, puis tout effacer en moins d'une minute - sans rien polluer sur le poste. C'est ça, le pouvoir des conteneurs.

Pourquoi c'est devenu incontournable

1
Reproductibilité Le même conteneur tourne pareil sur le poste du développeur, le serveur du collègue, et la production.
2
Isolation Chaque conteneur a son environnement. Deux applications peuvent utiliser deux versions différentes de Python sans conflit.
3
Démarrage rapide Un conteneur démarre en quelques secondes. Idéal pour la mise à l'échelle automatique.
4
Densité On peut faire tourner des dizaines de conteneurs sur un serveur où l'on n'aurait fait tourner que quelques VM.
5
Déploiement On déploie une image plutôt qu'une procédure d'installation. Le retour arrière consiste à relancer l'image précédente.
6
Écosystème Des milliers d'images officielles disponibles. Tester un nouveau logiciel prend une commande, sans rien polluer sur le poste.