--- 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é. docker compose down -v supprime aussi les volumes de la stack. Sur une base contenant des données importantes, cette action est destructive. ## 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é |