9  Cloud-native

9.1 Docker : Conteneurisation d’Applications

Docker […] helps software applications run inside containers (Containers provide a clean, tidy environment for software applications that make them easier to run anywhere). Docker started as an internal project within dotCloud, a platform-as-a-service, but became so popular that the founders decided to make Docker the main focus of the company. The Docker project was open sourced in 2013. Docker has raised $180M with an estimated valuation of over $1B. Their business is based on support, private plans, and services. Docker’s 2014 revenue was less than $10 million (Eghbal 2016, (48))

Docker est une plateforme de conteneurisation qui permet de packager une application et ses dépendances dans un conteneur isolé. Un conteneur est une unité standardisée de logiciel qui inclut tout ce dont une application a besoin pour fonctionner : code, runtime, outils système, bibliothèques et paramètres.

9.1.1 Avantages de Docker

  • Isolation : Les conteneurs Docker s’exécutent de manière isolée les uns des autres, ce qui signifie que les applications ne peuvent pas interférer entre elles. Cela améliore la sécurité et la stabilité.
  • Portabilité : Les conteneurs Docker peuvent s’exécuter sur n’importe quelle machine équipée de Docker, qu’il s’agisse d’un ordinateur local, d’un serveur dans le cloud ou d’une machine virtuelle. Cela facilite le déploiement et la migration des applications.
  • Efficacité : Les conteneurs partagent le noyau du système d’exploitation de l’hôte, ce qui les rend plus légers et plus rapides à démarrer que les machines virtuelles.
  • Gestion des dépendances : Docker permet de définir toutes les dépendances d’une application dans un fichier Dockerfile, ce qui simplifie la gestion des dépendances et garantit que l’application s’exécute de la même manière dans tous les environnements.
# Utilise une image de base Python
FROM python:3.12

# Définit le répertoire de travail
WORKDIR /app

# Copie les fichiers de dépendances
COPY requirements.txt .

# Installe les dépendances
RUN pip install --no-cache-dir -r requirements.txt

# Copie le reste de l'application
COPY . .

# Expose le port sur lequel l'application Django s'exécute
EXPOSE 8000

# Commande pour démarrer l'application
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

9.1.2 Commandes Docker de Base

  • Construire une image : docker build -t mon-app-django .
  • Exécuter un conteneur : docker run -p 8000:8000 mon-app-django
  • Lister les conteneurs en cours d’exécution : docker ps
  • Arrêter un conteneur : docker stop <ID-du-conteneur>

9.1.3 Difficultés avec Docker

  • Gestion des Images : Les images Docker peuvent devenir volumineuses et difficiles à gérer. Il est important de suivre les bonnes pratiques pour optimiser les images, comme utiliser des images de base légères et supprimer les fichiers inutiles.
  • Sécurité : Les conteneurs Docker partagent le noyau du système d’exploitation de l’hôte, ce qui peut poser des problèmes de sécurité. Il est important de suivre les bonnes pratiques de sécurité, comme exécuter les conteneurs avec des utilisateurs non root et utiliser des images de base sécurisées.
  • Réseau et Stockage : La gestion du réseau et du stockage dans Docker peut être complexe, surtout dans des environnements distribués. Il est important de bien comprendre les concepts de réseau et de stockage dans Docker et de suivre les bonnes pratiques.

9.1.4 Performances

Tip

Docker on Linux performs efficiently but eats the margins. I ran an additional test using a Debian 13 Docker container running on the Alpine Linux host. At peak load (50 connections), the throughput was impressive and virtually identical to bare metal: ~63.7k req/s for HTTP and ~62.7k req/s for HTTPS. However, there is a clear cost. First, while the bare metal host maintained a small CPU buffer (~7% idle) during the HTTPS test, Docker saturated the CPU to 100%. Second, at lower concurrency (10 connections), the overhead became visible. The Docker container scored ~30.2k req/s for HTTP and ~27.8k req/s for HTTPS, slightly trailing the ~31-34k and ~29-31k range of the bare metal counterparts. The abstraction layers (NAT, bridging, namespaces) are extremely efficient, but they are not completely free.

– https://it-notes.dragas.net/2025/11/19/static-web-hosting-intel-n150-freebsd-smartos-netbsd-openbsd-linux/

9.1.5 Docker-compose

D’abord, après avoir installer docker-compose et les dépendances sous debian, tu dois t’ajouter dans le groupe docker, sinon il faut être root pour utiliser docker.

Bon après c’est facile, un petit virtualenv pour cookiecutter, suivi d’une installation du template django. Et puis j’ai suivi https://cookiecutter-django.readthedocs.io/en/latest/developing-locally-docker.html

Alors, il télécharge les images, fait un petit update, installe les dépendances de dev, install les requirement pip …

Du coup, ça prend vite de la place : image.png

L’image de base python passe de 179 à 740 MB. Et là j’en ai pour presque 1,5 GB d’un coup.

Mais par contre, j’ai un python 3.7 direct et postgres 10 sans rien faire ou presque.

La partie ci-dessous a été reprise telle quelle de https://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html[la documentation de cookie-cutter-django].

le serveur de déploiement ne doit avoir qu’un accès en lecture au dépôt source.

Plein d’exemples de fichier de composition pour différentes infrastructures et architectures :

https://github.com/docker/awesome-compose

9.1.6 Ressources

https://phase.dev/blog/docker-compose-secrets/

9.2 Kubernetes : Orchestration de Conteneurs

Kubernetes est une plateforme d’orchestration de conteneurs qui automatise le déploiement, la mise à l’échelle et la gestion des applications conteneurisées. Il offre des fonctionnalités avancées pour gérer des applications complexes et distribuées.

9.2.1 Avantages de Kubernetes

  • Mise à l’échelle automatique : Kubernetes peut automatiquement ajuster le nombre de réplicas d’une application en fonction de la charge, ce qui permet de gérer efficacement les pics de trafic.
  • Haute disponibilité : Kubernetes assure que les applications sont toujours disponibles en redémarrant automatiquement les conteneurs qui échouent et en répartissant les charges entre plusieurs nœuds.
  • Gestion des configurations et des secrets : Kubernetes permet de gérer les configurations et les secrets de manière centralisée, ce qui simplifie la gestion des environnements de développement, de test et de production.
  • Déploiements et mises à jour sans temps d’arrêt : Kubernetes prend en charge les déploiements progressifs et les mises à jour sans temps d’arrêt, ce qui permet de déployer de nouvelles versions d’une application sans interrompre le service.

9.2.2 Concepts Clés de Kubernetes

  • Pods : La plus petite unité déployable dans Kubernetes. Un pod peut contenir un ou plusieurs conteneurs qui partagent les mêmes ressources et le même réseau.
  • Deployments : Un objet Kubernetes qui gère le déploiement et la mise à jour des pods. Il assure que le nombre spécifié de réplicas d’un pod est toujours en cours d’exécution.
  • Services : Un objet Kubernetes qui définit une politique d’accès à un ensemble de pods. Il permet de mettre en place un équilibrage de charge et de rendre les pods accessibles depuis l’extérieur du cluster.
  • ConfigMaps et Secrets : Des objets Kubernetes qui permettent de gérer les configurations et les secrets de manière centralisée.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mon-app-django
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mon-app-django
  template:
    metadata:
      labels:
        app: mon-app-django
    spec:
      containers:
      - name: mon-app-django
        image: mon-app-django:latest
        ports:
        - containerPort: 8000
        envFrom:
        - configMapRef:
            name: mon-app-django-config
        - secretRef:
            name: mon-app-django-secrets
---
apiVersion: v1
kind: Service
metadata:
  name: mon-app-django-service
spec:
  selector:
    app: mon-app-django
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000
  type: LoadBalancer

9.2.3 Commandes Kubernetes de Base

  • Déployer une application : kubectl apply -f mon-app-django-deployment.yaml
  • Lister les pods : kubectl get pods
  • Lister les services : kubectl get services
  • Mettre à jour un déploiement : kubectl rollout restart deployment/mon-app-django

9.2.4 Difficultés avec Kubernetes

  • Complexité : Kubernetes est une plateforme complexe avec de nombreux concepts et fonctionnalités. Il peut être difficile de comprendre et de maîtriser tous les aspects de Kubernetes.
  • Gestion des Ressources : La gestion des ressources dans Kubernetes peut être complexe, surtout dans des environnements distribués. Il est important de bien comprendre les concepts de gestion des ressources dans Kubernetes et de suivre les bonnes pratiques.
  • Sécurité : La sécurité dans Kubernetes peut être complexe, surtout dans des environnements distribués. Il est important de suivre les bonnes pratiques de sécurité, comme utiliser des politiques de sécurité et des rôles et permissions appropriés.

9.3 Conclusion

TBC