Docker pour les débutants : Un guide pratique de démarrage

· 12 min de lecture

📑 Table des matières

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

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 :

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