đł 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.
Programme
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.
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.
Ton premier Dockerfile
Apprends à écrire un Dockerfile avec les instructions essentielles : FROM, COPY, RUN, CMD et docker build.
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.
Docker Compose : orchestrer tes services
Découvre Docker Compose : docker-compose.yml, services, up/down et ton premier projet multi-conteneurs.
Compose avancé : volumes, réseaux et scaling
Approfondis Compose avec les variables d'environnement, les profiles, les healthchecks et les bonnes pratiques.
Docker en production : logs et healthchecks
Configure Docker pour la production : conteneurs rootless, limites de ressources, health checks, logging et secrets.
Déploiement et CI/CD avec Docker
Scanne tes images avec Trivy, monitore tes conteneurs et applique la checklist production Docker.
Sécurité Docker : rootless et isolation
Sécurise tes conteneurs avec le mode rootless, Seccomp et AppArmor pour une isolation maximale.
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étence | Niveau | Pourquoi |
|---|---|---|
| Linux / ligne de commande | IntermĂ©diaire | Docker repose sur Linux. Tu dois ĂȘtre Ă lâaise avec cd, ls, cat, les permissions, les pipes |
| Réseau TCP/IP | Bases | Comprendre les ports, DNS, HTTP aide énormément pour le networking Docker |
| Un langage de programmation | DĂ©butant+ | Pour Ă©crire les apps que tu vas conteneuriser â peu importe le langage |
| Git | Bases | Pour 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
| Parcours | Duré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
CMDetENTRYPOINT(et quand utiliser quoi) - Le
.dockerignoreet 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-worldjusquâĂ 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Ăšre | Docker | Podman | containerd + nerdctl | LXC/LXD (Incus) |
|---|---|---|---|---|
| Type | Daemon + CLI | Daemonless | Runtime + CLI | Conteneurs systĂšme |
| Rootless | Supporté | Natif | Supporté | Supporté |
| CompatibilitĂ© Docker | â | ~95% | CLI similaire | DiffĂ©rent |
| Docker Compose | Natif | podman-compose | nerdctl compose | Non |
| Kubernetes | Via containerd | CRI-O | Natif | Non |
| ĂcosystĂšme | Ănorme | Croissant | Technique | Niche |
| Idéal pour | Dev + Prod | RHEL/Fedora, sécurité | K8s nodes | VMs 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
- Docker Docs â La rĂ©fĂ©rence absolue
- Dockerfile reference â Toutes les instructions
- Compose specification â Le format compose.yaml
- Docker Hub â Le registre dâimages public
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
| Usage | Image | Taille | Notes |
|---|---|---|---|
| Généraliste | alpine:3.20 | ~7 Mo | Minimale, musl libc |
| Node.js | node:20-alpine | ~130 Mo | Node LTS sur Alpine |
| Python | python:3.12-slim | ~150 Mo | Debian slim, pas Alpine (problĂšmes musl) |
| Go | scratch ou distroless | 0-20 Mo | Binaire statique |
| Java | eclipse-temurin:21-jre-alpine | ~170 Mo | JRE 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é :
- Chapitre 1 â Introduction â Comprendre les fondations et lancer tes premiers conteneurs
- Chapitre 2 â Dockerfile â Construire tes propres images optimisĂ©es
- Chapitre 3 â Docker Compose â Orchestrer des stacks multi-services
- 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.