72 lines
2.3 KiB
Plaintext
72 lines
2.3 KiB
Plaintext
---
|
|
title: Volumes
|
|
description: Conserver les données indépendamment du cycle de vie des conteneurs.
|
|
---
|
|
|
|
## Un conteneur est éphémère
|
|
|
|
Le système de fichiers propre à un conteneur est jetable. Les écritures disparaissent lorsque le conteneur est détruit ou recréé. Pour une base de données, ce comportement serait inacceptable.
|
|
|
|
Un volume est un stockage persistant géré par Docker et découplé du conteneur : le conteneur va et vient, le volume reste.
|
|
|
|
## Volume nommé
|
|
|
|
```yaml
|
|
services:
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
volumes:
|
|
- postgres_data:/var/lib/postgresql/data
|
|
|
|
volumes:
|
|
postgres_data:
|
|
```
|
|
|
|
Cette configuration monte le volume `postgres_data` sur `/var/lib/postgresql/data`, l'emplacement où PostgreSQL écrit ses données.
|
|
|
|
Les données survivent à un `down` puis un `up`, tant que le volume n'est pas supprimé.
|
|
|
|
<Callout title="Attention à down -v" type="warning">
|
|
docker compose down -v supprime aussi les volumes de la stack. Sur une base contenant des données importantes, cette action est destructive.
|
|
</Callout>
|
|
|
|
## Où vit un volume ?
|
|
|
|
Le volume est stocké dans le système de fichiers du Docker Engine :
|
|
|
|
- directement sur l'hôte avec Linux ;
|
|
- dans la VM Linux Docker Desktop avec Mac ou Windows.
|
|
|
|
Ce n'est pas un dossier du dépôt. Docker en gère l'emplacement et le cycle de vie.
|
|
|
|
## Bind mount : monter un dossier de l'hôte
|
|
|
|
En développement, on veut voir les modifications de code immédiatement dans le conteneur :
|
|
|
|
```yaml
|
|
services:
|
|
backend:
|
|
volumes:
|
|
- ./backend:/app
|
|
- /app/node_modules
|
|
- /app/dist
|
|
```
|
|
|
|
### Le code local
|
|
|
|
`./backend:/app` monte le dossier du projet dans le conteneur. Quand un fichier est modifié sur l'hôte, le serveur dans le conteneur le voit et peut redémarrer en hot-reload.
|
|
|
|
### Les dépendances du conteneur
|
|
|
|
Le bind mount masquerait le dossier `node_modules` installé dans l'image. Le volume anonyme `/app/node_modules` le protège des fichiers absents ou incompatibles de l'hôte.
|
|
|
|
## Développement ou production
|
|
|
|
| Contexte | Stockage recommandé |
|
|
| --- | --- |
|
|
| Code en développement | Bind mount pour le hot-reload |
|
|
| Dépendances internes | Volume anonyme si le bind mount les masque |
|
|
| Données PostgreSQL | Volume nommé |
|
|
| Code en production | Dans l'image, sans bind mount |
|
|
| Données persistantes en production | Volume nommé et sauvegardé |
|