Ressources & Cheatsheets Docker

Toutes les commandes, Dockerfile, Docker Compose et patterns de sécurité en un seul endroit.

Tout
Docker CLI
Dockerfile
Docker Compose
Registres
Sécurité
🐳 Docker CLI — Commandes essentielles

🚀 Images

docker pull nginx:alpineTélécharger une image
docker imagesLister les images locales
docker image rm nginxSupprimer une image
docker image pruneSupprimer les images non utilisées
docker image history imgHistorique des layers
docker image inspect imgMétadonnées complètes
docker build -t monapp:1.0 .Construire une image

⚙️ Conteneurs — Cycle de vie

docker run -d -p 80:80 nginxLancer en arrière-plan
docker run -it --rm ubuntu bashShell interactif, auto-remove
docker psConteneurs actifs
docker ps -aTous les conteneurs
docker stop <id>Arrêt gracieux (SIGTERM)
docker kill <id>Arrêt forcé (SIGKILL)
docker rm <id>Supprimer un conteneur
docker container pruneSupprimer 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> bashShell dans un conteneur actif
docker inspect <id>Métadonnées JSON complètes
docker inspect --format '{{.NetworkSettings.IPAddress}}' idIP du conteneur
docker statsCPU/Mém en temps réel
docker top <id>Processus dans le conteneur

💾 Volumes

docker volume create pgdataCréer un volume nommé
docker volume lsLister les volumes
docker volume inspect pgdataDétails du volume
docker volume rm pgdataSupprimer un volume
docker volume pruneSupprimer les volumes inutilisés
-v pgdata:/var/lib/postgresqlVolume nommé dans docker run
-v $(pwd):/app:roBind mount en lecture seule

🌐 Réseaux

docker network lsLister les réseaux
docker network create monreseauCréer un réseau bridge
docker network inspect monreseauDétails du réseau
docker network connect monreseau ctnConnecter un conteneur
docker network disconnect monreseau ctnDéconnecter un conteneur
docker network rm monreseauSupprimer un réseau
docker network pruneSupprimer les réseaux inutilisés

🧹 Nettoyage & Système

docker system dfEspace disque utilisé
docker system pruneSupprimer ressources inutilisées
docker system prune -a+ images non taguées
docker system infoInfo sur le daemon Docker
docker cp src.txt ctn:/app/Copier un fichier dans un conteneur
docker update --memory 512m ctnLimiter la mémoire à chaud
📄 Dockerfile — Instructions & Best Practices

📋 Instructions principales

FROM node:18-alpineImage de base (toujours en premier)
WORKDIR /appRépertoire de travail
COPY package*.json ./Copier des fichiers
RUN npm ciExécuter une commande (layer)
ENV NODE_ENV=productionVariable d'environnement
ARG VERSION=1.0Argument de build
EXPOSE 3000Documenter le port
USER nodeUtilisateur 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. FROMImage de base avec tag précis
2. ARG / ENVVariables qui changent rarement
3. WORKDIRRépertoire de travail
4. COPY package*.json ./Manifeste des deps (stable)
5. RUN npm ciInstallation des deps (caché)
6. COPY . .Code source (change souvent)
7. RUN buildCompilation
8. USER / EXPOSE / CMDMé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
🎼 Docker Compose — YAML & Commandes

⌨️ Commandes Compose

docker compose up -dDémarrer en arrière-plan
docker compose down -vArrêter + supprimer volumes
docker compose psÉtat des services
docker compose logs -f apiLogs d'un service
docker compose exec api bashShell dans un service
docker compose build --no-cacheRebuild sans cache
docker compose up --scale api=3Scaler un service
docker compose pullMettre à jour les images
docker compose configValider 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:
📡 Registres — Docker Hub, GHCR, Privé

🐳 Docker Hub

docker login -u monuserAuthentification
docker tag monapp monuser/monapp:1.0Tagger pour le Hub
docker push monuser/monapp:1.0Pousser vers le Hub
docker push --all-tags monuser/monappPousser tous les tags
docker pull monuser/monapp:1.0Télécharger une image
docker logoutDéconnexion

🏠 Registre privé (registry:2)

docker run -d -p 5000:5000 registry:2Lancer le registre local
docker tag monapp localhost:5000/monappTagger pour le registre local
docker push localhost:5000/monappPousser vers le registre local
docker pull localhost:5000/monappTirer depuis le registre local
curl localhost:5000/v2/_catalogLister les dépôts

🏗️ buildx — Multi-arch

docker buildx create --useCré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 monappVérifier les architectures
docker buildx lsLister les builders

🏷️ Stratégie de tags SemVer

monapp:1.2.3Version exacte (immuable)
monapp:1.2Patch flottant
monapp:1Minor flottant
monapp:latestDernière stable (à éviter en prod)
monapp:sha-abc1234Tag par SHA de commit (CI/CD)
monapp:developBranche de développement
🔐 Sécurité — Checklist production

🔍 Scan de vulnérabilités

docker scout cves monapp:latestLister les CVEs
docker scout quickview monappVue d'ensemble rapide
docker scout recommendations monappRecommandations de mise à jour
trivy image monapp:latestScan Trivy (open-source)
snyk container test monapp:latestScan 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