# 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
```