L'essentiel de Docker

Guide pratique et concis pour maîtriser la conteneurisation. Des fondamentaux aux bonnes pratiques.

8 Chapitres
Niveau intermédiaire

Pourquoi la Conteneurisation ?

Fini le "ça marche sur ma machine" ! Docker standardise l'environnement d'exécution. Que vous soyez développeur ou sysadmin, les conteneurs garantissent que votre code s'exécutera de la même manière en dev, en test et en prod. C'est la brique fondamentale du DevOps moderne.

Sommaire

01

Découvrir Docker

Concepts fondamentaux de la conteneurisation

Qu'est-ce que Docker ?

Docker est une plateforme de conteneurisation qui permet d'empaqueter une application avec toutes ses dépendances dans une unité standardisée appelée conteneur.

Conteneur vs Machine Virtuelle

Conteneur VM
Partage le kernel hôte OS complet inclus
Démarrage en secondes Démarrage en minutes
Taille : quelques Mo Taille : plusieurs Go
Isolation au niveau processus Isolation complète

Architecture Docker

  • Docker Engine : le daemon qui gère les conteneurs
  • Docker CLI : l'interface en ligne de commande
  • Images : templates en lecture seule pour créer des conteneurs
  • Conteneurs : instances exécutables d'images
  • Registry : dépôt d'images (Docker Hub)
💡 À retenir Un conteneur = processus isolé avec son propre système de fichiers, réseau et espace de noms.
02

Installer Docker

Configuration sur différents systèmes

Installation sur Linux (Ubuntu/Debian)

Terminal
# Mise à jour et installation des dépendances
sudo apt update
sudo apt install -y ca-certificates curl gnupg

# Ajout de la clé GPG officielle
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

# Ajout du dépôt Docker
echo "deb [arch=$(dpkg --print-architecture) 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

# Installation de Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Windows & macOS

Téléchargez et installez Docker Desktop depuis docker.com. L'installation inclut :

  • Docker Engine
  • Docker CLI
  • Docker Compose
  • Interface graphique de gestion

Post-installation Linux

Terminal
# Ajouter l'utilisateur au groupe docker (évite sudo)
sudo usermod -aG docker $USER

# Appliquer les changements (ou se reconnecter)
newgrp docker

# Vérifier l'installation
docker --version
Docker version 24.0.7, build afdd53b

docker run hello-world
03

Utiliser Docker

Commandes essentielles au quotidien

Lancer un conteneur

Terminal
# Lancer un conteneur interactif
docker run -it ubuntu bash

# Lancer en arrière-plan (détaché)
docker run -d nginx

# Nommer le conteneur
docker run -d --name mon-nginx nginx

# Mapper un port (hôte:conteneur)
docker run -d -p 8080:80 nginx

# Supprimer automatiquement à l'arrêt
docker run --rm alpine echo "Hello"

Commandes de base

Commande Description
docker ps Lister les conteneurs en cours
docker ps -a Lister tous les conteneurs
docker stop ID Arrêter un conteneur
docker start ID Démarrer un conteneur arrêté
docker rm ID Supprimer un conteneur
docker logs ID Voir les logs
docker exec -it ID bash Entrer dans un conteneur
💡 Astuce Utilisez les premiers caractères de l'ID : docker stop a1b au lieu de l'ID complet.
04

Gérer les conteneurs

Cycle de vie et gestion avancée

Cycle de vie d'un conteneur

  • Created : conteneur créé mais pas démarré
  • Running : en cours d'exécution
  • Paused : processus suspendus
  • Stopped : arrêté (peut être redémarré)
  • Deleted : supprimé définitivement

Inspecter et débugger

Terminal
# Infos détaillées (JSON)
docker inspect mon-conteneur

# Logs en temps réel
docker logs -f mon-conteneur

# Statistiques d'utilisation
docker stats

# Processus dans le conteneur
docker top mon-conteneur

# Copier des fichiers
docker cp fichier.txt mon-conteneur:/app/
docker cp mon-conteneur:/app/log.txt ./

Limiter les ressources

Terminal
# Limiter la mémoire
docker run -d --memory 512m nginx

# Limiter le CPU
docker run -d --cpus 0.5 nginx

# Politique de redémarrage
docker run -d --restart always nginx
docker run -d --restart on-failure:3 nginx
05

Maîtriser les images

Créer et gérer des images Docker

Gestion des images

Terminal
# Télécharger une image
docker pull nginx:latest

# Lister les images locales
docker images

# Supprimer une image
docker rmi nginx

# Nettoyer les images non utilisées
docker image prune -a

Créer une image avec Dockerfile

Dockerfile
# Image de base
FROM node:18-alpine

# Répertoire de travail
WORKDIR /app

# Copie des fichiers de dépendances
COPY package*.json ./

# Installation des dépendances
RUN npm ci --only=production

# Copie du code source
COPY . .

# Port exposé
EXPOSE 3000

# Commande de démarrage
CMD ["node", "server.js"]

Construire et publier

Terminal
# Build l'image
docker build -t mon-app:1.0 .

# Tagger pour Docker Hub
docker tag mon-app:1.0 username/mon-app:1.0

# Se connecter à Docker Hub
docker login

# Publier l'image
docker push username/mon-app:1.0
⚠️ Important Ajoutez un fichier .dockerignore pour exclure node_modules, .git, etc.
06

Gérer les volumes

Persistance et partage de données

Types de stockage

Type Usage Exemple
Volume Données persistantes gérées par Docker -v data:/app/data
Bind mount Partage de fichiers hôte ↔ conteneur -v ./src:/app/src
tmpfs Données temporaires en RAM --tmpfs /tmp

Volumes Docker

Terminal
# Créer un volume
docker volume create mes-donnees

# Lister les volumes
docker volume ls

# Utiliser un volume
docker run -d -v mes-donnees:/var/lib/mysql mysql

# Inspecter un volume
docker volume inspect mes-donnees

# Supprimer les volumes orphelins
docker volume prune

Bind mounts (développement)

Terminal
# Monter le dossier courant
docker run -d -v $(pwd):/app node:18

# Syntaxe longue (plus explicite)
docker run -d \
  --mount type=bind,source=$(pwd)/src,target=/app/src \
  node:18

# Volume en lecture seule
docker run -v ./config:/app/config:ro nginx
💡 Best Practice Utilisez des volumes nommés en production, des bind mounts en développement.
07

Configurer le réseau

Communication entre conteneurs

Types de réseaux

Driver Description
bridge Réseau isolé par défaut (communication via IP)
host Partage le réseau de l'hôte (pas d'isolation)
none Aucun réseau
overlay Communication multi-hôtes (Swarm)

Créer un réseau personnalisé

Terminal
# Créer un réseau
docker network create mon-reseau

# Lancer des conteneurs sur ce réseau
docker run -d --name db --network mon-reseau mysql
docker run -d --name app --network mon-reseau node-app

# Les conteneurs peuvent se joindre par leur nom
# L'app peut accéder à MySQL via "db:3306"

Exposer les ports

Terminal
# Port spécifique
docker run -p 8080:80 nginx

# Plusieurs ports
docker run -p 80:80 -p 443:443 nginx

# Port aléatoire sur l'hôte
docker run -P nginx

# Restreindre à localhost
docker run -p 127.0.0.1:8080:80 nginx
💡 DNS intégré Sur un réseau custom, Docker fournit un DNS : les conteneurs se trouvent par leur nom.
08

Docker Compose

Orchestrer plusieurs conteneurs

Le fichier docker-compose.yml

Définissez votre infrastructure dans un fichier YAML.

docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - app-net

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-net

volumes:
  db-data:

networks:
  app-net:

Commandes Compose

Terminal
# Démarrer toute la stack (détaché)
docker compose up -d

# Arrêter et supprimer les conteneurs
docker compose down

# Voir les logs de toute la stack
docker compose logs -f

# Reconstruire les images si Dockerfile a changé
docker compose up -d --build
09

Compose Avancé

Environnements et dépendances

Gestion des dépendances

Attendre qu'un service soit réellement prêt (pas juste démarré).

docker-compose.yml
services:
  web:
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

Profils & Variables

.env
APP_PORT=3000
DB_PASSWORD=secure_pass
docker-compose.yml
services:
  tools:
    profiles: ["debug"]  # Ne démarre que si --profile debug
    image: adminer

  web:
    ports:
      - "${APP_PORT}:80"
10

Intro Orchestration

Au-delà du conteneur unique

Swarm vs Kubernetes

Feature Docker Swarm Kubernetes (K8s)
Complexité Faible (Intégré à Docker) Élevée (Courbe d'apprentissage)
Installation docker swarm init Cluster complexe (Minikube, K3s)
Usage idéal PME, Projets simples Enterprise, Cloud Scale
💡 Concepts Clés
  • Node : Serveur du cluster (Manager ou Worker).
  • Service : Définition de l'état désiré (ex: 3 répliques de Nginx).
  • Replica : Instance d'un conteneur qui tourne sur un Node.
11

Sécurité & Optimisation

Production Ready

Optimiser les images

  • Utiliser des images Alpine (légères)
  • Grouper les commandes RUN pour réduire les layers
  • Placer les instructions qui changent peu en premier (cache)
  • Utiliser le multi-stage build pour séparer build et runtime
Dockerfile (Multi-stage)
# Étape 1 : Build
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Étape 2 : Image finale légère
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]

Sécurité

  • Ne pas exécuter en root : utiliser USER
  • Scanner les images : docker scout
  • Utiliser des images officielles et les maintenir à jour
  • Ne jamais stocker de secrets dans l'image
  • Activer les healthchecks
Dockerfile
FROM node:18-alpine

# Créer un utilisateur non-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

WORKDIR /app
COPY --chown=appuser:appgroup . .

# Healthcheck
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -q --spider http://localhost:3000/health || exit 1

CMD ["node", "server.js"]

Commandes de nettoyage

Terminal
# Supprimer tous les conteneurs arrêtés
docker container prune

# Supprimer les images orphelines
docker image prune

# Nettoyage complet (attention !)
docker system prune -a --volumes

# Voir l'espace disque utilisé
docker system df
⚠️ Production Toujours spécifier un tag précis (nginx:1.25) plutôt que latest.

Testez vos connaissances