164 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			164 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# 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
							 | 
						||
| 
								 | 
							
								```
							 |