🐳 DOCKER CHEAT SHEET

Docker · Compose · Dockerfile

🔍

▶️ Cycle de vie des conteneurs

Lancer un conteneur en mode interactif (shell)
docker run -it --name myapp ubuntu /bin/bash
Lancer un conteneur en arrière-plan (détaché)
docker run -d --name web -p 8080:80 nginx
Lancer avec variables d'environnement
docker run -d -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=app mysql:8
Lancer avec redémarrage automatique
docker run -d --restart unless-stopped --name app myimage
Stopper / Démarrer / Redémarrer un conteneur
docker stop myapp
docker start myapp
docker restart myapp
Supprimer un conteneur (forcer si running)
docker rm myapp
docker rm -f myapp
Exécuter une commande dans un conteneur actif
docker exec -it myapp /bin/bash
docker exec myapp cat /etc/hosts
Lister les conteneurs (actifs / tous)
docker ps
docker ps -a
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
Copier fichiers entre hôte et conteneur
docker cp myapp:/var/log/app.log ./app.log
docker cp ./config.yml myapp:/etc/app/
Renommer un conteneur
docker rename old_name new_name

📦 Images

Télécharger une image depuis un registry
docker pull nginx:alpine
docker pull registry.example.com/myapp:v2
Construire une image depuis un Dockerfile
docker build -t myapp:v1 .
docker build -t myapp:v1 -f Dockerfile.prod .
docker build --no-cache -t myapp:latest .
Lister / Supprimer des images
docker images
docker images --filter "dangling=true"
docker rmi myapp:v1
docker rmi -f $(docker images -q)
Taguer et pousser une image
docker tag myapp:v1 registry.io/myapp:v1
docker push registry.io/myapp:v1
Sauvegarder / Charger une image (archive tar)
docker save -o myapp.tar myapp:v1
docker load -i myapp.tar
Voir l'historique des couches d'une image
docker history myapp:v1
docker history --no-trunc myapp:v1

🌐 Réseau

Lister / Créer / Supprimer des réseaux
docker network ls
docker network create mynet
docker network create --driver bridge --subnet 172.20.0.0/16 mynet
docker network rm mynet
Connecter / Déconnecter un conteneur d'un réseau
docker network connect mynet myapp
docker network disconnect mynet myapp
Inspecter un réseau (voir les conteneurs connectés)
docker network inspect mynet
docker network inspect bridge --format '{{range .Containers}}{{.Name}} {{end}}'
Publication de ports (mapping)
# hôte:conteneur
docker run -p 8080:80 nginx
# seulement localhost
docker run -p 127.0.0.1:8080:80 nginx
# port aléatoire
docker run -P nginx

💾 Volumes & Bind Mounts

Créer / Lister / Supprimer des volumes
docker volume create mydata
docker volume ls
docker volume rm mydata
docker volume inspect mydata
Monter un volume nommé
docker run -d -v mydata:/var/lib/mysql mysql:8
Bind mount (répertoire hôte)
docker run -d -v $(pwd)/html:/usr/share/nginx/html:ro nginx
# syntaxe --mount (plus explicite)
docker run --mount type=bind,src=$(pwd)/html,dst=/usr/share/nginx/html,readonly nginx
tmpfs mount (RAM, pas de persistence)
docker run -d --tmpfs /tmp:rw,size=100m myapp

🔍 Inspection & Debug

Voir les logs d'un conteneur
docker logs myapp
docker logs -f myapp              # follow
docker logs --tail 100 myapp       # 100 dernières lignes
docker logs --since 10m myapp       # 10 dernières minutes
Inspecter un conteneur (JSON complet)
docker inspect myapp
docker inspect --format '{{.NetworkSettings.IPAddress}}' myapp
docker inspect --format '{{.State.Status}}' myapp
Statistiques temps réel (CPU, RAM, I/O)
docker stats
docker stats myapp
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Voir les processus dans un conteneur
docker top myapp
Voir les changements filesystem d'un conteneur
docker diff myapp
Voir les événements Docker en temps réel
docker events
docker events --filter "type=container"
docker system df            # espace disque

🎼 Docker Compose

Lancer / Stopper la stack
docker compose up -d
docker compose up -d --build        # rebuild images
docker compose down
docker compose down -v               # + suppr volumes
Voir les logs / statut des services
docker compose logs -f
docker compose logs -f web
docker compose ps
docker compose top
Exécuter une commande dans un service
docker compose exec web /bin/bash
docker compose run web python manage.py migrate
Scaler un service / Restart
docker compose up -d --scale web=3
docker compose restart web
docker compose pull                  # update images
Valider et afficher la config finale
docker compose config
docker compose -f docker-compose.prod.yml config
docker-compose.yml Template type avec web + db + volumes + réseau
services:
  web:
    build: ./app
    ports:
      - "8080:80"
    environment:
      - DB_HOST=db
      - DB_PORT=5432
    volumes:
      - ./app:/var/www/html
    depends_on:
      db:
        condition: service_healthy
    networks:
      - frontend
      - backend
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_pass
      - POSTGRES_DB=app
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5
    restart: unless-stopped
    secrets:
      - db_pass

volumes:
  pgdata:

networks:
  frontend:
  backend:

secrets:
  db_pass:
    file: ./secrets/db_password.txt

📄 Dockerfile — Instructions clés

FROM — Image de base
FROM ubuntu:24.04
FROM node:20-alpine AS builder
RUN — Exécuter pendant le build
RUN apt-get update && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*
COPY vs ADD — Copier des fichiers
COPY package*.json ./         # préféré
COPY --chown=1000:1000 . /app
ADD https://example.com/file.tar.gz /tmp/  # auto-extract
WORKDIR, USER, EXPOSE
WORKDIR /app
USER 1000
EXPOSE 8080
CMD vs ENTRYPOINT
# CMD = commande par défaut (overridable)
CMD ["node", "server.js"]

# ENTRYPOINT = commande fixe + CMD = args par défaut
ENTRYPOINT ["python"]
CMD ["app.py"]
ENV, ARG, VOLUME, HEALTHCHECK
ENV NODE_ENV=production
ARG VERSION=1.0           # build-time only
VOLUME /data
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/ || exit 1
Dockerfile (multi-stage) Build optimisé — image finale minimale
# ── Stage 1 : Build ──
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# ── Stage 2 : Production ──
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
HEALTHCHECK --interval=30s CMD wget -qO- http://localhost/ || exit 1

🔒 Sécurité & Bonnes pratiques

Lancer en read-only avec capabilities limitées
docker run --read-only --tmpfs /tmp --cap-drop ALL --cap-add NET_BIND_SERVICE myapp
Limiter les ressources (CPU, RAM)
docker run -d --memory 512m --cpus 1.5 --pids-limit 100 myapp
Lancer en tant qu'utilisateur non-root
docker run --user 1000:1000 myapp
# dans Dockerfile :
RUN useradd -r -u 1000 appuser
USER appuser
Pas de nouveau privilège + seccomp
docker run --security-opt no-new-privileges:true myapp
Scanner les vulnérabilités d'une image
docker scout cves myapp:latest
docker scout quickview myapp:latest

🧹 Nettoyage

Nettoyage global (images, conteneurs, réseaux, cache)
docker system prune              # conteneurs stoppés + images dangling
docker system prune -a           # + toutes images non utilisées
docker system prune -a --volumes # + volumes orphelins
Nettoyage ciblé par type
docker container prune    # conteneurs stoppés
docker image prune -a     # images non utilisées
docker volume prune       # volumes orphelins
docker network prune      # réseaux inutilisés
docker builder prune      # build cache
Supprimer tous les conteneurs stoppés
docker rm $(docker ps -aq -f status=exited)
Voir l'espace disque utilisé par Docker
docker system df
docker system df -v   # détail par image/volume/conteneur
🔍
Aucun résultat pour cette recherche