Aller au contenu

Docker volumes

De Marmits Wiki

Syntaxe

exemple `compose.yml`

services:
   # declaration a
   volumes:
    - nodeModule:/var/www/node_modules
    - vendor:/var/www/vendor
    - var:/var/www/var

# declaration b
volumes:
  vendor:
  var:
  nodeModule:

--- Cette syntaxe concerne la gestion des volumes nommés dans Docker. Voici ce qu’il faut comprendre :

Intérêt de cette syntaxe (volumes nommés) :

  1. Persistance des données : Les volumes nommés (vendor, var, nodeModule) permettent de conserver les données même après la suppression du conteneur.
  2. Partage entre conteneurs : Ces volumes peuvent être partagés entre plusieurs services (utile par exemple pour partager des dépendances comme node_modules ou vendor entre plusieurs conteneurs).
  3. Performances : Sur certains systèmes (comme macOS/Windows avec Docker Desktop), monter des volumes pour des dossiers comme node_modules ou vendor améliore les performances (évite les problèmes de synchronisation de fichiers avec les mounts bind classiques).

Que se passe-t-il si vous supprimez la partie sous # declaration b ?

  • Les volumes nommés ne seront pas créés : Docker essaiera de monter les volumes (nodeModule, vendor, var), mais comme ils ne sont pas déclarés dans la section volumes: racine, Docker les traitera comme des montages anonymes (volumes temporaires avec un nom généré aléatoirement).
  • Comportement différent au redémarrage :
  • Avec la déclaration : Les données persistent et sont réutilisées.
  • Sans la déclaration : Un nouveau volume anonyme est créé à chaque démarrage, et les données précédentes sont perdues (sauf si Docker réutilise un volume anonyme existant, mais ce n’est pas garanti).

Exemple concret :

Si vous avez ceci :

services:
 app:
 volumes:
 - nodeModule:/var/www/node_modules

# Sans cette partie :
# volumes:
# nodeModule:
  • Au premier docker-compose up, Docker créera un volume anonyme pour nodeModule.
  • Si vous supprimez le conteneur et relancez, un nouveau volume anonyme sera créé, et vos node_modules précédents seront perdus.

Conclusion :

La section volumes: racine est nécessaire si vous voulez : - Des volumes persistants et réutilisables. - Pouvoir gérer ces volumes via docker volume ls / docker volume inspect. - Éviter la duplication de données ou les pertes entre les redémarrages.

Vous pouvez aussi utiliser des montages bind (chemins absolus) si vous n’avez pas besoin de volumes Docker managés :

services:
 app:
 volumes:
 - ./node_modules:/var/www/node_modules # Montage bind (dossier local)

Mais cela peut causer des problèmes de performances/permissions dans certains cas.