Comprendre Docker sans jargon : le problème qu’il résout, son architecture, sa mise en place et son fonctionnement au quotidien, expliqués avec des illustrations.
01 Le problème que Docker résout
Avant Docker, déployer une application sur un nouveau serveur relevait du parcours du combattant.
Vous avez développé votre application sur votre machine, elle fonctionne parfaitement. Vous la déployez sur le serveur de production et… rien ne fonctionne. Versions de bibliothèques différentes, dépendances manquantes, variables d’environnement absentes. C’est le fameux syndrome « ça marche chez moi ».
Sans Docker : conflits de versions entre machines. Avec Docker : l’environnement voyage avec l’application.
02 Les quatre concepts fondamentaux
Avant de se lancer, il faut assimiler quatre notions clés.
Dockerfile
La recette de construction. Un fichier texte qui décrit comment assembler l’image.
Image
Le modele figé, en lecture seule, construit à partir du Dockerfile. On la partage.
Conteneur
L’image en cours d’execution. Un processus isolé, avec son propre systeme de fichiers.
Registry
Le depot d’images (Docker Hub, GHCR…). On y pousse et on y tire des images.
Chaque conteneur est isolé des autres mais partage le noyau du systeme hote — contrairement a une machine virtuelle.
03 Architecture : Docker vs Machine Virtuelle
La difference fondamentale entre un conteneur et une VM.
La VM emule du materiel complet et embarque un OS entier. Le conteneur ne partage que les processus isolés sur le meme noyau hote.
04 Le flux de travail : Dockerfile → Image → Conteneur
Trois étapes simples pour passer du code a un service en fonctionnement.
Un Dockerfile est construit en image par docker build, puis l’image est instanciée en conteneur par docker run.
05 Installation
Docker s’installe en quelques minutes sur Linux, Mac et Windows.
Sur un serveur Linux (Debian / Ubuntu), la méthode recommandée est d’utiliser le dépôt officiel de Docker. On ajoute la clé GPG, le dépôt, puis on installe le paquet.
# Ajouter la clé GPG et le dépôt officiel curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg echo "deb [signed-by=/usr/share/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ | sudo tee /etc/apt/sources.list.d/docker.list # Installer Docker Engine + Compose sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # Ajouter votre utilisateur au groupe docker (évite sudo) sudo usermod -aG docker $USER newgrp docker # Vérification docker version docker run hello-world
06 Écrire un Dockerfile
Chaque instruction ajoute une couche a l’image finale.
Docker construit l’image par empilement de couches. Les couches non modifiées sont réutilisées du cache lors des reconstructions.
# Image de base officielle FROM php:8.2-cli # Métadonnées LABEL maintainer="f4hxn@example.com" # Installer des dépendances système RUN apt-get update && apt-get install -y \ libzip-dev unzip \ && docker-php-ext-install zip \ && rm -rf /var/lib/apt/lists/* # Répertoire de travail dans le conteneur WORKDIR /app # Copier les fichiers de l'application COPY . . # Port que le service écoute EXPOSE 8080 # Commande exécutée au démarrage du conteneur CMD ["php", "-S", "0.0.0.0:8080", "-t", "public"]
07 Commandes essentielles
Les commandes Docker que l’on utilise au quotidien.
| Commande | Description |
|---|---|
| docker build -t monapp . | Construire une image depuis le Dockerfile du dossier courant, taguée monapp |
| docker run -d -p 8080:80 monapp | Lancer un conteneur en arrière-plan, port hôte 8080 → port conteneur 80 |
| docker ps | Lister les conteneurs en cours d’exécution |
| docker ps -a | Tous les conteneurs, y compris arrêtés |
| docker exec -it MON_ID bash | Ouvrir un shell interactif dans un conteneur vivant |
| docker logs -f MON_ID | Suivre les logs en temps réel |
| docker stop / rm MON_ID | Arrêter puis supprimer un conteneur |
| docker images | Lister les images locales |
| docker pull nginx:1.25 | Télécharger une image depuis Docker Hub |
| docker push mon-registry/monapp | Pousser une image vers un registry |
| docker volume ls | Lister les volumes persistants |
| docker network ls | Lister les réseaux Docker |
| docker system prune -a | Nettoyer images, conteneurs et volumes inutilisés |
08 Docker Compose : orchestrer plusieurs services
Un seul fichier YAML pour décrire et démarrer toute une pile applicative.
En production ou en homelab, une application est rarement un service unique. Un site web typique comprend un serveur web, un interpréteur PHP, une base de données et un cache. Docker Compose permet de décrire tous ces services dans un fichier compose.yaml et de les démarrer d’une seule commande.
services: # Serveur web nginx: image: nginx:1.25-alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf - ./public:/var/www/html depends_on: - php # Interpréteur PHP-FPM php: build: . volumes: - ./public:/var/www/html environment: - APP_ENV=production # Base de données db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: monapp volumes: - db_data:/var/lib/mysql # Cache Redis redis: image: redis:7-alpine volumes: db_data:
# Démarrer toute la pile en arrière-plan docker compose up -d # Voir l'état de tous les services docker compose ps # Logs de la pile entière docker compose logs -f # Arrêter et supprimer les conteneurs (volumes conservés) docker compose down # Tout reconstruire docker compose up -d --build
Avec Compose, tous les services communiquent via un réseau interne Docker. Seul Nginx est exposé vers l’extérieur sur le port 80.
09 Volumes et persistance des données
Par défaut un conteneur est éphémère : toutes ses données disparaissent à l’arrêt.
Pour conserver des données entre les redémarrages (base de données, uploads, configuration), on utilise des volumes. Docker propose trois mécanismes :
Volume nommé
Géré par Docker. Idéal pour les bases de données. db_data:/var/lib/mysql
Bind mount
Dossier de l’hôte monté dans le conteneur. Parfait pour le développement. ./src:/app
tmpfs
En mémoire RAM uniquement. Données non persistées, haute vitesse. Pour les secrets temporaires.
10 Réseaux Docker
Docker crée des réseaux virtuels pour isoler et connecter les conteneurs.
| Type de réseau | Comportement | Cas d’usage |
|---|---|---|
| bridge | Réseau privé par défaut. Les conteneurs communiquent entre eux par nom. | Applications multi-services (Compose) |
| host | Le conteneur partage directement la pile réseau de l’hôte. | Haute performance, monitoring réseau |
| none | Aucune interface réseau. Isolation totale. | Traitement hors-ligne, sécurité maximale |
| overlay | Réseau multi-hôtes (Docker Swarm / Kubernetes). | Clusters distribués |
| macvlan | Le conteneur obtient une adresse MAC / IP sur le réseau physique. | Intégration réseau locale (homelab, VLAN) |
11 Bonnes pratiques
Quelques règles simples pour des images propres et sécurisées.
-alpine ou -slim : php:8.2-fpm-alpine au lieu de php:8.2-fpm. La surface d’attaque et la taille sont réduites drastiquement.
RUN useradd -m appuser puis USER appuser. Un processus compromis ne dispose alors pas des droits root.
.gitignore, il exclut les fichiers inutiles du contexte de build : node_modules, .git, fichiers de log, .env…
# Exclure du contexte de build
.git
.env
*.log
node_modules
vendor
tests
*.md
.dockerignore
12 Glossaire rapide
| Terme | Définition |
|---|---|
| Daemon | Le service d’arrière-plan dockerd qui gère les conteneurs et images sur la machine hôte. |
| Registry | Dépôt d’images (Docker Hub, GHCR, votre propre registry avec Gitea/Harbor). |
| Tag | Version d’une image : nginx:1.25, monapp:latest, monapp:v2.3. |
| Layer | Couche immuable de l’image, chacune correspondant à une instruction du Dockerfile. |
| Namespace | Mécanisme Linux d’isolation (PID, réseau, montages…) sur lequel repose Docker. |
| cgroup | Mécanisme Linux de limitation de ressources (CPU, RAM) utilisé par Docker. |
| Docker Compose | Outil d’orchestration locale multi-conteneurs via un fichier YAML. |
| Docker Swarm | Orchestrateur natif de Docker pour clusters multi-serveurs (alternatif à Kubernetes). |
| Healthcheck | Instruction Dockerfile qui vérifie périodiquement que le service fonctionne. |
| Entrypoint | Commande principale du conteneur, toujours exécutée. CMD lui passe des arguments. |