5 premiers cours
This commit is contained in:
190
01_cours1.md
Normal file
190
01_cours1.md
Normal file
@@ -0,0 +1,190 @@
|
||||
---
|
||||
marp: true
|
||||
theme: default
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
footer: 'Histoire de la Virtualisation - 2025'
|
||||
style: |
|
||||
section {
|
||||
font-family: 'Arial', sans-serif;
|
||||
}
|
||||
h1 {
|
||||
color: #2496ed;
|
||||
}
|
||||
h2 {
|
||||
color: #384c54;
|
||||
}
|
||||
.columns {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
gap: 1rem;
|
||||
}
|
||||
---
|
||||
|
||||
# Docker
|
||||
## Virtualisation
|
||||
|
||||
---
|
||||
|
||||
# Programme
|
||||
1. Histoire de la virtualisation
|
||||
2. Virtualisation
|
||||
3. Conteneurisation
|
||||
4. Histoire de docker
|
||||
5. Cas Docker
|
||||
|
||||
---
|
||||
|
||||
# 1. L'Histoire de la Virtualisation
|
||||
## Pourquoi et Comment nous en sommes arrivés là
|
||||
|
||||
---
|
||||
|
||||
# Années 60 : Le problème des mainframes coûteux
|
||||
|
||||
## Le Contexte
|
||||
- Ordinateurs très chers (plusieurs millions de dollars)
|
||||
- Temps d'utilisation précieux
|
||||
- Une seule tâche à la fois
|
||||
|
||||
## La Solution : IBM M44/44X (1964)
|
||||
- Partager la puissance entre plusieurs utilisateurs
|
||||
- Optimiser l'utilisation des ressources
|
||||
- Permettre l'exécution simultanée de programmes
|
||||
|
||||
---
|
||||
|
||||
# Années 70-80 : Le besoin de développement et test
|
||||
|
||||
<div class="columns">
|
||||
<div>
|
||||
|
||||
## Les Défis
|
||||
- Développement de nouveaux systèmes d'exploitation
|
||||
- Tests de logiciels
|
||||
- Formation des utilisateurs
|
||||
|
||||
</div>
|
||||
<div>
|
||||
|
||||
## La Solution : VM/370
|
||||
- Environnements isolés pour le développement
|
||||
- Possibilité de crasher sans impact
|
||||
- Multiples configurations de test
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
# Années 90 : L'arrivée des PC et le problème de compatibilité
|
||||
|
||||
|
||||
<div class="columns">
|
||||
<div>
|
||||
|
||||
## Nouveaux Besoins
|
||||
- Exécuter d'anciens logiciels DOS
|
||||
- Supporter plusieurs OS sur un même PC
|
||||
- Tester des logiciels sur différents systèmes
|
||||
|
||||
</div>
|
||||
<div>
|
||||
|
||||
## La Solution : VMware
|
||||
- Virtualisation sur PC standard
|
||||
- Support de multiples OS
|
||||
- Coût réduit par rapport aux mainframes
|
||||
</div>
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
# Années 2000 : L'explosion d'Internet et des serveurs
|
||||
|
||||
|
||||
<div class="columns">
|
||||
<div>
|
||||
|
||||
## Problématiques
|
||||
- Multiplication des serveurs physiques
|
||||
- Coûts d'hébergement croissants
|
||||
- Gaspillage de ressources
|
||||
|
||||
</div>
|
||||
<div>
|
||||
|
||||
## Solutions Émergentes
|
||||
- Consolidation des serveurs
|
||||
- Xen et virtualisation open source
|
||||
- Début du "Green IT"
|
||||
</div>
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
# Années 2010 : L'ère du Cloud Computing
|
||||
|
||||
## Nouveaux Défis
|
||||
- Besoin de scalabilité dynamique
|
||||
- Réduction des coûts d'infrastructure
|
||||
- Agilité et rapidité de déploiement
|
||||
|
||||
## La Réponse
|
||||
- Infrastructure as a Service (IaaS)
|
||||
- Conteneurisation avec Docker
|
||||
- Orchestration avec Kubernetes
|
||||
|
||||
---
|
||||
|
||||
# Aujourd'hui : L'omniprésence de la virtualisation
|
||||
|
||||
## Motivations Actuelles
|
||||
- **Économiques**
|
||||
- Optimisation des coûts
|
||||
- Paiement à l'usage
|
||||
- **Techniques**
|
||||
- Déploiement rapide
|
||||
- Haute disponibilité
|
||||
- **Écologiques**
|
||||
- Réduction de l'empreinte carbone
|
||||
- Optimisation des ressources
|
||||
|
||||
---
|
||||
|
||||
# Le Futur : Nouveaux défis, nouvelles solutions
|
||||
|
||||
## Défis Émergents
|
||||
- Edge Computing
|
||||
- Efficacité énergétique
|
||||
- Sécurité et isolation
|
||||
|
||||
## Tendances
|
||||
- Virtualisation assistée par IA
|
||||
- Serverless Computing
|
||||
- Virtualisation imbriquée
|
||||
|
||||
---
|
||||
|
||||
# La Virtualisation : Une réponse à chaque époque
|
||||
|
||||
<div class="columns">
|
||||
<div>
|
||||
|
||||
## Évolution des besoins
|
||||
1. Optimisation des coûts matériels
|
||||
2. Flexibilité de développement
|
||||
3. Compatibilité logicielle
|
||||
4. Efficacité énergétique
|
||||
5. Élasticité des ressources
|
||||
|
||||
</div>
|
||||
<div>
|
||||
|
||||
## Aujourd'hui
|
||||
- Fondation du cloud computing
|
||||
- Base des architectures modernes
|
||||
- Pilier de la transformation numérique
|
||||
|
||||
</div>
|
||||
</div>
|
||||
167
02_virtualisation.md
Normal file
167
02_virtualisation.md
Normal file
@@ -0,0 +1,167 @@
|
||||
---
|
||||
marp: true
|
||||
theme: default
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
footer: 'Virtualisation - 2025'
|
||||
style: |
|
||||
section {
|
||||
font-family: 'Arial', sans-serif;
|
||||
}
|
||||
h1 {
|
||||
color: #2496ed;
|
||||
}
|
||||
h2 {
|
||||
color: #384c54;
|
||||
}
|
||||
---
|
||||
|
||||
|
||||
# 2. Virtualisation
|
||||
## Définition et concepts
|
||||
|
||||
---
|
||||
|
||||
# Virtualisation
|
||||
|
||||
* Serveur hôte
|
||||
* Serveur privé virtuel
|
||||
* Environnement isolé
|
||||
* Système d'exploitation
|
||||
|
||||
---
|
||||
|
||||
# Avantages
|
||||
|
||||
* Utilisation optimale des ressources
|
||||
* Installation, déploiement et migration facile
|
||||
* Sécurisation et/ou Isolation d'un réseau
|
||||
* Socle de base du Cloud Computing
|
||||
* ...
|
||||
|
||||
---
|
||||
|
||||
# Inconvénients
|
||||
|
||||
* Parfois inadapté (Ex : I/O intense)
|
||||
* Un recours à des machines puissantes
|
||||
* Une complexité accrue de l'analyse d'erreurs
|
||||
* ...
|
||||
|
||||
---
|
||||
|
||||
# Terminologie
|
||||
|
||||
* Le **système hôte (host)** est l'OS principal de l'ordianteur.
|
||||
* Le **système invité (guest)** est l'OS installé à l'intérieur d'une machine virtuelle.
|
||||
* Une **machine virtuelle (VM)** est un ordinateur virtuel qui utilise un sysètme invité.
|
||||
* Un ordinateur est aussi appelé serveur privé virtuel
|
||||
**(Virtuel Private Server ou VPS)** ou environnement virtuel (Virtual Environment ou VE).
|
||||
|
||||
---
|
||||
|
||||
# Domaines de virtualisation
|
||||
|
||||
* Virtualisation de serveurs
|
||||
* Virtualisation des applications
|
||||
* Virtualisation du stockage
|
||||
* Virtualisation du réseau
|
||||
|
||||
---
|
||||
|
||||
# Virtualisation de serveurs
|
||||
|
||||
---
|
||||
|
||||
# Hyperviseurs de Type 1
|
||||
* **"Bare-metal"** – directement sur le matériel
|
||||
* Un micro-noyau qui gère l'accès au matériel et donne l'illusion d'exclusivité aux invités
|
||||
* Un des OS (OS privilégié) dispose d'interfaces de gestion vers l'hyperviseur
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Hyperviseurs de Type 1
|
||||
* Exemples
|
||||
* VmWare vSphere
|
||||
* Microsoft Hyper-V
|
||||
* Xen
|
||||
* Oracle VM Server
|
||||
* Citrix Xen Server
|
||||
* KVM
|
||||
* Le noyau linux est l'hyperviseur
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Hyperviseurs de Type 2
|
||||
* Un système dans un système
|
||||
* Architecture hébergée
|
||||
* L'hyperviseur est une couche d'abstraction
|
||||
* Il est possible d'émuler plusieurs composants
|
||||
* Adaptateur vidéo, processeur, adaptateur réseau
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Hyperviseurs de Type 2
|
||||
* Exemples
|
||||
* VmWare
|
||||
* Workstation
|
||||
* Fusion
|
||||
* Player
|
||||
* Oracle VirtualBox
|
||||
* Microsoft VirtualPC
|
||||
* QEMU
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Isolateur
|
||||
|
||||
* Logiciel sur OS hôte
|
||||
* Isolation des exécutions
|
||||
* Exemple :
|
||||
* chroot
|
||||
* LXC
|
||||
* Docker
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Noyau en espace utilisateur
|
||||
|
||||
* Exécution du noyau comme processus utilisateur
|
||||
* Permet le développement et test de noyaux
|
||||
* Exemples :
|
||||
* User Mode Linux (UML)
|
||||
* Colinux
|
||||
* L4Linux
|
||||

|
||||
---
|
||||
|
||||
# Noyau en espace utilisateur
|
||||
|
||||
* Avantages :
|
||||
* Débogage facilité du noyau
|
||||
* Tests sécurisés
|
||||
* Protection du système hôte
|
||||
* Cas d'usage :
|
||||
* Développement de noyaux
|
||||
* Tests de modifications
|
||||
* Expérimentation sécurisée
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Les usages
|
||||
|
||||
* Hyperviseur de type 1 => Professionnel
|
||||
* Hyperviseur de type 2 => Professionnel / Particulier
|
||||
* Isolateur => Professionnel / Particulier
|
||||
* Noyau en espace utilisateur => Développement de noyaux
|
||||
98
03_histoire_docker.md
Normal file
98
03_histoire_docker.md
Normal file
@@ -0,0 +1,98 @@
|
||||
---
|
||||
marp: true
|
||||
theme: default
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
footer: 'Histoire de la Conteneurisation - 2025'
|
||||
style: |
|
||||
section {
|
||||
font-family: 'Arial', sans-serif;
|
||||
}
|
||||
h1 {
|
||||
color: #2496ed;
|
||||
}
|
||||
h2 {
|
||||
color: #384c54;
|
||||
}
|
||||
---
|
||||
|
||||
# L'Histoire de la Conteneurisation 🐳
|
||||
## Des racines Unix à la révolution Docker
|
||||
|
||||
---
|
||||
|
||||
# Il était une fois... Unix (1979) 🌱
|
||||
|
||||
- Introduction de **chroot** dans Unix V7
|
||||
- Premier pas vers l'isolation des processus
|
||||
- Comme une "prison virtuelle" pour les programmes
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# L'Ère des Expérimentations (1991-2006) 🔬
|
||||
|
||||
## Les Innovations Clés :
|
||||
|
||||
- 1991 : Concept du "jail" par Bill Cheswick
|
||||
- 2000 : FreeBSD jails - Version améliorée
|
||||
- 2006 : **Google Process Containers**
|
||||
- Gestion des ressources
|
||||
- Base des futurs conteneurs
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# La Naissance de LXC (2008) 🚀
|
||||
|
||||
## Linux Containers :
|
||||
|
||||
- Premier système de conteneurisation complet
|
||||
- Utilisation des :
|
||||
- cgroups (Control Groups)
|
||||
- Namespaces Linux
|
||||
- Base technologique pour Docker
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# La Révolution Docker (2013) 🐋
|
||||
|
||||
## Un Changement de Paradigme :
|
||||
|
||||
- Création par Solomon Hykes
|
||||
- Standardisation des conteneurs
|
||||
- Interface utilisateur simplifiée
|
||||
- Écosystème riche :
|
||||
- Docker Hub
|
||||
- Docker Compose
|
||||
- Docker Swarm
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# L'Ère de l'Orchestration (2015) ⚡
|
||||
|
||||
## Kubernetes et au-delà :
|
||||
|
||||
- Lancement de Kubernetes par Google
|
||||
- Creation de l'Open Container Initiative (OCI)
|
||||
- Standardisation industrielle
|
||||
- Multi-cloud et portabilité
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Impact sur l'Industrie 📈
|
||||
|
||||
## Transformation Digitale :
|
||||
|
||||
- 74% d'adoption en entreprise
|
||||
- Déploiement simplifié
|
||||
- DevOps facilité
|
||||
- Microservices popularisés
|
||||
190
04_docker.md
Normal file
190
04_docker.md
Normal file
@@ -0,0 +1,190 @@
|
||||
---
|
||||
marp: true
|
||||
theme: default
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
footer: 'Conteneurisation - Partie 1 - 2025'
|
||||
style: |
|
||||
section {
|
||||
font-family: 'Arial', sans-serif;
|
||||
}
|
||||
h1 {
|
||||
color: #2496ed;
|
||||
}
|
||||
h2 {
|
||||
color: #384c54;
|
||||
}
|
||||
---
|
||||
|
||||
# 3. La conteneurisation
|
||||
## Cas de docker
|
||||
|
||||
---
|
||||
|
||||
# Conteneur
|
||||
|
||||
* Environnement isolé
|
||||
* Système hôte
|
||||
* Fonctions de configuration
|
||||
* Dépend de l'hôte/kernel
|
||||
|
||||
---
|
||||
|
||||
# Les types de conteneurs
|
||||
|
||||
* **System :**
|
||||
* simule une **séquence de boot** complète avec
|
||||
un **init process** ainsi que **plusieurs processus** (LXC,
|
||||
OpenVZ).
|
||||
|
||||
* **Process :**
|
||||
* un conteneur **exécute un ou plusieurs processus** directement, en fonction de l'application conteneurisée (Docker, Rkt).
|
||||
|
||||
---
|
||||
|
||||
# Notion importantes
|
||||
|
||||
* Cgroups (Control Groups)
|
||||
* Namespaces
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Les images
|
||||
|
||||
* Point de départ
|
||||
* Archives / Snapshot
|
||||
* On ne refait pas la roue
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Le registre
|
||||
|
||||
* Distributeur d’images
|
||||
* Sécurité ?
|
||||
* Docker Hub
|
||||
* Exemple :
|
||||
* ECS (AWS)
|
||||
* Artifact Registry (Google Cloud)
|
||||
|
||||
---
|
||||
|
||||
# L’empilement des couches (Layers)
|
||||
|
||||
* Structure en couche
|
||||
* Partage des couches
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Cycle de Vie des Conteneurs Docker
|
||||
|
||||
- Introduction au cycle de vie des conteneurs
|
||||
- États possibles et transitions
|
||||
- Commandes de gestion
|
||||

|
||||
|
||||
|
||||
---
|
||||
|
||||
# États des Conteneurs Docker
|
||||
|
||||
**Created**
|
||||
- Conteneur créé mais pas encore démarré
|
||||
- `docker create`
|
||||
|
||||
**Running**
|
||||
- Conteneur en cours d'exécution
|
||||
- `docker run`, `docker start`
|
||||
- Processus actifs à l'intérieur
|
||||
|
||||
|
||||
---
|
||||
|
||||
# États des Conteneurs Docker
|
||||
|
||||
**Paused**
|
||||
- Conteneur en pause (processus gelés)
|
||||
- `docker pause`, `docker unpause`
|
||||
|
||||
**Stopped**
|
||||
- Conteneur arrêté (processus terminés)
|
||||
- `docker stop`, `docker kill`
|
||||
|
||||
---
|
||||
|
||||
# Commandes Principales de Gestion
|
||||
|
||||
**Création et Démarrage**
|
||||
```bash
|
||||
docker run # Crée et démarre un conteneur
|
||||
docker start # Démarre un conteneur existant
|
||||
```
|
||||
|
||||
**Gestion des États**
|
||||
```bash
|
||||
docker pause # Met en pause un conteneur
|
||||
docker unpause # Reprend l'exécution
|
||||
docker stop # Arrête proprement (SIGTERM)
|
||||
docker kill # Arrête immédiatement (SIGKILL)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Commandes Principales de Gestion
|
||||
|
||||
**Suppression**
|
||||
```bash
|
||||
docker rm # Supprime un conteneur arrêté
|
||||
docker rm -f # Force la suppression d'un conteneur
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Inspection et Débug
|
||||
|
||||
**Commandes utiles**
|
||||
```bash
|
||||
docker ps # Liste les conteneurs en cours d'exécution
|
||||
docker ps -a # Liste tous les conteneurs
|
||||
docker logs # Affiche les logs du conteneur
|
||||
docker exec # Exécute une commande dans un conteneur
|
||||
docker stats # Affiche les statistiques d'utilisation
|
||||
```
|
||||
|
||||
**Points importants**
|
||||
- Un conteneur peut être redémarré (`docker restart`)
|
||||
- Les données sont persistantes entre les redémarrages
|
||||
- Les volumes permettent de persister les données même après suppression
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# TP1
|
||||
|
||||
---
|
||||
|
||||
# Le stockage
|
||||
|
||||
* AUFS
|
||||
* DeviceMapper
|
||||
* OverlayFS
|
||||
* Plugins
|
||||

|
||||
|
||||
---
|
||||
|
||||
# Les volumes
|
||||
|
||||
* Persistance des données
|
||||
* Indépendance vis à vis des conteneurs/layers
|
||||
* Deux types de volume:
|
||||
* Conteneur : data conteneur
|
||||
* Hôte : dossier
|
||||
|
||||

|
||||
392
05_networks_dockerfile.md
Normal file
392
05_networks_dockerfile.md
Normal file
@@ -0,0 +1,392 @@
|
||||
---
|
||||
marp: true
|
||||
theme: default
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
footer: 'Conteneurisation - Partie 2 - 2025'
|
||||
style: |
|
||||
section {
|
||||
font-family: 'Arial', sans-serif;
|
||||
}
|
||||
h1 {
|
||||
color: #2496ed;
|
||||
}
|
||||
h2 {
|
||||
color: #384c54;
|
||||
}
|
||||
---
|
||||
|
||||
# Docker Networks & Dockerfile
|
||||
### IUT Sénart-Fontainebleau
|
||||
#### 2025
|
||||
|
||||
---
|
||||
|
||||
# Plan du cours
|
||||
1. Docker Networks
|
||||
- Types de réseaux
|
||||
- Communication entre conteneurs
|
||||
- Use cases et bonnes pratiques
|
||||
- Exercices pratiques
|
||||
|
||||
2. Dockerfile
|
||||
- Construction d'images
|
||||
- Multi-stage builds
|
||||
- Optimisation et sécurité
|
||||
- Cas pratiques
|
||||
|
||||
---
|
||||
|
||||
# 1. Docker Networks
|
||||
|
||||
## Pourquoi les réseaux Docker ?
|
||||
- Isolation des conteneurs
|
||||
- Communication sécurisée
|
||||
- Simulation d'infrastructure
|
||||
- Environnements multi-conteneurs
|
||||
- Séparation des préoccupations
|
||||
|
||||
---
|
||||
|
||||
# Types de réseaux Docker
|
||||
|
||||
## Bridge (default)
|
||||
- Réseau privé interne
|
||||
- Communication entre conteneurs
|
||||
- Port mapping pour accès externe
|
||||
```bash
|
||||
# Création d'un réseau bridge personnalisé
|
||||
docker network create --driver bridge my-network
|
||||
|
||||
# Lancement d'un conteneur sur ce réseau
|
||||
docker run --network my-network --name web1 nginx
|
||||
|
||||
# Inspection du réseau
|
||||
docker network inspect my-network
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Types de réseaux Docker
|
||||
|
||||
## Host
|
||||
- Utilise la stack réseau de l'hôte
|
||||
- Performance maximale
|
||||
- Moins sécurisé
|
||||
- Cas d'usage : haute performance nécessaire
|
||||
```bash
|
||||
# Lancement en mode host
|
||||
docker run --network host nginx
|
||||
|
||||
# Vérification des ports utilisés
|
||||
ss -tunlp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Types de réseaux Docker
|
||||
|
||||
## None
|
||||
- Aucune connectivité réseau
|
||||
- Isolation totale
|
||||
- Pour les traitements isolés
|
||||
- Cas d'usage : scripts de traitement batch
|
||||
```bash
|
||||
# Isolation complète
|
||||
docker run --network none nginx
|
||||
|
||||
# Vérification de l'isolation
|
||||
docker exec [container-id] ping 8.8.8.8
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Communication entre conteneurs
|
||||
|
||||
## Même réseau bridge
|
||||
```bash
|
||||
# Création du réseau
|
||||
docker network create app-network
|
||||
|
||||
# Déploiement d'une stack web
|
||||
docker run -d --network app-network --name frontend nginx
|
||||
docker run -d --network app-network --name backend api
|
||||
docker run -d --network app-network --name db postgres
|
||||
|
||||
# Test de communication
|
||||
docker exec frontend ping backend
|
||||
docker exec backend ping db
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# DNS dans Docker
|
||||
|
||||
## Service Discovery
|
||||
- Résolution automatique des noms
|
||||
- Service discovery intégré
|
||||
- Facilite la mise à l'échelle
|
||||
|
||||
```bash
|
||||
# Communication par nom de service
|
||||
http://backend:8080/api
|
||||
http://db:5432
|
||||
|
||||
# Test de résolution DNS
|
||||
docker exec frontend nslookup backend
|
||||
docker exec frontend wget -qO- http://backend/health
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Inspection et Debug Réseau
|
||||
|
||||
## Outils disponibles
|
||||
```bash
|
||||
# Voir les réseaux
|
||||
docker network ls
|
||||
|
||||
# Détails d'un réseau
|
||||
docker network inspect bridge
|
||||
|
||||
# Connecter/Déconnecter à chaud
|
||||
docker network connect app-network container1
|
||||
docker network disconnect app-network container1
|
||||
|
||||
# Traces réseau
|
||||
docker logs --follow container1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 2. Pourquoi des Dockerfiles ?
|
||||
|
||||
## Problèmes résolus
|
||||
- "Ça marche sur ma machine"
|
||||
- Dépendances manquantes
|
||||
- Versions différentes
|
||||
- Configuration manuelle
|
||||
|
||||
## Avantages
|
||||
- Infrastructure as Code (IaC)
|
||||
- Reproductibilité garantie
|
||||
- Déploiement automatisé
|
||||
- Tests cohérents
|
||||
- Documentation vivante
|
||||
|
||||
---
|
||||
|
||||
# Structure d'un Dockerfile Avancé
|
||||
|
||||
```dockerfile
|
||||
# Base image selection
|
||||
FROM alpine:3.14 AS builder
|
||||
|
||||
# Métadonnées détaillées
|
||||
LABEL maintainer="name@example.com" \
|
||||
version="1.0" \
|
||||
description="Application web" \
|
||||
environment="production"
|
||||
|
||||
# Variables d'environnement
|
||||
ENV APP_HOME=/app \
|
||||
APP_USER=webuser \
|
||||
APP_ENV=prod
|
||||
```
|
||||
|
||||
---
|
||||
```dockerfile
|
||||
# Création utilisateur dédié
|
||||
RUN adduser -D -h $APP_HOME $APP_USER
|
||||
|
||||
# Installation des dépendances
|
||||
RUN apk add --no-cache \
|
||||
nodejs \
|
||||
npm \
|
||||
git
|
||||
|
||||
# Configuration du workdir
|
||||
WORKDIR $APP_HOME
|
||||
|
||||
# Copie et permissions
|
||||
COPY --chown=$APP_USER:$APP_USER . .
|
||||
|
||||
# Switch utilisateur
|
||||
USER $APP_USER
|
||||
|
||||
# Healthcheck
|
||||
HEALTHCHECK --interval=30s --timeout=3s \
|
||||
CMD wget -q localhost:3000/health || exit 1
|
||||
|
||||
# Commande de démarrage
|
||||
CMD ["node", "app.js"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Multi-stage builds
|
||||
|
||||
## Exemple Complet
|
||||
```dockerfile
|
||||
# Stage 1: Build
|
||||
FROM node:16 AS builder
|
||||
WORKDIR /build
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Stage 2: Test
|
||||
FROM builder AS tester
|
||||
RUN npm run test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Multi-stage builds
|
||||
|
||||
## Exemple Complet
|
||||
|
||||
```dockerfile
|
||||
# Stage 3: Production
|
||||
FROM nginx:alpine
|
||||
COPY --from=builder /build/dist /usr/share/nginx/html
|
||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Optimisation des images
|
||||
|
||||
## Techniques avancées
|
||||
1. Utilisation de .dockerignore
|
||||
```dockerignore
|
||||
node_modules
|
||||
*.log
|
||||
.git
|
||||
tests
|
||||
docs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Optimisation des images
|
||||
|
||||
2. Ordonnancement des layers
|
||||
```dockerfile
|
||||
# Bon ordre (moins de rebuilds)
|
||||
COPY package.json .
|
||||
RUN npm install
|
||||
COPY . .
|
||||
|
||||
# Mauvais ordre (rebuilds fréquents)
|
||||
COPY . .
|
||||
RUN npm install
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Optimisation des images
|
||||
|
||||
3. Nettoyage des caches
|
||||
```dockerfile
|
||||
RUN apt-get update && \
|
||||
apt-get install -y package && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Variables d'environnement et Secrets
|
||||
|
||||
## Bonnes pratiques
|
||||
```dockerfile
|
||||
# Variables build-time
|
||||
ARG VERSION=1.0
|
||||
|
||||
# Variables runtime
|
||||
ENV APP_VERSION=${VERSION} \
|
||||
NODE_ENV=production
|
||||
|
||||
# Usage avec arguments
|
||||
docker build --build-arg VERSION=2.0 .
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
# Variables d'environnement et Secrets
|
||||
|
||||
## Secrets en production
|
||||
```bash
|
||||
# Utilisation de docker secrets
|
||||
docker secret create db_password password.txt
|
||||
docker service create --secret db_password ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Healthcheck Détaillé
|
||||
|
||||
## Implémentation robuste
|
||||
```dockerfile
|
||||
HEALTHCHECK --interval=30s \
|
||||
--timeout=3s \
|
||||
--start-period=60s \
|
||||
--retries=3 \
|
||||
CMD wget -q --spider \
|
||||
http://localhost:80/health || exit 1
|
||||
```
|
||||
|
||||
## Monitoring
|
||||
```bash
|
||||
# Vérification status
|
||||
docker inspect --format='{{.State.Health.Status}}' container
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Sécurité et Bonnes Pratiques
|
||||
|
||||
## Sécurisation des conteneurs
|
||||
- Utilisateur non-root
|
||||
- Images officielles ou vérifiées
|
||||
- Scan des vulnérabilités
|
||||
- Mise à jour régulière des bases
|
||||
- Principe du moindre privilège
|
||||
|
||||
```dockerfile
|
||||
# Exemple sécurisé
|
||||
FROM alpine:3.14
|
||||
RUN adduser -D appuser
|
||||
USER appuser
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Déploiement et Tests
|
||||
|
||||
## Workflow complet
|
||||
```bash
|
||||
# Build avec tag
|
||||
docker build -t app:latest .
|
||||
|
||||
# Test local
|
||||
docker run --rm app:latest
|
||||
|
||||
# Publication
|
||||
docker tag app:latest registry/app:latest
|
||||
docker push registry/app:latest
|
||||
|
||||
# Déploiement
|
||||
docker pull registry/app:latest
|
||||
docker run -d app:latest
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Questions & Travaux Pratiques
|
||||
|
||||
Explication de quelques notions pour le TP
|
||||
|
||||
Place aux exercices pratiques !
|
||||
Reference in New Issue
Block a user