Ressources & Cheatsheets Docker
Toutes les commandes, Dockerfile, Docker Compose et patterns de sécurité en un seul endroit.
🚀 Images
| docker pull nginx:alpine | Télécharger une image |
| docker images | Lister les images locales |
| docker image rm nginx | Supprimer une image |
| docker image prune | Supprimer les images non utilisées |
| docker image history img | Historique des layers |
| docker image inspect img | Métadonnées complètes |
| docker build -t monapp:1.0 . | Construire une image |
⚙️ Conteneurs — Cycle de vie
| docker run -d -p 80:80 nginx | Lancer en arrière-plan |
| docker run -it --rm ubuntu bash | Shell interactif, auto-remove |
| docker ps | Conteneurs actifs |
| docker ps -a | Tous les conteneurs |
| docker stop <id> | Arrêt gracieux (SIGTERM) |
| docker kill <id> | Arrêt forcé (SIGKILL) |
| docker rm <id> | Supprimer un conteneur |
| docker container prune | Supprimer tous les stoppés |
🔍 Inspection & Logs
| docker logs -f <id> | Suivre les logs en temps réel |
| docker logs --tail 50 <id> | 50 dernières lignes |
| docker exec -it <id> bash | Shell dans un conteneur actif |
| docker inspect <id> | Métadonnées JSON complètes |
| docker inspect --format '{{.NetworkSettings.IPAddress}}' id | IP du conteneur |
| docker stats | CPU/Mém en temps réel |
| docker top <id> | Processus dans le conteneur |
💾 Volumes
| docker volume create pgdata | Créer un volume nommé |
| docker volume ls | Lister les volumes |
| docker volume inspect pgdata | Détails du volume |
| docker volume rm pgdata | Supprimer un volume |
| docker volume prune | Supprimer les volumes inutilisés |
| -v pgdata:/var/lib/postgresql | Volume nommé dans docker run |
| -v $(pwd):/app:ro | Bind mount en lecture seule |
🌐 Réseaux
| docker network ls | Lister les réseaux |
| docker network create monreseau | Créer un réseau bridge |
| docker network inspect monreseau | Détails du réseau |
| docker network connect monreseau ctn | Connecter un conteneur |
| docker network disconnect monreseau ctn | Déconnecter un conteneur |
| docker network rm monreseau | Supprimer un réseau |
| docker network prune | Supprimer les réseaux inutilisés |
🧹 Nettoyage & Système
| docker system df | Espace disque utilisé |
| docker system prune | Supprimer ressources inutilisées |
| docker system prune -a | + images non taguées |
| docker system info | Info sur le daemon Docker |
| docker cp src.txt ctn:/app/ | Copier un fichier dans un conteneur |
| docker update --memory 512m ctn | Limiter la mémoire à chaud |
📋 Instructions principales
| FROM node:18-alpine | Image de base (toujours en premier) |
| WORKDIR /app | Répertoire de travail |
| COPY package*.json ./ | Copier des fichiers |
| RUN npm ci | Exécuter une commande (layer) |
| ENV NODE_ENV=production | Variable d'environnement |
| ARG VERSION=1.0 | Argument de build |
| EXPOSE 3000 | Documenter le port |
| USER node | Utilisateur d'exécution |
| HEALTHCHECK --interval=30s CMD curl... | Surveillance de santé |
| CMD ["node", "server.js"] | Commande par défaut (exec form) |
| ENTRYPOINT ["docker-entrypoint.sh"] | Point d'entrée fixe |
🏗️ Multi-stage build Node.js
# Stage 1 : Build FROM node:18 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # Stage 2 : Production FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY --from=builder /app/dist ./dist USER node EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost:3000/health || exit 1 CMD ["node", "dist/server.js"]
✅ Ordre optimal pour le cache
| 1. FROM | Image de base avec tag précis |
| 2. ARG / ENV | Variables qui changent rarement |
| 3. WORKDIR | Répertoire de travail |
| 4. COPY package*.json ./ | Manifeste des deps (stable) |
| 5. RUN npm ci | Installation des deps (caché) |
| 6. COPY . . | Code source (change souvent) |
| 7. RUN build | Compilation |
| 8. USER / EXPOSE / CMD | Métadonnées |
📦 Tailles des images Node.js
| node:18 | ~950 MB — complète, bash, apt |
| node:18-slim | ~240 MB — minimale, bash |
| node:18-alpine | ~115 MB — très légère, sh, apk |
| distroless/nodejs18 | ~85 MB — pas de shell |
⌨️ Commandes Compose
| docker compose up -d | Démarrer en arrière-plan |
| docker compose down -v | Arrêter + supprimer volumes |
| docker compose ps | État des services |
| docker compose logs -f api | Logs d'un service |
| docker compose exec api bash | Shell dans un service |
| docker compose build --no-cache | Rebuild sans cache |
| docker compose up --scale api=3 | Scaler un service |
| docker compose pull | Mettre à jour les images |
| docker compose config | Valider et afficher la config |
📄 Structure docker-compose.yml complète
services: web: build: . image: monapp:latest ports: - "80:3000" environment: - NODE_ENV=production volumes: - ./src:/app/src depends_on: db: condition: service_healthy networks: - frontend - backend restart: unless-stopped deploy: resources: limits: cpus: '0.5' memory: 512M db: image: postgres:15-alpine volumes: - pgdata:/var/lib/postgresql/data environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: secret healthcheck: test: ["CMD-SHELL", "pg_isready -U user"] interval: 10s retries: 5 networks: - backend volumes: pgdata: networks: frontend: backend:
🐳 Docker Hub
| docker login -u monuser | Authentification |
| docker tag monapp monuser/monapp:1.0 | Tagger pour le Hub |
| docker push monuser/monapp:1.0 | Pousser vers le Hub |
| docker push --all-tags monuser/monapp | Pousser tous les tags |
| docker pull monuser/monapp:1.0 | Télécharger une image |
| docker logout | Déconnexion |
🏠 Registre privé (registry:2)
| docker run -d -p 5000:5000 registry:2 | Lancer le registre local |
| docker tag monapp localhost:5000/monapp | Tagger pour le registre local |
| docker push localhost:5000/monapp | Pousser vers le registre local |
| docker pull localhost:5000/monapp | Tirer depuis le registre local |
| curl localhost:5000/v2/_catalog | Lister les dépôts |
🏗️ buildx — Multi-arch
| docker buildx create --use | Créer un builder multi-arch |
| docker buildx build --platform linux/amd64,linux/arm64 -t monapp:latest --push . | Build multi-arch + push |
| docker buildx imagetools inspect monapp | Vérifier les architectures |
| docker buildx ls | Lister les builders |
🏷️ Stratégie de tags SemVer
| monapp:1.2.3 | Version exacte (immuable) |
| monapp:1.2 | Patch flottant |
| monapp:1 | Minor flottant |
| monapp:latest | Dernière stable (à éviter en prod) |
| monapp:sha-abc1234 | Tag par SHA de commit (CI/CD) |
| monapp:develop | Branche de développement |
🔍 Scan de vulnérabilités
| docker scout cves monapp:latest | Lister les CVEs |
| docker scout quickview monapp | Vue d'ensemble rapide |
| docker scout recommendations monapp | Recommandations de mise à jour |
| trivy image monapp:latest | Scan Trivy (open-source) |
| snyk container test monapp:latest | Scan Snyk |
📁 .dockerignore essentiel
.env
.env.*
*.pem
*.key
secrets/
.git/
node_modules/
coverage/
.DS_Store
*.log
dist/ # si géré par le build
__pycache__/
*.pyc
👤 USER non-root
Utiliser USER node dans les images Node.js officielles.
Pour Alpine : RUN addgroup -S app && adduser -S app -G app
Combiner avec COPY --chown=node:node . . pour éviter un layer RUN chown.
🔑 Secrets BuildKit
Ne jamais mettre de secrets dans ENV ou ARG — visibles dans les layers.
Utiliser --mount=type=secret,id=mykey dans RUN.
Lancer avec docker build --secret id=mykey,src=.secrets/key .
🏥 HEALTHCHECK
Permet à Docker Compose d'attendre avec condition: service_healthy.
Format : HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f ...
States : starting → healthy / unhealthy
📏 Limites runtime
Mémoire : docker run --memory=512m
CPU : docker run --cpus=0.5
PID : docker run --pids-limit=100
Lecture seule : docker run --read-only
🌐 Isolation réseau
Ne pas utiliser --network host en production.
Créer des réseaux dédiés par tier (frontend/backend).
Les conteneurs sans --network sont sur le bridge par défaut (pas de DNS).
✅ Checklist prod
✓ Multi-stage build
✓ Tag précis (pas :latest)
✓ USER non-root
✓ HEALTHCHECK
✓ .dockerignore
✓ Scan CVE en CI/CD