🐳 Module

Docker : Introduction

Reproduisabilité, architecture, premiers conteneurs

Utilisez les flĂšches, cliquez ou glissez pour naviguer

Objectifs de la leçon

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

Plan du cours

1

Le problÚme : "ça marche sur ma machine"

Pourquoi les environnements diffĂšrent

2

VM vs Conteneurs

Isolation, noyau, performance, taille

3

Architecture Docker

Daemon, CLI, registry, images, conteneurs

4

Live demo : premiers conteneurs

docker run, ps, logs, exec, stop, rm

5

Ports, variables d'environnement, services

Lancer PostgreSQL et Redis sans installation

Le contexte

Vous avez développé une application backend + frontend. Comment la déployer de maniÚre reproductible ?

đŸ–„ïž Machine de dev

  • ✅ Node.js v22 installĂ©
  • ✅ PostgreSQL 16 en local
  • ✅ Redis 7 avec config custom
  • ✅ Ubuntu avec dĂ©pendances systĂšme

☁ Machine de production

  • ❌ Node.js v18 seulement
  • ❌ PostgreSQL 14, version incompatible
  • ❌ Redis absent, Ă  installer
  • ❌ Debian, pas Ubuntu

đŸ˜± RĂ©sultat : l'app fonctionne en dev mais pas en prod

🚹 "Ça marche sur ma machine!"

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

VM vs Conteneurs

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

Architecture d'une Machine Virtuelle

┌─────────────────────────────────┐

│ App 1 │ App 2 │ App 3 │

│ Librairies │ Librairies │

│ Guest OS (Ubuntu) │

│ Hyperviseur │

│ Hîte OS │

│ MatĂ©riel │

└─────────────────────────────────┘

⏱

Démarrage : minutes

đŸ’Ÿ

Taille : GB

🔄

Overhead : élevé

Architecture d'un Conteneur

┌─────────────────────────────────┐

│ 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 vs Conteneurs : Comparaison

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 !

Architecture Docker

Daemon, Client, Registry

Les 3 composants de Docker

🐋

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

Images vs Conteneurs

📩 Image

Template immutable

  • ✅ Contient le code + dĂ©pendances + OS
  • ✅ Ne change jamais (read-only)
  • ✅ StockĂ©e dans un registry
  • ✅ Comparable Ă  une classe en POO

▶ Conteneur

Instance en cours d'exécution

  • ✅ Instance d'une image
  • ✅ Peut ĂȘtre dĂ©marrĂ©, arrĂȘtĂ©, supprimĂ©
  • ✅ Isolation : processus, rĂ©seau, fichiers
  • ✅ Comparable Ă  un objet en POO

⚠ L'image est le modĂšle, le conteneur est l'instance

Docker Hub & Registries

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

🚀 Live Demo

Premiers conteneurs avec la CLI

docker run

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

docker ps

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

docker logs

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

docker exec

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

docker stop & docker rm

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

Ports & Variables d'Environnement

Connecter et configurer ses conteneurs

Mapper les ports avec -p

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

Variables d'environnement avec -e

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

PostgreSQL + Redis : 2 commandes

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 !

PiÚges courants à éviter

❌ 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"

Points clés à retenir

🐳 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

Récapitulatif

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.

Questions?

Docker est un outil essentiel pour le développement moderne

Prochaine étape : créer votre propre Dockerfile !

docker build -t mon-image .