Introduction : La Fin du « Ça marche sur ma machine »
Dans le monde du développement logiciel, l’un des problèmes les plus frustrants est l’incohérence des environnements. Un développeur écrit du code qui fonctionne parfaitement sur son ordinateur, mais qui échoue une fois déployé sur le serveur de production. Les raisons ? Des versions de bibliothèques différentes, des configurations système divergentes, ou des dépendances manquantes.
Docker est arrivé en 2013 pour résoudre ce problème. C’est une plateforme open-source qui permet de développer, expédier et exécuter des applications dans des conteneurs.
Cet article a pour but de vous fournir une compréhension approfondie de Docker, de ses concepts fondamentaux à ses meilleures pratiques.
1. Qu’est-ce que Docker ?
Docker est un outil de conteneurisation. Pour bien comprendre, il faut le distinguer de la virtualisation traditionnelle.
Virtualisation vs Conteneurisation
Machines Virtuelles (VM) : Chaque VM inclut un système d’exploitation complet (Guest OS), des binaires, des bibliothèques et l’application. C’est lourd (plusieurs Go) et lent à démarrer (minutes).
Conteneurs Docker : Les conteneurs partagent le noyau (kernel) du système d’exploitation de l’hôte (Host OS). Ils n’emballent que l’application et ses dépendances. C’est léger (quelques Mo) et instantané (secondes).
Analogie :
La VM, c’est comme construire une maison individuelle avec ses propres fondations et sa propre chaudière.
Le Conteneur, c’est comme un appartement dans un immeuble. Vous partagez les fondations et la chaudière (le Kernel), mais vous avez votre propre espace privé et sécurisé.
2. Les Concepts Fondamentaux
Pour utiliser Docker, il faut maîtriser quatre concepts clés :
A. L’Image Docker
Une image est un modèle en lecture seule. C’est le « plan » ou le « template » utilisé pour créer des conteneurs. Elle contient le code, les bibliothèques, les variables d’environnement et les fichiers de configuration.
Exemple : nginx:latest, python:3.9, ubuntu:20.04.

B. Le Conteneur
Un conteneur est une instance exécutable d’une image. Vous pouvez créer, démarrer, arrêter, déplacer ou supprimer un conteneur. Par défaut, un conteneur est bien isolé du reste de la machine.
Relation : L’Image est la classe (en programmation orientée objet), le Conteneur est l’objet (l’instance).
C. Le Dockerfile
C’est un fichier texte contenant une série d’instructions pour construire automatiquement une image Docker.
Exemple d’instructions : FROM, RUN, COPY, CMD.
D. Le Registry (Registre)
C’est un endroit où stocker et partager des images.
Docker Hub : Le registre public par défaut (comme le GitHub des images).
Registry Privé : Pour les entreprises qui ne veulent pas exposer leur code (ex: AWS ECR, GitLab Registry).
3. Architecture de Docker
Docker fonctionne selon une architecture Client-Serveur.
Docker Client : La commande que vous tapez dans le terminal (docker run, docker build).
Docker Daemon (dockerd) : Le serveur qui écoute les requêtes du client. C’est lui qui gère la construction, l’exécution et la distribution des conteneurs.
Docker Registry : Le stockage des images.
4. Commandes Essentielles (Cheat Sheet)
Voici les commandes que vous utiliserez 90% du temps.
Gestion des Conteneurs
# Lancer un conteneur (télécharge l’image si absente)
docker run <nom_image>
# Lancer en arrière-plan (detached mode) avec un nom
docker run -d –nom_mon_app <nom_image>
# Lister les conteneurs en cours d’exécution
docker ps
# Lister TOUS les conteneurs (y compris arrêtés)
docker ps -a
# Arrêter un conteneur
docker stop <id_conteneur>
# Supprimer un conteneur arrêté
docker rm <id_conteneur>
# Voir les logs en temps réel
docker logs -f <id_conteneur>
# Exécuter une commande dans un conteneur en cours (ex: ouvrir un shell)
docker exec -it <id_conteneur> bash
Gestion des Images
# Lister les images locales
docker images
# Télécharger une image sans la lancer
docker pull <nom_image>
# Supprimer une image
docker rmi <id_image>
# Construire une image depuis un Dockerfile
docker build -t <mon_nom_image> .
Nettoyage
# Supprimer tous les conteneurs arrêtés, réseaux inutilisés et images orphelines
docker system prune
5. Sous le capot : Comment ça marche ?
Docker n’est pas magique, il utilise des fonctionnalités du noyau Linux :
Namespaces (Isolation) : Ils permettent d’isoler les ressources. Un conteneur a son propre espace de processus (PID), son propre réseau, ses propres points de montage, etc. Il ne « voit » pas les processus des autres conteneurs.
Cgroups (Contrôle des ressources) : Ils limitent la quantité de ressources (CPU, RAM) qu’un conteneur peut utiliser. Cela empêche un conteneur de faire planter la machine hôte en consommant toute la mémoire.
Union File System (Couches) : Les images sont constituées de couches en lecture seule. Quand un conteneur est lancé, une couche writable (inscriptible) est ajoutée au-dessus. Cela permet de partager des couches communes entre plusieurs images (gain de place).
6. Gestion des Données : Les Volumes
Par défaut, les données créées à l’intérieur d’un conteneur sont éphémères. Si vous supprimez le conteneur, les données sont perdues. Pour persister les données (ex: base de données), on utilise des Volumes.
# Monter un dossier local dans le conteneur
docker run -v /chemin/local:/chemin/dans/conteneur <image>
/chemin/local : Sur votre machine hôte.
/chemin/dans/conteneur : Où l’application écrit ses données.
7. Orchestration Multi-Conteneurs : Docker Compose
Une application moderne comprend souvent plusieurs services (ex: un Backend, un Frontend, une Base de données). Lancer chaque conteneur manuellement avec des commandes docker run complexes est fastidieux.
Docker Compose permet de définir tous les services dans un fichier docker-compose.yml.
Exemple docker-compose.yml :
version: ‘3’
services:
web:
build: .
ports:
– « 5000:5000 »
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
Commandes :
docker-compose up -d : Lance tout l’environnement.
docker-compose down : Arrête et nettoie tout.
8. Bonnes Pratiques et Sécurité
Pour produire des images Docker professionnelles, suivez ces règles :
Utilisez des images officielles et légères : Préférez alpine ou slim (ex: node:alpine) pour réduire la taille et la surface d’attaque.
Multi-stage Builds : Compilez votre code dans une image temporaire, et ne copiez que le binaire final dans l’image de production. Cela réduit considérablement la taille finale.
Ne jamais tourner en root : Créez un utilisateur spécifique dans le Dockerfile pour exécuter l’application. Cela limite les dégâts en cas de piratage du conteneur.
Utilisez .dockerignore : Comme .gitignore, ce fichier empêche d’inclure des fichiers inutiles (logs, .git, secrets) dans l’image.
Scan de sécurité : Utilisez des outils comme Trivy ou Docker Scan pour détecter les vulnérabilités dans vos images.
Variables d’environnement : Ne jamais coder en dur des mots de passe dans le Dockerfile. Utilisez des variables d’environnement (ENV) ou des secrets.
9. L’Écosystème et l’Avenir
Docker a révolutionné le déploiement, mais il ne s’arrête pas là.
Kubernetes (K8s) : Docker gère un conteneur sur une machine. Kubernetes gère des milliers de conteneurs sur un cluster de machines. C’est le standard actuel pour l’orchestration en production. Docker a créé Docker Swarm (son propre orchestrateur), mais Kubernetes est largement préféré par l’industrie.
Serverless & FaaS : La conteneurisation est la base technologique derrière beaucoup de solutions serverless (AWS Lambda, etc.).
Note technique : Depuis 2020, Docker utilise containerd en interne, et sur Linux, Kubernetes utilise désormais containerd ou CRI-O directement plutôt que le moteur Docker complet, mais la commande docker reste l’outil standard pour les développeurs.
Conclusion
Docker est devenu un incontournable du développement moderne. Il offre :
Portabilité : « Build once, run anywhere ».
Isolation : Pas de conflits de dépendances.
Efficacité : Meilleure utilisation des ressources serveur.
CI/CD : Facilite l’automatisation des tests et des déploiements.
Maîtriser Docker est aujourd’hui une compétence essentielle pour tout développeur, administrateur système ou ingénieur DevOps. Commencez par conteneuriser vos petits projets personnels, expérimentez avec Docker Compose, et vous verrez rapidement votre flux de travail se transformer.

Prêt à commencer ? Installez Docker Desktop et tapez votre premier docker run hello-world.



















