Introduction : Pourquoi Docker & Kubernetes ?
Dans le développement logiciel moderne, la rapidité et la fiabilité du déploiement sont cruciales. C'est là que Docker et Kubernetes entrent en jeu. Ils résolvent le fameux problème : "ça marche sur ma machine !".
- Docker vous permet d'empaqueter votre application et toutes ses dépendances dans une "boîte" standardisée appelée conteneur. Ce conteneur peut ensuite s'exécuter de manière identique sur n'importe quel système.
- Kubernetes (souvent abrégé en K8s) est un orchestrateur de conteneurs. Quand vous avez des dizaines ou des milliers de conteneurs à gérer, Kubernetes s'occupe de les déployer, de les mettre à l'échelle, de les surveiller et de les réparer automatiquement.
Ce guide est une feuille de route (Roadmap) et un livre de recettes (Cookbook) pour vous aider à maîtriser ces deux technologies essentielles.
Partie 1 : Roadmap & Cookbook Docker
Étape 1 : Concepts Fondamentaux et Installation
Avant tout, il faut comprendre les bases. Un conteneur n'est pas une machine virtuelle. Il partage le noyau du système d'exploitation hôte, ce qui le rend beaucoup plus léger et rapide.
- Comprendre les concepts : Image, Conteneur, Dockerfile, Registre (Docker Hub).
- Installer Docker Desktop : Le moyen le plus simple de démarrer sur Windows, macOS ou Linux. Rendez-vous sur le site officiel de Docker.
- Vérifier l'installation : Ouvrez votre terminal et tapez :
docker --version
docker run hello-world
Si tout se passe bien, vous verrez un message de bienvenue de Docker.
Étape 2 : Le Cookbook Docker - Votre Première Image
Créons une image pour un serveur web Nginx simple qui affiche une page personnalisée.
- Créez un dossier pour votre projet, et à l'intérieur, créez deux fichiers :
- Fichier
index.html:Bienvenue sur Docker ! Félicitations ! Votre premier conteneur Nginx fonctionne.
- Fichier
Dockerfile(sans extension) : C'est la recette pour construire votre image.# Étape 1: Utiliser une image de base officielle Nginx FROM nginx:alpine # Étape 2: Copier notre fichier HTML personnalisé dans le serveur web COPY index.html /usr/share/nginx/html/index.html # Étape 3 (optionnelle): Exposer le port 80 EXPOSE 80 - Construire et exécuter :
Dans votre terminal, à la racine de votre projet :
# Construire l'image et la nommer "mon-nginx" docker build -t mon-nginx . # Lancer un conteneur à partir de cette image # -d: mode détaché (en arrière-plan) # -p 8080:80: rediriger le port 8080 de votre machine vers le port 80 du conteneur docker run -d -p 8080:80 --name mon-serveur-web mon-nginxOuvrez votre navigateur et allez sur http://localhost:8080. Vous devriez voir votre page personnalisée !
Étape 3 : Commandes Docker Essentielles
# Lister les conteneurs en cours d'exécution
docker ps
# Lister tous les conteneurs (même ceux arrêtés)
docker ps -a
# Arrêter un conteneur
docker stop mon-serveur-web
# Redémarrer un conteneur
docker start mon-serveur-web
# Supprimer un conteneur (il doit être arrêté d'abord)
docker rm mon-serveur-web
# Lister les images sur votre machine
docker images
# Supprimer une image
docker rmi mon-nginx
# Voir les logs d'un conteneur
docker logs mon-serveur-web
Étape 4 : Docker Compose pour les applications multi-conteneurs
Docker Compose permet de définir et de lancer des applications composées de plusieurs services (ex: un site web + une base de données) avec un seul fichier YAML.
Créez un fichier docker-compose.yml :
version: '3.8'
services:
# Service web basé sur notre Dockerfile
web:
build: .
ports:
- "8080:80"
# Service de base de données Redis
redis:
image: "redis:alpine"
Lancez le tout avec une seule commande :
# Démarrer tous les services en arrière-plan
docker-compose up -d
# Arrêter et supprimer les conteneurs
docker-compose down
Partie 2 : Roadmap & Cookbook Kubernetes
Étape 1 : Concepts Fondamentaux et Installation Locale
Kubernetes introduit de nouveaux concepts pour gérer les conteneurs à grande échelle.
- Cluster : Un ensemble de machines (nœuds) sur lesquelles vos conteneurs s'exécutent.
- Pod : La plus petite unité de déploiement. Un Pod contient un ou plusieurs conteneurs.
- Deployment : Décrit l'état souhaité de votre application (ex: "je veux 3 répliques de mon conteneur Nginx"). Il s'assure que cet état est maintenu.
- Service : Expose un ensemble de Pods sur le réseau, leur donnant une adresse IP et un nom DNS stables.
- kubectl : L'outil en ligne de commande pour interagir avec un cluster Kubernetes.
Installation : Pour apprendre, utilisez un cluster local. Options populaires :
- Docker Desktop : Il inclut un cluster Kubernetes que vous pouvez activer dans les paramètres. C'est le plus simple pour commencer.
- Minikube : Un outil qui lance un cluster Kubernetes à nœud unique dans une VM sur votre machine.
- Kind (Kubernetes in Docker) : Utilise des conteneurs Docker comme "nœuds" de votre cluster.
Une fois votre cluster local actif (via Docker Desktop par exemple), vérifiez qu'il fonctionne :
kubectl get nodes
Étape 2 : Le Cookbook K8s - Déployer votre conteneur
Nous allons déployer l'image mon-nginx que nous avons créée précédemment sur notre cluster Kubernetes local. Pour cela, on utilise des fichiers de configuration YAML.
Tout d'abord, poussez votre image sur un registre accessible, comme Docker Hub. Si vous utilisez un cluster local comme Docker Desktop ou Minikube, cette étape n'est souvent pas nécessaire car ils partagent le daemon Docker.
- Créez un fichier
deployment.yaml: - Créez un fichier
service.yamlpour exposer le déploiement : - Appliquer les configurations et tester :
apiVersion: apps/v1
kind: Deployment
metadata:
name: mon-nginx-deployment
spec:
replicas: 2 # Nous voulons 2 instances de notre pod
selector:
matchLabels:
app: mon-nginx
template:
metadata:
labels:
app: mon-nginx
spec:
containers:
- name: nginx-container
image: mon-nginx # Nom de l'image construite localement
imagePullPolicy: IfNotPresent # Important pour utiliser l'image locale
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: mon-nginx-service
spec:
type: NodePort # Expose le service sur un port statique de chaque nœud
selector:
app: mon-nginx # Cible les pods avec ce label
ports:
- protocol: TCP
port: 80 # Port du service dans le cluster
targetPort: 80 # Port sur les pods
# nodePort: 30007 # Optionnel: port fixe sur la machine hôte
# Appliquer le déploiement
kubectl apply -f deployment.yaml
# Appliquer le service
kubectl apply -f service.yaml
# Vérifier que les pods tournent (attendez quelques secondes)
kubectl get pods
# Obtenir les informations du service pour savoir comment y accéder
kubectl get service mon-nginx-service
La dernière commande vous montrera le port mappé sur votre machine locale (par exemple, 80:3XXXX/TCP). Vous pourrez alors accéder à votre application sur http://localhost:PORT où PORT est le numéro affiché (ex: 30007).
Étape 3 : Commandes kubectl Essentielles
# Lister les déploiements, services, pods...
kubectl get all
# Décrire une ressource pour voir les détails et événements
kubectl describe pod [nom-du-pod]
kubectl describe deployment [nom-du-deployment]
# Voir les logs d'un pod
kubectl logs [nom-du-pod]
# Se connecter à un conteneur dans un pod
kubectl exec -it [nom-du-pod] -- /bin/sh
# Mettre à l'échelle un déploiement
kubectl scale deployment mon-nginx-deployment --replicas=4
# Supprimer les ressources créées
kubectl delete -f service.yaml
kubectl delete -f deployment.yaml
Partie 3 : Roadmap - Aller plus loin
Une fois que vous maîtrisez les bases, voici les prochaines étapes de votre parcours d'apprentissage.
Docker Avancé
- Builds multi-étapes (Multi-stage builds) : Pour créer des images de production légères et sécurisées.
- Réseaux Docker (Networks) : Comprendre comment les conteneurs communiquent entre eux.
- Volumes : Pour la persistance des données (bases de données, uploads...).
- Analyse de sécurité : Utiliser des outils comme `docker scan` ou Trivy pour trouver des vulnérabilités dans vos images.
Kubernetes Avancé
- ConfigMaps & Secrets : Pour gérer la configuration et les données sensibles (mots de passe, clés API) en dehors de vos images.
- Ingress : Une manière plus avancée et flexible d'exposer vos services, notamment pour le routage HTTP/HTTPS (ex: mondomaine.com/app1 -> service1).
- Volumes Persistants (PersistentVolume, PersistentVolumeClaim) : Le concept K8s pour le stockage de données qui survivent à la durée de vie d'un pod.
- Helm : Le "gestionnaire de paquets" pour Kubernetes. Il permet d'installer et de gérer des applications complexes (comme un WordPress ou une base de données) de manière simple et réutilisable.
- Monitoring & Logging : Mettre en place des solutions comme Prometheus/Grafana pour la surveillance des métriques et la pile EFK/ELK (Elasticsearch, Fluentd, Kibana) pour la centralisation des logs.
Conclusion de la Roadmap
Le voyage pour maîtriser Docker et Kubernetes est continu. La meilleure façon d'apprendre est de pratiquer. N'hésitez pas à expérimenter, à déployer vos propres applications et à explorer l'immense écosystème qui entoure ces outils.
Ressources utiles :