Ajouts du TP2
This commit is contained in:
0
TP1/COMMANDS.md
Normal file → Executable file
0
TP1/COMMANDS.md
Normal file → Executable file
0
TP1/QUESTIONS.md
Normal file → Executable file
0
TP1/QUESTIONS.md
Normal file → Executable file
0
TP1/tp0.pdf
Normal file → Executable file
0
TP1/tp0.pdf
Normal file → Executable file
164
TP2/COMMANDS.md
Executable file
164
TP2/COMMANDS.md
Executable 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
60
TP2/QUESTIONS.md
Executable 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
BIN
TP2/tp2.pdf
Executable file
Binary file not shown.
15
TP2/web/about.html
Normal file
15
TP2/web/about.html
Normal 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
14
TP2/web/index.html
Executable 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
1
TP2/web/script.js
Executable file
@@ -0,0 +1 @@
|
||||
alert("Bienvenue");
|
3
TP2/web/styles.css
Executable file
3
TP2/web/styles.css
Executable file
@@ -0,0 +1,3 @@
|
||||
h1 {
|
||||
color: red;
|
||||
}
|
48
delete.sh
Executable file
48
delete.sh
Executable 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)"
|
Reference in New Issue
Block a user