DevOps & Cloud · L3 · Section 2/12
Conteneurs et images
Progression
#Conteneurs et images
Une image décrit un système de fichiers figé et un point d'entrée. Un conteneur est une instance en cours d'exécution d'une image. Cette distinction est fondamentale.
#Concepts clés
#Dockerfile: construire une image
Un Dockerfile décrit les étapes pour construire une image. Chaque instruction crée une couche (layer) qui est mise en cache.
1# Image de base2FROM node:20-alpine3 4# Métadonnées5LABEL maintainer="dev@example.com"6 7# Répertoire de travail8WORKDIR /app9 10# Copier les fichiers de dépendances d'abord (optimisation du cache)11COPY package*.json ./12 13# Installer les dépendances14RUN npm ci --only=production#Multi-stage builds
Les builds multi-étapes permettent de séparer l'environnement de build de l'image finale.
1# Étape 1: build2FROM node:20-alpine AS builder3WORKDIR /app4COPY package*.json ./5RUN npm ci6COPY . .7RUN npm run build8 9# Étape 2: production (image finale légère)10FROM node:20-alpine11WORKDIR /app12COPY --from=builder /app/dist ./dist13COPY --from=builder /app/node_modules ./node_modules14EXPOSE 3000#Sécurité des images
Ne pas inclure de secrets: les variables d'environnement, ARG à la build, ou des fichiers .env ne doivent jamais contenir de secrets. Utilisez des solutions comme Docker secrets ou des gestionnaires de secrets (Vault).
Scanner les vulnérabilités: des outils comme Trivy, Snyk ou Clair détectent les CVE dans les dépendances.
Images signées: vérifier l'origine des images avec Docker Content Trust ou Cosign.
1# Scanner une image avec Trivy2trivy image myapp:latest3 4# Signer une image avec Cosign5cosign sign --key cosign.key myapp:latest#Isolation des conteneurs
Les conteneurs utilisent des fonctionnalités du noyau Linux pour l'isolation:
Namespaces: chaque conteneur a sa propre vue du système (PID, réseau, montages).
Cgroups: limitent les ressources (CPU, mémoire, I/O).
Seccomp: filtre les appels système autorisés.
#Bonnes pratiques
Images de base officielles et maintenues: évitez les images random de Docker Hub.
Version explicite: node:20.10.0-alpine plutôt que node:latest.
Un processus par conteneur: facilite le scaling et la supervision.
Stateless: les conteneurs ne conservent pas d'état. Utilisez des volumes ou des services externes.
Health checks: permettent à l'orchestrateur de détecter les problèmes.
1HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \2 CMD curl -f http://localhost:3000/health || exit 1