Ajouts du TP2

This commit is contained in:
stiti
2025-04-02 11:57:28 +02:00
parent 90b5c314e5
commit a0e2bb3ee0
12 changed files with 305 additions and 0 deletions

0
README.md Normal file → Executable file
View File

0
TP1/COMMANDS.md Normal file → Executable file
View File

0
TP1/QUESTIONS.md Normal file → Executable file
View File

0
TP1/tp0.pdf Normal file → Executable file
View File

164
TP2/COMMANDS.md Executable file
View File

@@ -0,0 +1,164 @@
# TP2 - Volumes et Bind-mounts
## Sommaire
- [Introduction](#introduction)
- [Exercice n°1 : Docker volumes](#exercice-n1--docker-volumes)
- [Récupération de l'image Alpine](#récupération-de-limage-alpine)
- [Création d'un volume](#création-dun-volume)
- [Ajout d'un fichier HTML dans le volume](#ajout-dun-fichier-html-dans-le-volume)
- [Vérification du contenu](#vérification-du-contenu)
- [Utilisation du volume avec un serveur web](#utilisation-du-volume-avec-un-serveur-web)
## Introduction
Ce TP explore les concepts de volumes et de bind-mounts dans Docker. Les volumes permettent de persister les données entre les conteneurs, tandis que les bind-mounts permettent de partager des fichiers entre l'hôte et les conteneurs.
## Exercice n°1 : Docker volumes
### Récupération de l'image Alpine
Pour commencer, nous récupérons l'image Alpine 3.17 :
```bash
sudo docker pull alpine:3.17
```
Résultat (déjà présent) :
```
3.17: Pulling from library/alpine
Digest: sha256:8fc3dacfb6d69da8d44e42390de777e48577085db99aa4e4af35f483eb08b989
Status: Image is up to date for alpine:3.17
docker.io/library/alpine:3.17
```
### Création d'un volume
Pour créer un volume Docker nommé `volume_serveur_web` :
```bash
docker volume create volume_serveur_web
```
Résultat :
```
volume_serveur_web
```
### Ajout d'un fichier HTML dans le volume
Pour déposer un fichier dans ce volume, nous devons d'abord créer un conteneur temporaire qui monte ce volume :
```bash
docker run --rm -v volume_serveur_web:/data alpine sh -c "echo '<html><body><h1>Moncef STITI</h1></body></html>' > /data/index.html"
```
Cette commande effectue les actions suivantes :
- Lance un conteneur Alpine temporaire
- Monte le volume "volume_serveur_web" à l'emplacement `/data` dans le conteneur
- Crée un fichier `index.html` avec mon nom et prénom au format HTML
- Supprime automatiquement le conteneur après exécution (grâce à l'option `--rm`)
### Vérification du contenu
Pour vérifier que tout a fonctionné correctement, on peut inspecter le volume :
```bash
docker volume inspect volume_serveur_web
```
Résultat : La commande renvoie des informations détaillées sur le volume au format JSON.
Pour afficher le contenu du fichier `index.html` créé dans le volume :
```bash
docker run --rm -v volume_serveur_web:/data alpine cat /data/index.html
```
Résultat :
```html
<html><body><h1>Moncef STITI</h1></body></html>
```
### Démarrer un conteneur
- Démarrer un conteneur en mode détaché nommé tp21
```bash
docker run -d --name tp21 httpd:alpine3.17
```
Résultat : 05b6e9bb200d33ef4ca42349ba161eb594b1e569c87b36544206986a5f9843c9
- Démarrer un conteneur en mode détaché en montant le volume précédemment créé nommé tp22
```bash
docker run -d --name tp22 -v volume_serveur_web:/usr/local/apache2/htdocs httpd:alpine3.17
```
Résultat : 2de4800ec7b48c5b5d5b564368c5db6ec021c9c65840deb08727c6bef51b6684
- Démarrer un conteneur en mode détaché en montant le volume précédemment créé et en exposant le port 80 nommé tp23
```bash
docker run -d --name tp23 -v volume_serveur_web:/usr/local/apache2/htdocs -p 80:80 httpd:alpine3.17
```
Résultat : 0bc2aa9103867c34c92596767c11f8993b6627b8ce019987ab4c63a6f29c7c16
Pour accéder au localhost : (localhost:80)[localhost:80]
## Exercice complémentaire
1. Création d'un deuxième volume backup_web
```bash
docker volume create backup_web
```
2. Copie du contenu du premier volume vers le nouveau volume
Pour copier le contenu du premier volume vers le deuxième, nous devons utiliser un conteneur temporaire qui monte les deux volumes simultanément :
```bash
docker run --rm -v volume_serveur_web:/source -v backup_web:/destination alpine sh -c "cp -r /source/* /destination/"
```
3. Vérification que la copie a bien fonctionné
```bash
docker run --rm -v backup_web:/data alpine cat /data/index.html
```
Ce qui devrait renvoyer :
```html
<html><body><h1>Votre Prénom Votre Nom</h1></body></html>
```
4. Démarrage d'un conteneur tp24 qui monte les deux volumes simultanément
```bash
docker run -d --name tp24 \
-v volume_serveur_web:/usr/local/apache2/htdocs \
-v backup_web:/backup \
-p 8080:80 \
httpd:alpine3.17
```
Pour vérifier que les deux volumes sont bien montés dans le conteneur :
```bash
docker exec tp24 ls -la /usr/local/apache2/htdocs
docker exec tp24 ls -la /backup
```
## Exercice 2 - Docker bind mounts
- Démarrer un conteneur en mode détaché nommé tp25 qui monte le dossier web local dans /usr/local/apache2/htdocs
```bash
docker run -d --name tp25 -v $(pwd)/web:/usr/local/apache2/htdocs httpd:alpine3.17
```
- Démarrer un conteneur en mode détaché nommé tp26 qui monte le dossier web et expose le port 8080
```bash
docker run -d --name tp26 -p 8080:80 -v $(pwd)/web:/usr/local/apache2/htdocs httpd:alpine3.17
```
- Démarrer un conteneur en mode détaché nommé tp27 qui monte uniquement le fichier index.html (et non tout le dossier)
```bash
docker run -d --name tp27 -v $(pwd)/web/index.html:/usr/local/apache2/htdocs/index.html httpd:alpine3.17
```
## Exercice complémentaire
2. Oui les changements se font directement
4. Vérifiez que le nouveau fichier est visible dans le conteneur :
```bash
docker exec tp25 cat /usr/local/apache2/htdocs/about.html
```

60
TP2/QUESTIONS.md Executable file
View File

@@ -0,0 +1,60 @@
# TP2 - Volumes et Bind-mounts
## Sommaire
## Questions
### 1. Quelle est la différence entre un bind mount et un volume Docker ?
Aucune idée pour le moment
### 2. Où sont stockés physiquement les volumes Docker sur votre machine ?
Les volumes Docker sont stockés physiquement (donc dans la machine hôte) dans le répertoire /var/lib/docker/volumes/.
On peut utiliser la commande suivante :
```bash
docker volume inspect [nom-du-volume]
```
Et on voit le chemin dans la catégorie "Mountpoint"
### 3. Comment lister les volumes existants ?
On peut utiliser la commande :
```bash
docker volume ls
```
Cette commande affichera tous les volumes disponibles avec leur nom et leur driver.
### 4. Comment inspecter le contenu d'un volume ?
La méthode la plus simple consiste à créer un conteneur temporaire qui monte le volume, puis à explorer son contenu :
Une fois dans le conteneur, vous pouvez utiliser des commandes standard comme `ls`, `cat`, `grep`, etc. pour explorer le contenu du volume.
### 5. Que se passe-t-il pour les données d'un volume quand on supprime le conteneur associé ?
Quand on supprime un conteneur Docker, les données stockées dans les volumes associés à ce conteneur sont conservées (c'est l'un des avantages principale des volumes).
### 6. Quand utiliser un bind mount plutôt qu'un volume Docker ?
Les bind mounts sont préférables aux volumes Docker quand on développe une application et on souhaite voir les changements immédiatement sans reconstruire l'image. Ils sont aussi utiles pour injecter des fichiers de configuration depuis l'hôte ou accéder à des données spécifiques du système hôte. Les bind mounts facilitent les sauvegardes rapides et l'intégration avec d'autres outils locaux nécessitant l'accès aux mêmes fichiers. Dans certains scénarios, ils peuvent offrir de meilleures performances pour les opérations d'E/S intensives. Contrairement aux volumes Docker qui sont gérés par Docker et plus adaptés à la production, les bind mounts dépendent de la structure du système de fichiers de l'hôte.
### 7. Peut-on monter plusieurs dossiers dans un même conteneur ?
Oui, c'est totalement possible. D'ailleurs, en entreprise c'est très courant de le faire parce que ça permet de faire des choses du genre :
- Dossier logs
- Dossier config
- Dossier web
...
### 8. Quelle est la différence entre monter un dossier et monter un fichier unique ?
La différence entre monter un dossier et monter un fichier unique dans Docker est simple. Quand on monte un dossier, tout son contenu est accessible et modifiable dans le conteneur. Chaque fichier ajouté, modifié ou supprimé est instantanément synchronisé entre l'hôte et le conteneur. C'est pratique pour des sites web ou des applications avec plusieurs fichiers.
Quand on monte un fichier unique, seul ce fichier précis est partagé avec le conteneur. Le reste du dossier parent n'est pas accessible. C'est utile pour remplacer juste un fichier de configuration spécifique tout en gardant les autres fichiers par défaut du conteneur.
Si on monte un dossier, on peut ajouter de nouveaux fichiers qui seront visibles dans le conteneur. Avec un fichier unique, on ne peut que modifier son contenu, pas en créer d'autres à côté.
### 9. Les modifications sont-elles bidirectionnelles avec un bind mount ?
Oui, les modifications sont bidirectionnelles avec un bind mount. Cela signifie que tout changement fait dans le dossier ou le fichier monté est visible à la fois sur la machine hôte et dans le conteneur.
Si vous modifiez un fichier depuis l'intérieur du conteneur, ce changement sera immédiatement visible dans le système de fichiers de l'hôte. De même, si vous modifiez le fichier directement sur l'hôte, le changement sera instantanément visible dans le conteneur.
Cette bidirectionnalité est l'un des principaux avantages des bind mounts, permettant une synchronisation en temps réel. C'est particulièrement utile pendant le développement, car vous pouvez modifier du code sur votre machine hôte avec votre éditeur habituel et voir les changements prendre effet immédiatement dans l'application exécutée dans le conteneur.
### 10. Comment vérifier les bind mounts actifs sur un conteneur ?
Pour vérifier les bind mounts actifs sur un conteneur Docker, vous pouvez utiliser :
```bash
docker inspect --format='{{.Mounts}}' nom_conteneur
```

BIN
TP2/tp2.pdf Executable file

Binary file not shown.

15
TP2/web/about.html Normal file
View File

@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>À Propos</title>
</head>
<body>
<h1>À Propos</h1>
<p>Bienvenue sur la page "À propos".</p>
<p>Docker c'est pas mal</p>
<hr>
<p><a href="index.html">Retour à l'accueil</a></p>
</body>
</html>

14
TP2/web/index.html Executable file
View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>TP n°2</title>
<link rel="stylesheet" href="./styles.css">
</head>
<body>
<h1>Moncef STITI</h1>
</body>
<script src="./script.js"></script>
</html>

1
TP2/web/script.js Executable file
View File

@@ -0,0 +1 @@
alert("Bienvenue");

3
TP2/web/styles.css Executable file
View File

@@ -0,0 +1,3 @@
h1 {
color: red;
}

48
delete.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/bin/bash
# Afficher un message d'avertissement et demander confirmation
echo "ATTENTION: Ce script va supprimer tous vos conteneurs Docker"
echo "et optionnellement les images, volumes et réseaux."
echo ""
read -p "Voulez-vous continuer? (o/n): " CONFIRMATION
if [[ "$CONFIRMATION" != "o" && "$CONFIRMATION" != "O" ]]; then
echo "Opération annulée."
exit 0
fi
echo ""
echo "Arrêt et suppression de tous les conteneurs..."
# Arrêter tous les conteneurs en cours d'exécution
sudo docker stop $(sudo docker ps -aq) 2>/dev/null
# Supprimer tous les conteneurs
sudo docker rm $(sudo docker ps -aq) 2>/dev/null
echo ""
read -p "Voulez-vous aussi supprimer toutes les images Docker? (o/n): " DELETE_IMAGES
if [[ "$DELETE_IMAGES" == "o" || "$DELETE_IMAGES" == "O" ]]; then
echo "Suppression de toutes les images Docker..."
sudo docker rmi $(sudo docker images -q) -f 2>/dev/null
fi
echo ""
read -p "Voulez-vous supprimer tous les volumes Docker? (o/n): " DELETE_VOLUMES
if [[ "$DELETE_VOLUMES" == "o" || "$DELETE_VOLUMES" == "O" ]]; then
echo "Suppression de tous les volumes Docker..."
sudo docker volume rm $(sudo docker volume ls -q) 2>/dev/null
fi
echo ""
read -p "Voulez-vous supprimer tous les réseaux Docker? (o/n): " DELETE_NETWORKS
if [[ "$DELETE_NETWORKS" == "o" || "$DELETE_NETWORKS" == "O" ]]; then
echo "Suppression de tous les réseaux Docker (sauf les réseaux par défaut)..."
sudo docker network rm $(sudo docker network ls -q) 2>/dev/null
fi
echo ""
echo "Nettoyage terminé!"
echo "Statut actuel:"
echo "Conteneurs restants: $(sudo docker ps -aq | wc -w)"
echo "Images restantes: $(sudo docker images -q | wc -w)"
echo "Volumes restants: $(sudo docker volume ls -q | wc -w)"
echo "Réseaux restants: $(sudo docker network ls -q | wc -w)"