Pourquoi Docker pour le web ?

Docker résout le problème classique « ça marche sur ma machine ». En encapsulant votre application et ses dépendances dans un conteneur, vous garantissez un comportement identique du développement à la production.

Ce site satellite est lui-même déployé via Docker, comme tous les projets que nous livrons chez Lueur Externe.

Les concepts fondamentaux

Image vs Conteneur

  • Image : un template en lecture seule contenant votre application et ses dépendances
  • Conteneur : une instance en cours d’exécution d’une image

Analogie : l’image est la recette, le conteneur est le plat préparé.

Dockerfile

Le Dockerfile décrit comment construire votre image :

# Étape 1 : Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Étape 2 : Production
FROM caddy:2-alpine
COPY --from=builder /app/dist /srv
COPY Caddyfile /etc/caddy/Caddyfile
EXPOSE 80

Ce Dockerfile multi-stage produit une image légère contenant uniquement les fichiers statiques et le serveur web.

Docker Compose

Pour les applications multi-services, Docker Compose orchestre plusieurs conteneurs :

version: "3.8"
services:
  web:
    build: .
    ports:
      - "80:80"
    restart: unless-stopped
    
  monitoring:
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana

volumes:
  grafana-data:

Bonnes pratiques pour la production

Images légères

  • Utilisez des images de base Alpine (node:20-alpine au lieu de node:20)
  • Multi-stage builds pour séparer build et runtime
  • Fichier .dockerignore pour exclure node_modules, .git, etc.

Sécurité

  • Ne lancez jamais de conteneur en tant que root
  • Scannez vos images avec docker scout ou Trivy
  • Utilisez des images officielles et à jour
  • Limitez les ressources (CPU, mémoire) par conteneur

Performance

  • Ordonnez les instructions du Dockerfile du moins au plus changeant (pour le cache)
  • Combinez les commandes RUN pour réduire les couches
  • Utilisez COPY plutôt que ADD sauf pour les archives

Monitoring

  • Health checks dans le Dockerfile ou Docker Compose
  • Logs centralisés (stdout/stderr)
  • Métriques de ressources (CPU, mémoire, réseau)

Intégration CI/CD

Dans notre pipeline GitLab CI/CD chez Lueur Externe, Docker s’intègre naturellement :

build-image:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

deploy:
  stage: deploy
  script:
    - docker compose pull
    - docker compose up -d

Alternatives et compléments

  • Podman : alternative rootless à Docker
  • Kubernetes : orchestration pour les déploiements à grande échelle
  • Docker Swarm : orchestration simplifiée intégrée à Docker

Conclusion

Docker est devenu incontournable pour le déploiement d’applications web modernes. Il simplifie la mise en production, garantit la reproductibilité et facilite le scaling. Lueur Externe utilise Docker sur tous ses projets d’infrastructure.