Docker: volumes et dépendances croisées
De par mon expérience Docker, les volumes sont très pratiques en mode «montage».
Mais quand on tente de les utiliser en mode «volume Docker» classique, ça pose rapidement des soucis.
- Les volumes sont associés à un container tant qu'il existe. Quand le container est supprimé, ses volumes en sont dissociés.
- docker volume ls ou docker volume inspect ne permettent pas de retrouver à quel container le volume était associé.
- Docker peut ainsi créer une multitude de volumes qui occupent de l'espace disque dont l'origine et la raison d'être n'est pas évidente à retrouver.
Les volumes présentent alors beaucoup d'inconvénients, pour un intérêt difficile à trouver:
Si mon volume n'est associé à mon container que le temps que vit mon container, à quoi cela sert-il ?
Je vais vous présenter ici un cas de figure qui m'a révélé l'utilité des volumes.
Schéma d'une application LAMP
Linux, Apache, MySQL, PHP
- Linux, il est partout: sur le système hôte, dans les containers… c'est l'OS de base, qui va exécuter nos applicatifs. Business as usual pour Docker, pas de soucis à se faire.
- MySQL, considérons qu'il est déjà installé et opérationnel sur un serveur ou un container.
- J'ai un conteneur PHP-FPM, capable d'exécuter du PHP.
- J'ai un conteneur Apache, capable de servir du HTML et de forwarder du PHP à PHP-FPM.
- J'ai mon application: des fichiers html et javascript, des images png, du code php.
Le schéma fonctionnel ressemble donc à ça:

- Le client (Firefox), interroge Apache (port 80).
- Apache a besoin des données statiques (Data), et de PHP interprêté.
- PHP a besoin des fichiers PHP (Data), et de données stockées en base (MySQL)
Implémentation
Voici le docker-compose:
data:
restart: "no"
image: "myapp_data"
volumes:
- "/var/www/html"
httpd:
restart: "always"
image: "apache:2.4"
ports:
- "8006:80"
volumes_from:
- "data"
environment:
- "PHP_SERVER=php-fpm:9000"
links:
- "php-fpm"
php-fpm:
restart: "always"
image: "php5-fpm"
volumes_from:
- "data"
et le Dockerfile data:
FROM scratch
ADD my_app /var/www/html
VOLUME /var/www/html
Plutôt que de créer le conteneur "data", j'aurais pu:
- poser les données sur le host, et les monter en volume dans le container
- dériver un container à partir de php5-fpm, et y ajouter les données (impossible à partir de apache pour raisons de dépendances croisées)
Mais la solution choisie a pour avantages de:
- Donner une meilleure visibilité sur les composants utilisés.
- Faciliter la mise à jour des composants: apache et php peuvent être mis à jour (patches de sécurité) sans rebuilder toutes les applications.
- Être compatible Swarm si on y rajoute les affinités.
Le peaufinage
Il manque à cet exemple, entre autres:
- des affinités swarm
- les infos de connexion à la base de données
…cet exercice est laissé au plaisir du lecteur
2 commentaires
Commentaire de: afix Visiteur

Commentaire de: afix Visiteur

Un lien intéressant en complément : https://docs.docker.com/compose/compose-file/#volumes la syntaxe a une peu changé avec Compose file version 3.
Merci rvé ! ;)