Aller au contenu principal
Débutant 10 chapitres

🐳 Docker & Conteneurs — Le guide complet

Formation Docker complĂšte : des bases de la conteneurisation Ă  la production. Dockerfile, Docker Compose, orchestration, bonnes pratiques DevOps. Guide pratique avec exercices.

Progression 10 chapitres

Programme

1

Pourquoi Docker ? Les conteneurs expliqués Gratuit

Découvre ce que sont les conteneurs, comment ils se distinguent des machines virtuelles et comprends l'architecture Docker.

2

Tes premiĂšres commandes Docker

Prends en main Docker avec tes premiĂšres commandes : docker run, pull, ps, images, exec et le cycle de vie des conteneurs.

3

Ton premier Dockerfile

Apprends à écrire un Dockerfile avec les instructions essentielles : FROM, COPY, RUN, CMD et docker build.

4

Dockerfile avancé : multi-stage et optimisation

Maßtrise les multi-stage builds, l'optimisation des layers, le cache Docker et les bonnes pratiques pour des images légÚres.

5

Docker Compose : orchestrer tes services

Découvre Docker Compose : docker-compose.yml, services, up/down et ton premier projet multi-conteneurs.

6

Compose avancé : volumes, réseaux et scaling

Approfondis Compose avec les variables d'environnement, les profiles, les healthchecks et les bonnes pratiques.

7

Docker en production : logs et healthchecks

Configure Docker pour la production : conteneurs rootless, limites de ressources, health checks, logging et secrets.

8

Déploiement et CI/CD avec Docker

Scanne tes images avec Trivy, monitore tes conteneurs et applique la checklist production Docker.

9

Sécurité Docker : rootless et isolation

Sécurise tes conteneurs avec le mode rootless, Seccomp et AppArmor pour une isolation maximale.

10

Scanning et conformité Docker

Scanne tes images avec Trivy et Snyk, signe-les avec Docker Content Trust et audite ta config avec le CIS Benchmark.

Introduction — Pourquoi Docker est incontournable en 2026

Si tu travailles dans l’IT en 2026 et que tu ne maĂźtrises pas Docker, tu passes Ă  cĂŽtĂ© d’un outil fondamental. Ce n’est pas une mode passagĂšre — Docker a redĂ©fini la façon dont on construit, distribue et exĂ©cute des applications depuis plus de 10 ans maintenant, et son adoption ne fait que croĂźtre.

Les chiffres parlent d’eux-mĂȘmes : plus de 20 millions de dĂ©veloppeurs utilisent Docker au quotidien. Docker Hub hĂ©berge des millions d’images. Pratiquement toute pipeline CI/CD moderne repose sur des conteneurs. Kubernetes, le standard de l’orchestration, s’appuie sur des conteneurs Docker (ou compatibles OCI). Bref, Docker est devenu le socle sur lequel repose l’infrastructure moderne.

Mais concrùtement, c’est quoi un conteneur ?

Un conteneur, c’est une unitĂ© d’exĂ©cution lĂ©gĂšre et isolĂ©e qui embarque tout ce dont une application a besoin pour tourner : le code, les dĂ©pendances, les librairies systĂšme, la configuration. Contrairement Ă  une machine virtuelle, un conteneur ne virtualise pas un OS complet — il partage le noyau Linux de la machine hĂŽte tout en maintenant une isolation au niveau des processus, du rĂ©seau et du systĂšme de fichiers.

graph TB
    subgraph Host["Machine HĂŽte Linux"]
        subgraph Containers["Conteneurs"]
            A["App A
Node 20
Alpine"] B["App B
Python 3
Debian"] C["App C
Go 1.22
Scratch"] end Engine["Docker Engine"] Kernel["Noyau Linux"] end Containers --> Engine Engine --> Kernel style Host fill:#1a2332,stroke:#dc2626,color:#f1f5f9 style A fill:#1a2332,stroke:#3b82f6,color:#f1f5f9 style B fill:#1a2332,stroke:#22c55e,color:#f1f5f9 style C fill:#1a2332,stroke:#f59e0b,color:#f1f5f9 style Engine fill:#1a2332,stroke:#a855f7,color:#f1f5f9 style Kernel fill:#1a2332,stroke:#64748b,color:#f1f5f9 style Containers fill:#0f172a,stroke:#475569,color:#f1f5f9

RĂ©sultat : tu dĂ©marres un conteneur en millisecondes (pas en minutes comme une VM), tu en exĂ©cutes des dizaines sur un laptop, et tu as la garantie que ce qui tourne en dev tournera exactement pareil en prod. Le fameux “ça marche sur ma machine” ? Avec Docker, ça marche partout.

Ce que cette formation va t’apporter

Cette formation Docker est conçue pour t’emmener du niveau zĂ©ro Ă  la mise en production, de façon progressive et pratique. Chaque chapitre est pensĂ© pour ĂȘtre suivi dans l’ordre, mais tu peux aussi piocher selon tes besoins si tu as dĂ©jĂ  des bases.

À la fin de ce parcours, tu seras capable de :

  • Comprendre le fonctionnement interne de Docker (namespaces, cgroups, union filesystem)
  • Construire des images Docker optimisĂ©es avec des Dockerfiles multi-stage
  • Orchestrer des stacks complĂštes avec Docker Compose
  • DĂ©ployer en production avec les bonnes pratiques de sĂ©curitĂ© et de performance
  • DĂ©bugger efficacement quand ça plante (et ça va planter, c’est normal)

Prérequis

Avant de plonger dans Docker, assure-toi d’avoir ces bases :

Compétences requises

CompétenceNiveauPourquoi
Linux / ligne de commandeIntermĂ©diaireDocker repose sur Linux. Tu dois ĂȘtre Ă  l’aise avec cd, ls, cat, les permissions, les pipes
Réseau TCP/IPBasesComprendre les ports, DNS, HTTP aide énormément pour le networking Docker
Un langage de programmationDĂ©butant+Pour Ă©crire les apps que tu vas conteneuriser — peu importe le langage
GitBasesPour versionner tes Dockerfiles et docker-compose.yml

Environnement technique

  • Docker Desktop (Mac/Windows) ou Docker Engine (Linux) — version 24+ recommandĂ©e
  • Un Ă©diteur de code avec support YAML/Dockerfile (VS Code avec l’extension Docker est parfait)
  • Un terminal — iTerm2, Windows Terminal, ou le terminal intĂ©grĂ© de ton Ă©diteur
  • 8 Go de RAM minimum — Docker consomme de la mĂ©moire, surtout avec plusieurs conteneurs

Installation rapide

# Linux (Ubuntu/Debian)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Déconnexion/reconnexion nécessaire pour le groupe

# Vérification
docker --version
docker run hello-world
# macOS — via Homebrew
brew install --cask docker
# Lancer Docker Desktop, attendre que le daemon démarre

docker --version
docker compose version

Durée estimée

ParcoursDurée
Lecture complĂšte~12 heures
Avec exercices pratiques~20 heures
MaĂźtrise approfondie~40 heures (inclut projets personnels)

Niveau : DĂ©butant → IntermĂ©diaire avancĂ©


Parcours de formation

Cette formation se dĂ©coupe en 10 chapitres progressifs. Chaque chapitre s’appuie sur le prĂ©cĂ©dent — je te recommande de les suivre dans l’ordre la premiĂšre fois.

graph LR
    Ch1["Ch.1
Intro & Concepts
~3h"] --> Ch2["Ch.2
Dockerfile & Images
~4h"] Ch2 --> Ch3["Ch.3
Docker Compose
~3h"] Ch3 --> Ch4["Ch.4
Production & Sécurité
~3h"] style Ch1 fill:#1a2332,stroke:#3b82f6,color:#f1f5f9 style Ch2 fill:#1a2332,stroke:#22c55e,color:#f1f5f9 style Ch3 fill:#1a2332,stroke:#f59e0b,color:#f1f5f9 style Ch4 fill:#1a2332,stroke:#dc2626,color:#f1f5f9

Chapitre 1 — Introduction à Docker et aux conteneurs

📖 AccĂ©der au cours complet — Chapitre 1

De quoi parle ce chapitre ?

Ce premier chapitre pose les fondations. Avant de taper la moindre commande Docker, tu dois comprendre pourquoi les conteneurs existent et comment ils fonctionnent sous le capot. Sans cette comprĂ©hension, tu utiliseras Docker comme une boĂźte noire — et tu seras perdu dĂšs que quelque chose ne marchera pas comme prĂ©vu.

On commence par l’histoire : des chroots Unix des annĂ©es 80 aux namespaces Linux, en passant par LXC et l’arrivĂ©e de Docker en 2013. Cette perspective historique n’est pas du remplissage — elle t’aide Ă  comprendre que Docker n’a pas inventĂ© la conteneurisation, il l’a rendue accessible. Et cette nuance est importante quand on compare Docker Ă  ses alternatives (on y reviendra).

Ensuite, on plonge dans les mĂ©canismes Linux qui rendent les conteneurs possibles. Les namespaces fournissent l’isolation (PID, network, mount, user
). Les cgroups contrĂŽlent les ressources (CPU, mĂ©moire, I/O). L’union filesystem (OverlayFS) permet le systĂšme de couches des images Docker. Comprendre ces trois piliers, c’est comprendre Docker.

Enfin, on installe Docker proprement sur diffĂ©rents OS et on lance nos premiers conteneurs. Tu verras la diffĂ©rence entre une image et un conteneur, tu comprendras le cycle de vie d’un conteneur, et tu maĂźtriseras les commandes de base.

Ce que tu vas apprendre

  • L’architecture client-serveur de Docker (CLI → daemon → containerd → runc)
  • La diffĂ©rence fondamentale entre conteneur et machine virtuelle
  • Les namespaces Linux et leur rĂŽle dans l’isolation
  • Les cgroups et la gestion des ressources
  • Installation et configuration de Docker sur Linux, macOS et Windows
  • Les commandes essentielles : run, ps, logs, exec, stop, rm
  • Le concept d’image et de registre (Docker Hub)

Extrait de code clé

# Ton premier conteneur — mode interactif
docker run -it ubuntu:24.04 bash

# À l'intĂ©rieur du conteneur
cat /etc/os-release    # Ubuntu 24.04 mĂȘme si ton hĂŽte est sur Fedora
hostname               # Un ID alĂ©atoire — c'est le namespace UTS
ps aux                 # Seul bash tourne — isolation PID
ip addr                # Interface rĂ©seau isolĂ©e — namespace network
exit

# Lister les conteneurs (y compris arrĂȘtĂ©s)
docker ps -a

# Lancer un serveur web en arriĂšre-plan
docker run -d --name mon-nginx -p 8080:80 nginx:alpine
curl http://localhost:8080   # Ta page Nginx servie depuis un conteneur

# Voir les logs en temps réel
docker logs -f mon-nginx

# Entrer dans un conteneur qui tourne
docker exec -it mon-nginx sh

# Nettoyage
docker stop mon-nginx
docker rm mon-nginx

Points clés à retenir

Un conteneur n’est pas une mini-VM. C’est un processus Linux isolĂ© par des namespaces et contrĂŽlĂ© par des cgroups. Cette distinction a des implications pratiques majeures : les conteneurs partagent le noyau de l’hĂŽte, ce qui signifie qu’un bug kernel affecte tous les conteneurs. La sĂ©curitĂ© d’un conteneur n’est jamais aussi forte que celle d’une VM — mais en contrepartie, tu gagnes en performance et en densitĂ©.

L’architecture Docker est client-serveur. Quand tu tapes docker run, le CLI envoie une requĂȘte au daemon Docker (dockerd), qui lui-mĂȘme dĂ©lĂšgue Ă  containerd pour la gestion du cycle de vie, puis Ă  runc pour l’exĂ©cution effective du conteneur. Cette chaĂźne est importante Ă  connaĂźtre pour le debugging.


Chapitre 2 — Dockerfile : construire ses images

📖 AccĂ©der au cours complet — Chapitre 2

De quoi parle ce chapitre ?

C’est ici que les choses deviennent concrĂštes. Un Dockerfile, c’est la recette de fabrication de ton image Docker. C’est un fichier texte qui dĂ©crit, instruction par instruction, comment construire l’environnement d’exĂ©cution de ton application. MaĂźtriser l’écriture de Dockerfiles, c’est la compĂ©tence centrale de Docker.

Ce chapitre couvre d’abord les instructions de base : FROM, RUN, COPY, WORKDIR, EXPOSE, CMD, ENTRYPOINT. Chaque instruction crĂ©e une couche (layer) dans l’image finale. Comprendre ce systĂšme de couches est essentiel pour optimiser tes builds — une couche modifiĂ©e invalide le cache de toutes les couches suivantes. L’ordre de tes instructions a donc un impact direct sur la vitesse de tes builds.

On passe ensuite aux techniques avancĂ©es. Le multi-stage build est probablement la technique la plus importante Ă  maĂźtriser. L’idĂ©e est simple : tu utilises un premier stage avec tous les outils de compilation (compilateur, dĂ©pendances de build), puis tu copies uniquement le binaire ou les artefacts dans une image finale minimale. RĂ©sultat : des images qui passent de 1 Go Ă  50 Mo.

Enfin, on aborde les bonnes pratiques qui font la diffĂ©rence entre un Dockerfile amateur et un Dockerfile production-ready : gestion du .dockerignore, rĂ©duction du nombre de couches, choix de l’image de base, gestion des utilisateurs non-root, scan de vulnĂ©rabilitĂ©s.

Ce que tu vas apprendre

  • Toutes les instructions Dockerfile et leurs subtilitĂ©s
  • Le systĂšme de couches (layers) et le cache de build
  • Le multi-stage build pour des images optimisĂ©es
  • La diffĂ©rence entre CMD et ENTRYPOINT (et quand utiliser quoi)
  • Le .dockerignore et pourquoi il est crucial
  • Les bonnes pratiques de sĂ©curitĂ© (USER non-root, images minimales)
  • Le build d’images multi-architecture (ARM64/AMD64)

Extrait de code clĂ© — Multi-stage build

# ============================================
# Stage 1 : Build — on compile l'application
# ============================================
FROM node:20-alpine AS builder

WORKDIR /app

# Copier d'abord les fichiers de dépendances (cache optimal)
COPY package.json package-lock.json ./
RUN npm ci --only=production

# Puis le code source
COPY src/ ./src/
COPY tsconfig.json ./
RUN npm run build

# ============================================
# Stage 2 : Production — image finale minimale
# ============================================
FROM node:20-alpine AS production

# Sécurité : utilisateur non-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

WORKDIR /app

# Copier uniquement les artefacts nécessaires
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./

# Ne jamais tourner en root
USER appuser

# Healthcheck intégré
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

EXPOSE 3000

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

Exemple avancĂ© — Application Go (image ultra-lĂ©gĂšre)

# Build
FROM golang:1.22-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/server

# Production — image FROM scratch = 0 dĂ©pendance
FROM scratch
COPY --from=build /app/server /server
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080
ENTRYPOINT ["/server"]

RĂ©sultat : une image de ~10 Mo qui contient uniquement ton binaire Go et les certificats SSL. Pas de shell, pas de package manager, pas de surface d’attaque.

Points clés à retenir

L’ordre des instructions dans un Dockerfile est crucial pour le cache. RĂšgle d’or : les choses qui changent le moins souvent en premier, le code source en dernier. Si tu copies ton code avant d’installer les dĂ©pendances, chaque modification de code invalide le cache des dĂ©pendances et relance un npm install complet. En copiant d’abord package.json, le cache des dĂ©pendances survit aux changements de code.

Le multi-stage build n’est pas un luxe, c’est une nĂ©cessitĂ©. Une image Node.js avec les devDependencies et les outils de build peut facilement peser 1 Go+. Avec un multi-stage, tu descends Ă  100-200 Mo. Pour du Go ou du Rust avec une image scratch, tu es sous les 20 Mo. En production, la taille compte — elle impacte le temps de dĂ©ploiement, la bande passante, et la surface d’attaque.


Chapitre 3 — Docker Compose : orchestrer ses services

📖 AccĂ©der au cours complet — Chapitre 3

De quoi parle ce chapitre ?

Dans le monde rĂ©el, une application ne tourne jamais seule. Tu as une API, une base de donnĂ©es, un cache Redis, peut-ĂȘtre un reverse proxy, un worker de background jobs
 Docker Compose te permet de dĂ©finir et gĂ©rer toute cette stack dans un seul fichier YAML. Un docker compose up et tout dĂ©marre, connectĂ©, configurĂ©.

Ce chapitre commence par la syntaxe du fichier docker-compose.yml (ou compose.yaml — les deux fonctionnent). Tu vas dĂ©couvrir comment dĂ©finir des services, des rĂ©seaux, des volumes, des variables d’environnement. On couvre les options les plus utilisĂ©es en dĂ©tail : build, image, ports, volumes, environment, depends_on, healthcheck, restart.

La partie rĂ©seau est particuliĂšrement importante. Docker Compose crĂ©e automatiquement un rĂ©seau bridge pour ta stack, et chaque service est accessible par les autres via son nom de service comme hostname DNS. C’est magique la premiĂšre fois que tu vois postgres://db:5432 fonctionner sans configuration — mais c’est crucial de comprendre le mĂ©canisme pour dĂ©bugger quand la rĂ©solution DNS Ă©choue.

On aborde aussi les volumes et la persistance des donnĂ©es. Les conteneurs sont Ă©phĂ©mĂšres par nature — quand tu supprimes un conteneur, ses donnĂ©es disparaissent. Les volumes Docker rĂ©solvent ce problĂšme en montant des rĂ©pertoires persistants. On verra les diffĂ©rents types (named volumes, bind mounts, tmpfs) et quand utiliser chacun.

Enfin, on traite la gestion des environnements (dev vs staging vs prod) avec les fichiers .env, les overrides (docker-compose.override.yml), et les profils Compose.

Ce que tu vas apprendre

  • La syntaxe complĂšte de docker-compose.yml
  • Le networking Docker : bridge, host, overlay, et DNS interne
  • Les volumes : named, bind mount, tmpfs — et quand utiliser quoi
  • La gestion des dĂ©pendances entre services (depends_on + healthcheck)
  • Les variables d’environnement et les secrets
  • Les overrides et profils pour multi-environnement
  • Les commandes Compose essentielles : up, down, logs, exec, build

Extrait de code clĂ© — Stack complĂšte

# compose.yaml — Stack web complùte
services:
  # --- Application ---
  api:
    build:
      context: .
      dockerfile: Dockerfile
      target: production
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: production
      DATABASE_URL: postgres://app:secret@db:5432/myapp
      REDIS_URL: redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: "1.0"

  # --- Base de données ---
  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret  # En prod, utilise des secrets Docker
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d myapp"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  # --- Cache ---
  cache:
    image: redis:7-alpine
    command: redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru
    volumes:
      - redis_data:/data
    restart: unless-stopped

  # --- Reverse Proxy ---
  proxy:
    image: traefik:v3.0
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - certs_data:/certs
    restart: unless-stopped

volumes:
  postgres_data:
    driver: local
  redis_data:
    driver: local
  certs_data:
    driver: local

Commandes Compose essentielles

# Démarrer toute la stack (build + start)
docker compose up -d --build

# Voir les logs de tous les services (ou d'un seul)
docker compose logs -f
docker compose logs -f api

# Vérifier l'état de santé
docker compose ps

# Exécuter une commande dans un service
docker compose exec db psql -U app -d myapp

# Reconstruire un seul service
docker compose build api
docker compose up -d api   # Redémarrer uniquement l'API

# ArrĂȘter tout (sans supprimer les volumes)
docker compose down

# ArrĂȘter tout ET supprimer les volumes (⚠ donnĂ©es perdues)
docker compose down -v

# Voir l'utilisation des ressources
docker compose top
docker stats

Points clés à retenir

Le depends_on simple ne garantit pas que le service est prĂȘt — il garantit juste qu’il est dĂ©marrĂ©. Un conteneur PostgreSQL peut ĂȘtre “started” mais pas encore prĂȘt Ă  accepter des connexions. C’est pour ça que tu dois combiner depends_on avec condition: service_healthy et un healthcheck sur le service dĂ©pendant. Sans ça, ton API va crasher au dĂ©marrage parce que la DB n’est pas encore prĂȘte.

Les bind mounts (./src:/app/src) sont parfaits en dĂ©veloppement pour le hot-reload. En production, tu ne veux jamais de bind mount — tout doit ĂȘtre dans l’image. Utilise des named volumes pour la persistance des donnĂ©es (DB, uploads) et rien d’autre.


Chapitre 4 — Docker en production

📖 AccĂ©der au cours complet — Chapitre 4

De quoi parle ce chapitre ?

Faire tourner Docker sur ton laptop, c’est facile. Le faire tourner en production de façon fiable, sĂ©curisĂ©e et performante, c’est un autre mĂ©tier. Ce chapitre couvre tout ce qu’il faut savoir pour passer du “ça marche chez moi” au “ça tourne en prod sans me rĂ©veiller Ă  3h du mat’”.

On commence par la sécurité. En production, un conteneur qui tourne en root est un risque. Une image qui contient des CVE connues est un risque. Un socket Docker monté sans protection est un risque. On verra comment scanner ses images, configurer des utilisateurs non-root, utiliser des images distroless, activer les security profiles (AppArmor, seccomp), et gérer les secrets proprement.

Ensuite, la performance et l’observabilitĂ©. Tu vas apprendre Ă  limiter les ressources (CPU, mĂ©moire) pour Ă©viter qu’un conteneur consomme tout, Ă  configurer le logging (JSON-file, syslog, Fluentd), Ă  mettre en place des healthchecks qui ont du sens, et Ă  monitorer tes conteneurs avec Prometheus et Grafana.

Le chapitre couvre aussi les stratégies de déploiement : blue-green, rolling update, canary. Comment mettre à jour tes conteneurs sans downtime ? Comment faire un rollback rapide si la nouvelle version a un bug ? On verra les approches avec Docker Compose (pour les stacks simples) et on introduira les concepts qui mÚneront naturellement vers Kubernetes pour les stacks plus complexes.

Enfin, on traite la CI/CD avec Docker : construire des images dans une pipeline, les tagger proprement (pas de :latest en prod !), les pousser vers un registre privé, et automatiser les déploiements.

Ce que tu vas apprendre

  • La sĂ©curitĂ© des conteneurs en production (principes et pratiques)
  • Le scan de vulnĂ©rabilitĂ©s (Trivy, Docker Scout, Snyk)
  • La gestion des ressources (limites CPU/mĂ©moire, OOM killer)
  • Le logging centralisĂ© et l’observabilitĂ©
  • Les stratĂ©gies de dĂ©ploiement sans downtime
  • La CI/CD avec Docker (GitHub Actions, GitLab CI)
  • Le tagging sĂ©mantique des images
  • Les registres privĂ©s (Harbor, GitLab Registry, AWS ECR)

Extrait de code clĂ© — Pipeline CI/CD

# .github/workflows/docker.yml
name: Build & Deploy

on:
  push:
    branches: [main]
    tags: ['v*']

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=sha,prefix=

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Scan for vulnerabilities
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:sha-${{ github.sha }}
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL,HIGH'

Checklist production

# Scanner les vulnérabilités de ton image
docker scout cves mon-app:latest
trivy image mon-app:latest

# Vérifier qu'on ne tourne PAS en root
docker run --rm mon-app:latest whoami
# Doit retourner un user non-root

# Tester les limites de ressources
docker run --rm -m 256m --cpus="0.5" mon-app:latest

# Vérifier le healthcheck
docker inspect --format='{{json .State.Health}}' mon-conteneur | jq

# Pas de secrets dans l'image !
docker history mon-app:latest  # Vérifier qu'aucun secret n'apparaßt

Points clés à retenir

Ne jamais utiliser :latest en production. Ce tag est mutable — il pointe vers une image diffĂ©rente Ă  chaque push. Utilise des tags sĂ©mantiques (v1.2.3) ou des digests SHA (@sha256:abc...). Ton dĂ©ploiement doit ĂȘtre reproductible et auditable.

La sĂ©curitĂ© des conteneurs est un sujet en couches (pun intended). L’image de base doit ĂȘtre minimale et Ă  jour. L’application doit tourner en non-root. Les capabilities Linux doivent ĂȘtre rĂ©duites au strict minimum. Le rĂ©seau doit ĂȘtre segmentĂ©. Les secrets ne doivent jamais ĂȘtre dans l’image ou dans les variables d’environnement en clair — utilise Docker Secrets ou un vault externe.


Pourquoi cette formation ?

Cas d’usage concrets

Tu te demandes peut-ĂȘtre si Docker vaut vraiment le coup pour ton cas. Voici des scĂ©narios concrets oĂč Docker fait la diffĂ©rence :

1. Environnement de développement unifié

Tu rejoins une Ă©quipe. Le projet utilise PostgreSQL 16, Redis 7, Elasticsearch 8, et une API en Python 3.12. Sans Docker, tu passes une demi-journĂ©e Ă  tout installer, Ă  gĂ©rer les conflits de versions, Ă  chercher pourquoi ça marche pas sur ton OS. Avec un docker compose up, t’es opĂ©rationnel en 2 minutes.

# Cloner le repo et c'est parti
git clone https://github.com/team/project.git
cd project
docker compose up -d
# C'est tout. MĂȘme stack que tes collĂšgues.

2. CI/CD reproductible

Ta pipeline de tests doit tourner dans un environnement identique Ă  la prod. Avec Docker, tu construis une image, tu la testes dans la CI, et c’est exactement cette image qui part en production. Pas de “ça marchait en CI mais pas en prod” parce que la version de Node est diffĂ©rente.

3. Microservices et polyglot

Tu as une API en Go, un service de ML en Python, un frontend en Node, un worker en Rust. Chaque service a ses dépendances, sa version de runtime. Docker permet de tout faire cohabiter proprement, chacun dans son conteneur, sans conflits.

4. Scaling horizontal

Ton API prend de la charge ? Tu lances 5 instances du mĂȘme conteneur derriĂšre un load balancer. C’est aussi simple que docker compose up --scale api=5.

5. Migration et modernisation

Tu as un monolithe legacy en PHP 7. Tu veux migrer progressivement vers des microservices modernes. Docker te permet de conteneuriser le monolithe tel quel, puis d’extraire les fonctionnalitĂ©s une par une dans de nouveaux services, le tout orchestrĂ© par Compose.

Ce qui différencie cette formation

  • OrientĂ©e pratique — Chaque concept est illustrĂ© par du code que tu peux copier-coller et tester immĂ©diatement
  • Progressive — Du docker run hello-world jusqu’à la pipeline CI/CD en production
  • Opinions fortes — On ne te dit pas “il y a plusieurs approches, choisis la tienne”. On te dit ce qui marche en 2026 et pourquoi
  • Contexte Suisse/EuropĂ©en — Les exemples utilisent des providers comme Infomaniak et Exoscale, pas uniquement AWS
  • Gratuite et Ă  jour — Pas de paywall, pas de contenu obsolĂšte de 2019

Docker vs les alternatives

Docker n’est pas le seul outil de conteneurisation. Voici un comparatif honnĂȘte avec les principales alternatives en 2026 :

Comparatif détaillé

CritĂšreDockerPodmancontainerd + nerdctlLXC/LXD (Incus)
TypeDaemon + CLIDaemonlessRuntime + CLIConteneurs systĂšme
RootlessSupportéNatifSupportéSupporté
CompatibilitĂ© Docker—~95%CLI similaireDiffĂ©rent
Docker ComposeNatifpodman-composenerdctl composeNon
KubernetesVia containerdCRI-ONatifNon
ÉcosystùmeÉnormeCroissantTechniqueNiche
Idéal pourDev + ProdRHEL/Fedora, sécuritéK8s nodesVMs légÚres

Docker

Le standard de facto. L’écosystĂšme le plus riche, la communautĂ© la plus large, la documentation la plus fournie. Docker Desktop a eu ses controverses (changement de licence en 2021), mais Docker Engine reste open-source. En 2026, Docker est toujours le choix par dĂ©faut pour la majoritĂ© des Ă©quipes.

Points forts : ÉcosystĂšme, documentation, compatibilitĂ© universelle, Docker Desktop (DX) Points faibles : Daemon root par dĂ©faut, Docker Desktop payant pour les entreprises 250+ employĂ©s

Podman

DĂ©veloppĂ© par Red Hat, Podman est l’alternative la plus sĂ©rieuse. Son argument principal : pas de daemon. Chaque conteneur est un processus enfant de la commande podman, ce qui simplifie la gestion et amĂ©liore la sĂ©curitĂ©. Il est aussi rootless par dĂ©faut.

Podman est compatible avec la plupart des commandes Docker — tu peux souvent faire alias docker=podman et ça fonctionne. Mais l’écosystĂšme est plus petit, certains outils tiers ne supportent pas Podman, et la compatibilitĂ© Compose n’est pas parfaite.

# Podman — syntaxe quasi-identique à Docker
podman run -d --name web -p 8080:80 nginx:alpine
podman ps
podman logs web

Points forts : Daemonless, rootless natif, compatible CLI Docker, intĂ©grĂ© Ă  RHEL Points faibles : ÉcosystĂšme plus petit, Compose imparfait, moins de tooling tiers

containerd + nerdctl

containerd est le runtime de conteneurs utilisĂ© “sous le capot” par Docker et Kubernetes. nerdctl est un CLI compatible Docker qui parle directement Ă  containerd, sans passer par le daemon Docker.

C’est le choix technique le plus “pur” — tu utilises directement le runtime sans couche d’abstraction. Mais c’est aussi le plus austĂšre. Il n’y a pas d’équivalent de Docker Desktop, l’UX est moins polie, et la documentation est plus technique.

Points forts : LĂ©ger, pas de daemon Docker, utilisĂ© nativement par K8s Points faibles : Pas de Docker Desktop, documentation plus rare, courbe d’apprentissage

Notre recommandation

Commence par Docker. C’est le standard, l’écosystĂšme est imbattable, la documentation est exhaustive, et 95% des tutos/articles/cours utilisent Docker. Une fois que tu maĂźtrises Docker, passer Ă  Podman ou nerdctl est trivial — les concepts sont les mĂȘmes, seul l’outillage change.

Si tu es dans un environnement Red Hat / Fedora, Podman mĂ©rite un regard sĂ©rieux. Si tu gĂšres des nƓuds Kubernetes, tu utilises dĂ©jĂ  containerd sans le savoir.


Ressources complémentaires

Documentation officielle

Outils recommandés

  • Dive — Analyser les couches de tes images Docker
  • Trivy — Scanner de vulnĂ©rabilitĂ©s open-source
  • Lazydocker — TUI pour gĂ©rer Docker (comme lazygit mais pour Docker)
  • Hadolint — Linter pour Dockerfiles

Images de base recommandées

UsageImageTailleNotes
Généralistealpine:3.20~7 MoMinimale, musl libc
Node.jsnode:20-alpine~130 MoNode LTS sur Alpine
Pythonpython:3.12-slim~150 MoDebian slim, pas Alpine (problĂšmes musl)
Goscratch ou distroless0-20 MoBinaire statique
Javaeclipse-temurin:21-jre-alpine~170 MoJRE uniquement

PrĂȘt Ă  commencer ?

Tu as lu cette page, tu sais ce qui t’attend. Maintenant, c’est le moment de passer à la pratique.

Le parcours recommandé :

  1. Chapitre 1 — Introduction — Comprendre les fondations et lancer tes premiers conteneurs
  2. Chapitre 2 — Dockerfile — Construire tes propres images optimisĂ©es
  3. Chapitre 3 — Docker Compose — Orchestrer des stacks multi-services
  4. Chapitre 4 — Production — SĂ©curiser et dĂ©ployer en conditions rĂ©elles

🚀 Commencer le Chapitre 1 — Introduction à Docker


Cette formation est maintenue activement et mise à jour réguliÚrement. DerniÚre mise à jour : mars 2026. Tu as une question ou une suggestion ? Ouvre une issue sur le dépÎt GitHub du site.