đł Module
Reproduisabilité, architecture, premiers conteneurs
Utilisez les flĂšches, cliquez ou glissez pour naviguer
1. Comprendre le problĂšme
Pourquoi Docker ? Le "ça marche sur ma machine"
2. Différencier VM et conteneurs
Architecture, performance, cas d'usage
3. ConnaĂźtre l'architecture Docker
Daemon, client, registry, images, conteneurs
4. Lancer ses premiers conteneurs
docker run, ps, logs, exec, stop, rm
5. Mapper des ports et passer des variables d'environnement
-p, -e, lancer PostgreSQL et Redis en 2 commandes
Le problÚme : "ça marche sur ma machine"
Pourquoi les environnements diffĂšrent
VM vs Conteneurs
Isolation, noyau, performance, taille
Architecture Docker
Daemon, CLI, registry, images, conteneurs
Live demo : premiers conteneurs
docker run, ps, logs, exec, stop, rm
Ports, variables d'environnement, services
Lancer PostgreSQL et Redis sans installation
Vous avez développé une application backend + frontend. Comment la déployer de maniÚre reproductible ?
đ„ïž Machine de dev
âïž Machine de production
đ± RĂ©sultat : l'app fonctionne en dev mais pas en prod
Le problÚme numéro 1 en développement logiciel
SystĂšme d'exploitation
macOS, Windows, Linux â chaque OS a ses spĂ©cificitĂ©s
Versions des dépendances
Node 18 vs 22, PostgreSQL 14 vs 16, Python 3.9 vs 3.12
Dépendances systÚme
Paquets manquants, versions de librairies C, compilateurs
Configuration
Variables d'env, chemins de fichiers, permissions
đĄ Docker rĂ©sout ce problĂšme : l'environnement est embarquĂ© avec l'application
Deux approches de l'isolation
Un conteneur n'est PAS une VM
C'est un processus isolé qui partage le noyau de l'hÎte
âââââââââââââââââââââââââââââââââââ
â App 1 â App 2 â App 3 â
â Librairies â Librairies â
â Guest OS (Ubuntu) â
â Hyperviseur â
â HĂŽte OS â
â MatĂ©riel â
âââââââââââââââââââââââââââââââââââ
â±ïž
Démarrage : minutes
đŸ
Taille : GB
đ
Overhead : élevé
âââââââââââââââââââââââââââââââââââ
â App 1 â App 2 â App 3 â
â Librairies â Librairies â
â Docker Engine â
â Noyau hĂŽte (kernel Linux) â
â MatĂ©riel â
âââââââââââââââââââââââââââââââââââ
âĄ
Démarrage : secondes
đŸ
Taille : Mo
đ
Overhead : quasi nul
| VM | Conteneur | |
|---|---|---|
| Noyau | Chaque VM son propre OS | Partage le noyau hĂŽte |
| Démarrage | 1-5 minutes | < 1 seconde |
| Taille | 1-10 GB | 10-500 MB |
| Isolation | đ Totale (matĂ©riel virtuel) | đ¶ Au niveau processus |
| Performance | Overhead CPU/RAM important | Quasi native |
đŻ Un conteneur est un processus isolĂ©, pas une machine virtuelle !
Daemon, Client, Registry
đ
Docker Daemon
Le moteur qui tourne en arriĂšre-plan
GÚre les images, conteneurs, réseaux
đ»
Docker CLI
La commande docker
Dialogue avec le daemon via une API REST
âïž
Registry
DépÎt d'images (Docker Hub)
docker pull / docker push
# La CLI parle au daemon
docker run nginx â Daemon â Registry
đŠ Image
Template immutable
â¶ïž Conteneur
Instance en cours d'exécution
â ïž L'image est le modĂšle, le conteneur est l'instance
Des milliers d'images prĂȘtes Ă l'emploi
node:22
Node.js avec Ubuntu
postgres:16
PostgreSQL pré-installé
redis:7
Redis prĂȘt Ă l'emploi
nginx:latest
Serveur web Nginx
# Télécharger une image depuis Docker Hub
docker pull postgres:16
# Le tag (:16) spécifie la version
# Sans tag, le défaut est :latest
Premiers conteneurs avec la CLI
Créer et démarrer un conteneur
# Lancer un conteneur Nginx
docker run --name mon-nginx -d -p 8080:80 nginx
# --name : nom du conteneur
# -d : détaché (en arriÚre-plan)
# -p 8080:80 : port hĂŽte 8080 â port conteneur 80
đ Ouvrir http://localhost:8080 â Nginx est en ligne!
đĄ Si l'image n'est pas en local, Docker la tĂ©lĂ©charge automatiquement
Lister les conteneurs en cours d'exécution
docker ps
# Liste les conteneurs actifs
docker ps -a
# -a : tous les conteneurs (mĂȘme arrĂȘtĂ©s)
CONTAINER ID IMAGE COMMAND PORTS NAMES
a1b2c3d4e5f6 nginx "nginx -g" 0.0.0.0:8080->80/tcp mon-nginx
đ Le CONTAINER ID sert de rĂ©fĂ©rence pour toutes les autres commandes
Voir les logs d'un conteneur
docker logs mon-nginx
# Affiche toutes les sorties du conteneur
docker logs -f mon-nginx
# -f : follow (suit les logs en temps réel, comme tail -f)
docker logs --tail 50 mon-nginx
# --tail : derniĂšres N lignes
đĄ Utile pour dĂ©boguer un conteneur qui ne dĂ©marre pas
Exécuter une commande dans un conteneur en cours
# Lancer un shell interactif dans le conteneur
docker exec -it mon-nginx bash
# -i : interactif | -t : terminal
# bash : la commande à exécuter
# Une fois dans le conteneur :
root@a1b2c3:/# ls /usr/share/nginx/html/
50x.html index.html
root@a1b2c3:/# exit
đ Utile pour inspecter l'intĂ©rieur du conteneur
ArrĂȘter et supprimer des conteneurs
ArrĂȘter un conteneur
docker stop mon-nginx
# Envoie SIGTERM, attend 10s, puis SIGKILL
Supprimer un conteneur
docker rm mon-nginx
# Le conteneur doit ĂȘtre arrĂȘtĂ© d'abord
â ïž Un conteneur arrĂȘtĂ© n'est pas supprimĂ© â il reste dans docker ps -a
⥠Raccourci : docker rm -f mon-nginx â force l'arrĂȘt + suppression
Connecter et configurer ses conteneurs
Sans port mapping, le conteneur est inaccessible depuis l'hĂŽte
â Sans -p
docker run nginx
Le port 80 est interne au conteneur
Impossible d'accéder depuis l'hÎte
â Avec -p
docker run -p 8080:80 nginx
Port 8080 de l'hĂŽte â port 80 du conteneur
Accessible sur http://localhost:8080
# Plusieurs ports possibles :
docker run -p 8080:80 -p 3000:3000 mon-app
# Syntaxe : -p port_hĂŽte:port_conteneur
Configurer un conteneur sans modifier l'image
# Lancer PostgreSQL avec des variables d'env
docker run -d \
--name ma-bdd \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=ma_base \
-p 5432:5432 postgres:16
đ Les variables d'env sont lues par le processus dans le conteneur au dĂ©marrage
Fini l'installation manuelle !
# PostgreSQL 16
docker run -d \
--name postgres-dev \
-e POSTGRES_PASSWORD=root \
-p 5432:5432 postgres:16
# Redis 7
docker run -d \
--name redis-dev \
-p 6379:6379 redis:7
â 2 commandes = PostgreSQL + Redis fonctionnels. Aucune installation systĂšme !
â Confusion image vs conteneur
L'image est le moule, le conteneur est l'objet. On ne modifie pas un conteneur, on reconstruit une image.
â Oublier de mapper les ports (-p)
Le service tourne dans le conteneur mais personne n'y accĂšde depuis l'hĂŽte !
â DonnĂ©es Ă©phĂ©mĂšres sans volume
Quand on supprime un conteneur, toutes ses données disparaissent. Sans volume, pas de persistance !
đĄ Docker Desktop doit ĂȘtre dĂ©marrĂ© avant d'utiliser la CLI
Sinon : "Cannot connect to the Docker daemon"
đł Docker rĂ©sout le problĂšme de reproductibilitĂ©
L'environnement est embarqué avec l'application
đŠ Un conteneur est un processus isolĂ©, pas une VM
Partage du noyau hÎte, démarrage en secondes, taille en Mo
Image
Template immutable (la classe)
Conteneur
Instance en cours d'exécution (l'objet)
â Une commande suffit pour lancer un service complet
Plus besoin d'installer PostgreSQL, Redis, etc. manuellement
docker run
Créer + démarrer un conteneur
docker ps
Lister les conteneurs actifs
docker logs
Voir les logs d'un conteneur
docker exec
Exécuter dans un conteneur
docker stop
ArrĂȘter un conteneur
docker rm
Supprimer un conteneur
â ïž N'oubliez pas : l'image est le modĂšle, le conteneur est l'instance
Sans -p, pas d'accĂšs au service. Sans volume, pas de persistance.
Docker est un outil essentiel pour le développement moderne
Prochaine étape : créer votre propre Dockerfile !
docker build -t mon-image .