virli/tutorial/docker-basis/volumes.md

132 lines
4.2 KiB
Markdown
Raw Normal View History

2015-10-22 03:25:20 +00:00
\newpage
2017-10-04 23:42:56 +00:00
Stockage de données applicatives
================================
2015-10-22 03:25:20 +00:00
2022-09-15 09:07:41 +00:00
Il est généralement toujours possible d'écrire dans le système de fichier de
notre conteneur. (Cela n'affecte pas l'image, chaque conteneur est démarré à
partir de l'image originale.) Cependant, il n'est pas recommandé de chercher à
stocker des données ainsi. En effet, il n'est pas aisé de récupérer ces données
une fois l'exécution du conteneur terminée; les données peuvent même être
détruite si on a lancé le conteneur avec l'option `--rm`.
2015-10-22 03:25:20 +00:00
2022-09-15 09:07:41 +00:00
Docker met donc à notre disposition plusieurs mécanismes pour que les données
de nos applications persistent et soient prêtes à être migrées d'un conteneur à
l'autre.
2015-10-22 03:25:20 +00:00
2016-09-08 01:44:20 +00:00
## Partage avec la machine hôte
2015-10-22 03:25:20 +00:00
2022-09-15 09:07:41 +00:00
Il est possible de partager un répertoire de la machine hôte avec un
2015-10-22 03:25:20 +00:00
conteneur. L'intérêt reste plutôt limité à des fins de facilité ou de test, par
2022-09-15 09:07:41 +00:00
exemple si vous voulez partager des fichiers en passant par le protocole HTTP,
mais sans se casser la tête à installer et configurer un serveur web, vous
pourriez utiliser:
2015-10-22 03:25:20 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
2022-02-24 19:43:43 +00:00
docker run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d nginx
2015-10-22 03:25:20 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2015-10-22 03:25:20 +00:00
2022-09-15 09:07:41 +00:00
Une fois le conteneur lancé, vous pourrez accéder à votre dossier *Downloads*
en renseignant l'IP de votre machine dans un navigateur!
::::: {.warning}
2015-10-22 03:25:20 +00:00
2020-09-21 21:48:16 +00:00
Par défaut, `nginx` ne va pas permettre de lister le contenu du répertoire (et
va afficher une page 404, car il cherche un fichier `index.html` dans votre
répertoire). Vous pouvez par contre accéder à un fichier directement, par
2022-02-24 19:43:43 +00:00
exemple: <http://10.42.12.23/dQw4w9WgXcQ.mp4>
2020-09-21 21:48:16 +00:00
2022-09-15 09:07:41 +00:00
:::::
2015-10-22 03:25:20 +00:00
2017-10-04 23:42:56 +00:00
## Les volumes
2015-10-22 03:25:20 +00:00
2017-10-04 23:42:56 +00:00
Les volumes sont des espaces créés via Docker (il s'agit d'objets Docker). Ils
permettent de partager facilement des données entre conteneurs, sans avoir à se
soucier de leur réel emplacement.
2015-10-22 03:25:20 +00:00
2017-10-04 23:42:56 +00:00
Comme il s'agit d'un objet, la première chose à faire va être de créer notre
2022-02-24 19:43:43 +00:00
volume:
2015-10-22 03:25:20 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
docker volume create prod_youp0m
docker volume create prod_foodp0m
2017-10-04 23:42:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2015-10-22 03:25:20 +00:00
2022-02-24 19:43:43 +00:00
Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple:
2015-10-22 03:25:20 +00:00
2018-10-04 03:48:11 +00:00
<div lang="en-US">
```bash
2022-05-04 09:18:16 +00:00
docker container run --mount source=prod_youp0m,target=/images \
nemunaire/youp0m
2018-10-04 03:48:11 +00:00
```
</div>
2022-02-24 19:43:43 +00:00
On pourra également faire de même avec un conteneur MySQL:
2018-10-04 03:48:11 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
2022-05-04 09:18:16 +00:00
docker container run --name mydb -e MYSQL_ROOT_PASSWORD=my-secret-pw \
2022-09-13 21:19:59 +00:00
--mount source=prod_db,target=/var/lib/mysql mysql
2015-10-22 03:25:20 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2015-10-22 03:25:20 +00:00
2022-09-15 09:07:41 +00:00
::::: {.question}
Lorsque le volume est vide, si des données sont présentes dans l'image à
l'endroit du point de montage, celles-ci sont recopiées dans le volume.
2015-10-22 03:25:20 +00:00
2022-09-15 09:07:41 +00:00
:::::
2015-10-22 03:25:20 +00:00
2017-10-04 23:42:56 +00:00
## Volumes temporaires
2015-10-22 03:25:20 +00:00
2017-10-04 23:42:56 +00:00
Lorsque vous n'avez pas besoin de stocker les données et que vous ne désirez
pas qu'elles persistent (des données sensibles par exemple) ou si cela peut
améliorer les performances de votre conteneur, il est possible de créer des
points de montages utilisant le système de fichiers `tmpfs` et donc résidant
2022-09-13 21:19:59 +00:00
exclusivement en RAM:
2015-10-22 03:25:20 +00:00
2018-10-04 03:48:11 +00:00
<div lang="en-US">
```bash
2020-09-21 21:48:16 +00:00
docker container run --mount type=tmpfs,target=/images nemunaire/youp0m
2018-10-04 03:48:11 +00:00
```
</div>
2015-10-22 03:25:20 +00:00
2018-10-04 03:48:11 +00:00
En cas de crash de la machine, le contenu sera perdu, mais il reste
possible d'utiliser `--volume-from` afin de partager le volume avec un
autre conteneur.
2019-10-16 01:54:56 +00:00
## Partage de volumes entre conteneurs
Les volumes sont des espaces détachés des conteneurs, particulièrement utiles
pour mettre à jour ou relancer un conteneur, sans perdre les données. Un autre
2021-09-19 22:19:49 +00:00
intérêt est de pouvoir partager des fichiers entre plusieurs conteneurs.
2019-10-16 01:54:56 +00:00
Il est ainsi parfaitement possible de lancer deux conteneurs qui partagent le
2022-02-24 19:43:43 +00:00
même volume:
2019-10-16 01:54:56 +00:00
<div lang="en-US">
```bash
2022-02-24 19:43:43 +00:00
docker container run -d --mount source=prod_youp0m,target=/images \
-p 8080:8080 nemunaire/youp0m
docker container run -d --mount source=prod_youp0m,target=/images \
-p 8081:8080 nemunaire/youp0m
2019-10-16 01:54:56 +00:00
```
</div>
2021-09-19 22:19:49 +00:00
Dans cet exemple, l'ajout d'une image dans un conteneur l'ajoutera également
2019-10-16 01:54:56 +00:00
dans le second.
Un exemple plus intéressant serait sur une architecture de micro-services
2022-02-24 19:43:43 +00:00
traitant des fichiers de grande taille: plutôt que de faire passer les
2019-10-16 01:54:56 +00:00
fichiers par un système de message/socket, on peut partager un volume pour
épargner les coûts de transferts inutiles, lorsqu'ils ne changent pas de
machine.