Docker pour les débutants : Un guide pratique de démarrage
· 12 min de lecture
📑 Table des matières
- Qu'est-ce que Docker et pourquoi devriez-vous vous en soucier ?
- Concepts clés : Images, conteneurs et Dockerfiles
- Installer Docker sur votre système
- Commandes Docker essentielles dont chaque développeur a besoin
- Écrire votre premier Dockerfile
- Docker Compose pour les applications multi-conteneurs
- Volumes : Persister les données au-delà des cycles de vie des conteneurs
- Fondamentaux du réseau Docker
- Meilleures pratiques prêtes pour la production
- Débogage et dépannage des problèmes courants
- Outils et intégrations populaires
- Questions fréquemment posées
Docker a révolutionné le développement logiciel en résolvant le fameux problème « ça marche sur ma machine ». Au lieu d'installer des dépendances directement sur votre système et de gérer des conflits de versions, Docker emballe tout ce dont votre application a besoin dans des conteneurs isolés qui s'exécutent de manière identique partout—de votre ordinateur portable aux serveurs de production.
Si vous n'avez pas encore appris Docker en 2026, c'est le moment. C'est devenu la norme de facto pour le déploiement d'applications, utilisé par plus de 13 millions de développeurs dans le monde et intégré dans pratiquement tous les flux de travail de développement modernes.
Qu'est-ce que Docker et pourquoi devriez-vous vous en soucier ?
Docker est une plateforme de conteneurisation qui enveloppe votre application et toutes ses dépendances dans une unité standardisée appelée conteneur. Considérez-le comme un package léger et portable qui inclut tout ce qui est nécessaire pour exécuter votre logiciel : code, environnement d'exécution, outils système, bibliothèques et paramètres.
Avant Docker, les développeurs faisaient face à des incohérences d'environnement constantes. Votre application Node.js pouvait fonctionner parfaitement sur votre MacBook avec Node 18, mais planter sur la machine Windows de votre collègue exécutant Node 16. Ou pire, elle fonctionnerait en développement mais échouerait mystérieusement en production à cause de différences subtiles dans les bibliothèques système.
Docker élimine ces maux de tête en créant des environnements cohérents et reproductibles. Lorsque vous conteneurisez une application, vous garantissez qu'elle se comportera de la même manière quel que soit l'endroit où elle s'exécute.
Principaux avantages de l'utilisation de Docker
- Cohérence entre les environnements : Le développement, la préproduction et la production exécutent tous des conteneurs identiques
- Intégration plus rapide : Les nouveaux membres de l'équipe peuvent commencer à contribuer en quelques minutes au lieu de passer des jours à configurer leur environnement
- Isolation : Exécutez plusieurs projets avec des dépendances conflictuelles sur la même machine sans interférence
- Utilisation efficace des ressources : Les conteneurs partagent le noyau du système d'exploitation hôte, ce qui les rend beaucoup plus légers que les machines virtuelles
- Déploiement simplifié : Livrez toute votre pile d'applications comme un seul artefact
- Architecture de microservices : Divisez les applications monolithiques en services gérables et déployables indépendamment
Conseil de pro : Docker n'est pas seulement pour les déploiements en production. De nombreux développeurs l'utilisent pour exécuter des bases de données, des couches de mise en cache et d'autres services localement sans encombrer leur système avec des installations. Besoin de PostgreSQL pour un projet et de MySQL pour un autre ? Exécutez les deux dans des conteneurs sans conflits.
Concepts clés : Images, conteneurs et Dockerfiles
Comprendre trois concepts fondamentaux est essentiel avant de plonger dans les commandes et les flux de travail Docker.
Images Docker
Une image est un modèle en lecture seule qui contient tout ce qui est nécessaire pour exécuter une application. Considérez-la comme une classe en programmation orientée objet—c'est un plan, pas une instance en cours d'exécution.
Les images sont construites en couches, chaque couche représentant un changement ou une instruction. Cette architecture en couches permet un stockage et un transfert efficaces car Docker n'a besoin de télécharger ou de stocker que les couches qui ont changé.
Vous pouvez extraire des images pré-construites depuis Docker Hub (le registre officiel) ou créer vos propres images personnalisées. Les images de base populaires incluent node, python, nginx, postgres et redis.
Conteneurs Docker
Un conteneur est une instance en cours d'exécution d'une image—comme un objet instancié à partir d'une classe. Une image peut générer plusieurs conteneurs, chacun s'exécutant indépendamment avec son propre système de fichiers isolé, réseau et espace de processus.
Les conteneurs sont éphémères par conception. Lorsque vous arrêtez et supprimez un conteneur, toutes les données écrites à l'intérieur disparaissent sauf si vous avez explicitement configuré un stockage persistant à l'aide de volumes (plus d'informations à ce sujet plus tard).
Dockerfiles
Un Dockerfile est un fichier texte contenant des instructions pour construire une image Docker. C'est essentiellement une recette qui indique à Docker comment assembler votre environnement d'application étape par étape.
Chaque instruction dans un Dockerfile crée une nouvelle couche dans l'image. Docker met en cache ces couches intelligemment, donc reconstruire une image ne traite que les couches qui ont changé—rendant les constructions ultérieures extrêmement rapides.
Voici un Dockerfile minimal pour une application Node.js :
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Décomposons ce que fait chaque instruction :
FROMspécifie l'image de base (Node.js 20 sur Alpine Linux, une distribution minimale)WORKDIRdéfinit le répertoire de travail à l'intérieur du conteneurCOPYtransfère des fichiers de votre machine hôte dans le conteneurRUNexécute des commandes pendant le processus de construction (installation des dépendances)EXPOSEdocumente sur quel port l'application écouteCMDdéfinit la commande par défaut à exécuter lors du démarrage d'un conteneur
Installer Docker sur votre système
L'installation de Docker varie légèrement selon le système d'exploitation, mais le processus est simple sur toutes les principales plateformes.
macOS et Windows
Téléchargez et installez Docker Desktop depuis le site officiel. Docker Desktop inclut tout ce dont vous avez besoin : le moteur Docker, l'interface CLI Docker, Docker Compose et une interface graphique conviviale pour gérer les conteneurs.
Après l'installation, Docker Desktop s'exécute en arrière-plan et ajoute une icône de barre de menu (macOS) ou une icône de barre d'état système (Windows) pour un accès rapide aux paramètres et aux conteneurs en cours d'exécution.
Linux
Sur Linux, installez Docker Engine directement en utilisant le gestionnaire de paquets de votre distribution. Pour Ubuntu/Debian :
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
Déconnectez-vous et reconnectez-vous pour que l'appartenance au groupe prenne effet, vous permettant d'exécuter des commandes Docker sans sudo.
Vérification de l'installation
Confirmez que Docker fonctionne correctement en exécutant :
docker --version
docker run hello-world
La deuxième commande extrait une petite image de test et l'exécute dans un conteneur. Si vous voyez un message de bienvenue, Docker est installé et fonctionne correctement.
Commandes Docker essentielles dont chaque développeur a besoin
Maîtriser une poignée de commandes de base couvrira 90 % de votre utilisation quotidienne de Docker. Voici un tableau de référence complet :
| Commande | Ce qu'elle fait | Options courantes |
|---|---|---|
docker build -t myapp . |
Construire une image à partir d'un Dockerfile dans le répertoire actuel | -t étiquette l'image avec un nom |
docker run myapp |
Créer et démarrer un conteneur à partir d'une image | -d (détaché), -p (mappage de port), --name |
docker ps |
Lister les conteneurs en cours d'exécution | -a affiche tous les conteneurs (y compris arrêtés) |
docker stop [id] |
Arrêter gracieusement un conteneur en cours d'exécution | Utiliser l'ID ou le nom du conteneur |
docker rm [id] |
Supprimer un conteneur arrêté | -f force la suppression des conteneurs en cours d'exécution |
docker images |
Lister toutes les images sur votre système | -a affiche les images intermédiaires |
docker rmi [image] |
Supprimer une image | -f force la suppression |
docker logs [id] |
Afficher la sortie et les journaux du conteneur | -f suit la sortie des journaux en temps réel |
docker exec -it [id] sh |
Ouvrir un shell interactif à l'intérieur d'un conteneur en cours d'exécution | -it active le terminal interactif |
docker pull [image] |
Télécharger une image depuis un registre | Spécifier l'étiquette comme nginx:1.25 |
docker compose up |
Démarrer tous les services définis dans docker-compose.yml | -d s'exécute en arrière-plan |
docker compose down |
Arrêter et supprimer tous les conteneurs du fichier compose | -v supprime également les volumes |
Exemples de commandes pratiques
Exécuter un conteneur avec mappage de port et variables d'environnement :
docker run -d \
--name my-postgres \
-p 5432:5432 \
-e POSTGRES_PASSWORD=secret \
postgres:16
Cela démarre PostgreSQL en arrière-plan, mappe le port 5432 à votre machine hôte et définit le mot de passe de la base de données.
Afficher les journaux en temps réel d'un conteneur :
docker logs -f my-postgres
Exécuter des commandes à l'intérieur d'un conteneur en cours d'exécution :
docker exec -it my-postgres psql -U postgres
Cela ouvre un shell PostgreSQL interactif à l'intérieur du conteneur.
Conseil rapide : Vous n'avez pas besoin de taper les ID de conteneur complets. Docker accepte les préfixes uniques, donc si votre ID de conteneur est a3f8b2c1d4e5, vous pouvez utiliser docker stop a3f tant qu'aucun autre ID de conteneur ne commence par ces caractères.
Écrire votre premier Dockerfile
Construisons un Dockerfile complet pour une application Node.js du monde réel, en expliquant chaque décision en cours de route.
# Utiliser une version spécifique de Node.js sur Alpine Linux (taille d'image plus petite)
FROM node:20-alpine
# Installer les dépendances système si nécessaire
RUN apk add --no-cache python3 make g++
# Définir le répertoire de travail
WORKDIR /app
# Copier d'abord les fichiers de package (pour une meilleure mise en cache des couches)
COPY package*.json ./
# Installer uniquement les dépendances de production
RUN npm ci --production --silent
# Copier le code source de l'application
COPY . .
# Créer un utilisateur non-root pour la sécurité
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001 && \
chown -R nodejs:nodejs /app
# Basculer vers l'utilisateur non-root
USER nodejs
# Exposer le port de l'application
EXPOSE 3000
# Vérification de santé pour surveiller l'état du conteneur
HEALTHCHECK --interval=30s --timeout=3s \
CMD node healthcheck.js || exit 1
# Démarrer l'application
CMD ["node", "server.js"]
Meilleures pratiques pour les Dockerfiles
L'ordre compte pour l'efficacité de la mise en cache. Placez les instructions qui changent fréquemment (comme COPY . .) près de la fin de votre Dockerfile. De cette façon, Docker peut réutiliser les couches mises en cache pour l'installation des dépendances lorsque seul votre code source change.
Utilisez des fichiers .dockerignore pour exclure les fichiers inutiles du contexte de construction :
node_modules
npm-debug.log
.git
.env
*.md
.DS_Store
Cela accélère les constructions et réduit la taille de l'image en empêchant Docker de copier des fichiers dont vous n'avez pas besoin dans le conteneur.
Constructions multi-étapes
Pour les langages compilés ou les applications nécessitant des outils de construction, utilisez des constructions multi-étapes pour garder les images finales petites :
# Étape de construction
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Étape de production
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY --from=builder /app/dist ./dist
USER node
CMD ["node", "dist/server.js"]
L'image finale ne contient que les dépendances de production et les artefacts compilés, pas les outils de construction ou le code source.
Docker Compose pour les applications multi-conteneurs
Les applications du monde réel se composent rarement d'un seul service. Vous avez généralement besoin d'une application web, d'une base de données, d'un cache, d'une file d'attente de messages et d'autres services de support. Docker Compose vous permet de définir et de gérer des applications multi-conteneurs à l'aide d'un seul fichier de configuration YAML.
Voici un docker-compose.yml complet pour une pile d'applications web typique :
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
volumes:
- ./logs:/app/logs
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=secret
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: unless-stopped
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redisdata:/data
restart: unless-stopped
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
restart: unless-stopped
volumes:
pgdata:
redisdata:
Travailler avec Docker Compose
Démarrer tous les services en arrière-plan :
dock