Conteneurisation

Docker

Cheatsheet Docker — images, conteneurs, volumes, réseaux et Docker Compose

dockerconteneursimagescomposedockerfile

Images

$docker build -t mon-app:1.0 .
Building image from Dockerfile in current directory
$docker images
REPOSITORY    TAG    IMAGE ID       CREATED        SIZE
mon-app       1.0    a1b2c3d4e5f6   2 minutes ago  150MB
$docker pull nginx:alpine
$docker tag mon-app:1.0 registry.example.com/mon-app:1.0
$docker push registry.example.com/mon-app:1.0
$docker rmi mon-app:1.0
$docker image prune -a
Supprime toutes les images non utilisées

Conteneurs

$docker run -d --name web -p 8080:80 nginx:alpine
Lance nginx en arrière-plan, port 8080 → 80
$docker ps
CONTAINER ID   IMAGE          COMMAND   STATUS    PORTS                  NAMES
f1a2b3c4d5e6   nginx:alpine   ...       Up 5s     0.0.0.0:8080->80/tcp   web
$docker ps -a
Affiche tous les conteneurs (y compris arrêtés)
$docker exec -it web sh
Ouvre un shell interactif dans le conteneur
$docker logs -f web
Suivre les logs en temps réel
$docker stop web && docker rm web
$docker stats
Monitorer CPU, mémoire, I/O en temps réel

Dockerfile — bonnes pratiques

# Multi-stage build pour images légères
FROM node:22-alpine AS builder
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
 
FROM node:22-alpine AS runner
WORKDIR /app
RUN addgroup -S app && adduser -S app -G app
COPY --from=builder /app/out ./out
USER app
EXPOSE 3000
CMD ["npx", "serve", "out"]

Règles d'or :

  • Utiliser des images alpine ou distroless
  • Multi-stage builds pour réduire la taille
  • Copier package.json avant le code (cache layers)
  • Ne jamais tourner en root
  • Un process par conteneur
  • .dockerignore pour exclure node_modules, .git, etc.

Volumes

$docker volume create app-data
$docker run -v app-data:/data mon-app
Monte le volume dans /data
$docker run -v $(pwd)/config:/app/config:ro mon-app
Bind mount en lecture seule
$docker volume ls
$docker volume inspect app-data

Réseaux

$docker network create app-net
$docker run -d --name api --network app-net mon-api
$docker run -d --name web --network app-net nginx
web peut atteindre api via http://api:3000
$docker network inspect app-net

Docker Compose

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      db:
        condition: service_healthy
 
  db:
    image: postgres:17-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 5
 
volumes:
  pgdata:
$docker compose up -d
Lance tous les services en arrière-plan
$docker compose logs -f app
$docker compose down -v
Arrete et supprime les volumes

Nettoyage

$docker system prune -a --volumes
Supprime TOUT : conteneurs arrêtés, images, volumes orphelins
$docker system df
Voir l'espace disque utilisé par Docker