---
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é |
