Aller au contenu principal

DevOps & Cloud · L3 · Section 2/12

Conteneurs et images

Progression

Points d’expérience : XPSérie de jours consécutifs : · —Progression du module : — / —compris

#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

Image
Template immuable (système de fichiers + metadata)
Conteneur
Instance en cours d'exécution
Registry
Stockage d'images (Docker Hub, ECR, GCR)
Orchestrateur
Gère plusieurs conteneurs (K8s, Swarm)

#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.

dockerfiledockerfile

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.

dockerfiledockerfile

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.

bashbash

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.

dockerfiledockerfile

1HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \2  CMD curl -f http://localhost:3000/health || exit 1

#Quiz

Pourquoi utiliser un multi-stage build?
Pourquoi utiliser un multi-stage build?