# Comprendre et gérer des volumes de conteneurs Docker

[Docker](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-docker/ "Qu’est-ce que Docker&nbsp;?") est un logiciel open source de création et de gestion de conteneurs. Avec un volume Docker, vous pouvez partager des données entre vos conteneurs ou sauvegarder les données d’un conteneur Docker de façon permanente.

## Conditions

- Vous avez [installé Docker](https://www.ionos.fr/digitalguide/serveur/configuration/tutoriel-docker-installation-et-premiers-pas/) et le logiciel fonctionne correctement.
- Vous connaissez les fonctionnalités et les [commandes de base de Docker](https://www.ionos.fr/digitalguide/serveur/know-how/commandes-docker/).

## Le système de fichiers Docker

Pour comprendre les volumes Docker, il est essentiel de savoir comment fonctionne le système de fichiers Docker.

Une image Docker est constituée de plusieurs couches, chacune d’elles en lecture seule. Pour toute image lancée depuis un conteneur, Docker ajoute une nouvelle couche inscriptible au système. Dans Docker, ce service est connu sous le nom d’« **Union File System** ».

Chaque fois qu’un fichier est modifié, Docker crée une copie de celui-ci à partir des couches en lecture seule, qu’il ajoute à la couche inscriptible supérieure. Le fichier original (en lecture seule) n’est donc pas modifié.

En supprimant un conteneur, vous perdrez également sa couche inscriptible supérieure. Cela signifie que toute modification effectuée après le lancement du conteneur est alors supprimée.

## Résoudre les problèmes grâce aux volumes Docker

Un volume de conteneur vous permet de conserver vos données, même en cas de suppression d’un conteneur Docker. Il s’agit également d’une solution pratique pour l’échange de données entre l’hôte et le conteneur.

Nous vous conseillons d’opter pour un volume de conteneur Docker pour effectuer les opérations suivantes :

- transférer des données vers un conteneur Docker ;
- enregistrer des données depuis un conteneur Docker ;
- partager des données entre vos conteneurs Docker.

Les volumes Docker n’appartiennent pas à l’« Union File System » (avec son accès en lecture seule et sa couche inscriptible). Un volume consiste plutôt en un dossier que se partagent le conteneur et l’ordinateur hôte. Plusieurs conteneurs peuvent également se partager un même volume.

---

### Conseil

Sur le [serveur Cloud IONOS](https://www.ionos.fr/cloud/serveurs-cloud "Cloud Apps : Pré-installé sur le Serveur Cloud IONOS"), vous pouvez choisir Docker en tant qu’application Cloud préinstallée. Vous pouvez ainsi accéder partout à vos applications.

---

## Volumes Docker : les bases

Un volume de conteneur est hébergé par l’ordinateur hôte, en dehors du véritable conteneur. Pour le conteneur, le volume joue le même rôle qu’un dossier ; vous pouvez donc y stocker ou en extraire des données. Ce service est assuré à l’aide d’un « **point de montage** » sur l’un des répertoires de l’hôte.

Vous pouvez créer et gérer des volumes Docker de différentes manières. Chacune d’elles comporte des avantages et des inconvénients.

## Utilisation de la commande « volume create » de Docker

Depuis la version 1.9.0, disponible depuis le 3 novembre 2015, il est facile de créer et de gérer des volumes Docker grâce à la commande intégrée ***docker volume***.

### Étape 1 : créer le volume et lui donner un nom

La commande ***docker volume create*** a pour effet de créer un volume qu’il vous revient de nommer. Cette action permet de trouver facilement les volumes Docker pour les attribuer aux conteneurs correspondants.

Pour créer un volume, utilisez la commande suivante :

```none
sudo docker volume create - - name [volume name]
```

### Étape 2 : utiliser un volume dans un conteneur Docker

Pour lancer un conteneur utilisant un volume créé par vos soins avec ***docker volume create***, ajoutez l’« argument » suivant à la commande ***docker run*** :

```none
-v [volume name]:[container directory]
```

Si vous souhaitez par exemple exécuter un conteneur de l’image **CentOS** portant le nom ***my-volume-test*** et attribuer le **volume de données** au répertoire */****data*** de votre conteneur, vous devez utiliser la commande suivante :

```none
sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash
```

### Étape 3 : établir une liste des volumes

Utilisez la commande suivante pour lister tous les volumes Docker sur votre système :

```none
sudo docker volume ls
```

Celle-ci renvoie la liste de tous les volumes Docker déjà créés sur l’hôte.

### Étape 4 : inspecter un volume

Pour inspecter un volume portant un nom, utilisez la commande suivante :

```none
sudo docker volume inspect [volume name]
```

Cette commande vous fournit des informations sur le volume, notamment sur son point de montage et le répertoire du système hôte permettant d’accéder au volume Docker.

Pour obtenir plus d’informations sur le volume ***data*** créé ci-dessus, il convient par exemple d’utiliser la commande suivante :

```none
sudo docker volume inspect data-volume
```

### Étape 5 : supprimer un volume

Pour supprimer un volume (créé en suivant ces étapes), utilisez la commande suivante :

```none
sudo docker volume rm [volume name]
```

Il est impossible de supprimer un volume utilisé par un conteneur existant. **Avant de supprimer celui-ci**, vous devez arrêter et supprimer le conteneur Docker en utilisant les commandes suivantes :

```none
sudo docker stop [container name or ID]
sudo docker rm [container name or ID]
```

Par exemple, pour supprimer le volume ***data***, il faut commencer par arrêter et supprimer le conteneur qui l’utilise avec la commande ***my-volume-test*** :

```none
sudo docker stop my-volume-test
sudo docker rm my-volume-test
```

Utilisez ensuite la commande suivante pour **supprimer** le **volume de données** :

```none
sudo docker volume rm data-volume
```

## Créer un volume Docker et spécifier un répertoire de l’hôte

Pour définir un répertoire spécifique de l’ordinateur hôte comme un volume Docker sur le conteneur, ajoutez l’« argument » suivant à la commande *docker run* :

```none
-v [host directory]:[container directory]
```

Pour lancer un nouveau conteneur et faire correspondre le dossier */webfiles* de l’hôte avec le dossier */var/www/html* du conteneur, il convient par exemple d’utiliser la commande suivante :

```none
sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash
```

En guise de test, créez un répertoire qui vous servira de volume Docker. Utilisez pour ce faire la commande suivante :

```none
sudo mkdir /hostvolume
```

Ajoutez un petit fichier de test à ce répertoire en utilisant la commande suivante :

```none
sudo echo "Hello World" >> /hostvolume/host-hello.txt
```

Lancez ensuite un conteneur *my-directory-test* et attribuez */hostvolume* à l’hôte */containervolume* du conteneur en utilisant la commande suivante :

```none
sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash
```

Une fois dans l’invite de commande du nouveau conteneur, utilisez la commande suivante afin d’établir une liste des fichiers du volume partagé :

```none
ls /containervolume
```

Le fichier ***host-hello.txt***, créé sur l’hôte, est visible.

Cette action fonctionne également dans le sens inverse. Les fichiers placés dans ce répertoire s’affichent sur l’hôte. En guise de test, vous pouvez ajouter un autre fichier au volume partagé à partir du conteneur, en utilisant la commande suivante :

```none
echo "Hello from the container." >> /containervolume/container-hello.txt
```

Utilisez les raccourcis **\[Ctrl\] + \[P\]** et **\[Ctrl\] + \[Q\]** pour quitter le conteneur et revenir à l’invite de l’ordinateur hôte. Utilisez la commande suivante pour établir une liste des fichiers du volume partagé :

```none
sudo ls /hostvolume
```

Les **deux fichiers de test** créés à partir de l’hôte et du conteneur sont visibles.

## Créer un volume Docker avec un fichier Docker

Dans un fichier Docker, utilisez la commande suivante afin de créer **un volume de stockage partagé** dans le conteneur :

```none
VOLUME [volume path]
```

Pour créer un volume ***/myvolume*** dans le conteneur (qui sera lancé à partir du fichier Docker), il convient par exemple d’utiliser la commande suivante :

```none
VOLUME /myvolume
```

En guise de test, créez d’abord un fichier ***Dockerfile*** en utilisant la commande suivante :

```none
sudo nano Dockerfile
```

Insérez ensuite le contenu suivant dans votre fichier :

```none
# The source image to start with
FROM centos
# Create a volume
VOLUME /dockerfilevolume
```

Enregistrez le fichier, puis fermez-le.

Utilisez ensuite la commande qui suit afin de créer une image ***dockerfile-volumetest*** à partir de ce fichier Docker :

```none
sudo docker build -t dockerfile-volumetest
```

Lancez ensuite un conteneur ***my-dockerfile-test*** à partir de cette image, en utilisant la commande suivante :

```none
sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash
```

Une fois dans l’invite de commande du nouveau conteneur, utilisez la commande suivante pour créer un petit fichier de test dans le volume partagé :

```none
echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt
```

Utilisez les raccourcis **\[Ctrl\] + \[P\]** et **\[Ctrl\] + \[Q\]** pour quitter le conteneur et revenir à l’invite de l’ordinateur hôte.

Vous devez ensuite chercher le **point de montage**. Pour ce faire, vous pouvez utiliser la commande suivante :

```none
sudo docker inspect my-dockerfile-test
```

Faites défiler les résultats jusqu’à la section « **Mounts** », qui ressemble à peu près à celle-ci :

[![Image: Point de montage du fichier Docker dans le terminal](https://www.ionos.fr/digitalguide/fileadmin/_processed_/b/2/csm_find-the-mount-point_55e9808df2.webp "Point de montage du fichier Docker dans le terminal")](https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/find-the-mount-point.jpg) Sous l’entrée « Mounts » du terminal, il est facile de consulter les fichiers créés sur votre conteneur Docker ; il vous suffit de regarder sous le point « Source ».       ***Source*** correspond au répertoire de l’ordinateur hôte.

***Destination*** correspond au dossier du conteneur.

Vérifiez le répertoire source sur votre ordinateur hôte. La commande à utiliser pour cet exemple est la suivante :

```none
sudo ls /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test
```

Vous trouverez alors le fichier ***dockerfile-container-hello.txt*** créé sur le conteneur.

## Aperçu des avantages et inconvénients des différentes méthodes

<table>
  <tbody>
    <tr>
      <td><strong>Méthode</strong></td>
      <td><strong>Avantage</strong></td>
      <td><strong>Inconvénient</strong></td>
    </tr>
    <tr>
      <td>Commande « volume create »</td>
      <td>Rapidité et simplicité d’utilisation</td>
      <td>Volume créé automatiquement sur l’hôte et difficile à trouver</td>
    </tr>
    <tr>
      <td>Création d’un volume Docker avec un répertoire sur l’hôte</td>
      <td>Possibilité d’attribution du conteneur à un dossier donné de l’hôte</td>
      <td>Impossibilité de renommer le volume et de procéder à une automatisation avec [Dockerfile](https://www.ionos.fr/digitalguide/serveur/know-how/dockerfile/)</td>
    </tr>
    <tr>
      <td>Création avec un fichier Docker</td>
      <td>Automatisation du processus</td>
      <td>Pas d’attribution à un dossier hôte et impossibilité de renommer le volume</td>
    </tr>
  </tbody>
</table>

## Partage de volumes Docker entre plusieurs conteneurs

Dans de nombreuses situations, il peut s’avérer utile de partager un volume Docker entre plusieurs conteneurs, et il existe différentes façons d’y parvenir.

### Partager un volume sur l’hôte

Un volume créé sur l’ordinateur hôte peut être utilisé simultanément par plusieurs conteneurs. Vous pouvez ainsi procéder à un échange de données entre les conteneurs et l’hôte.

Pour cet exemple, il convient de créer un répertoire sur l’hôte et de l’utiliser en tant que volume partagé entre deux conteneurs.

**Créez d’abord un répertoire** à utiliser en tant que volume Docker à l’aide de la commande suivante :

```none
sudo mkdir /webdata
```

Créez un petit **fichier de test** dans ce répertoire en utilisant la commande suivante :

```none
sudo echo "Hello from the host." >> /webdata/host-hello.txt
```

Lancez ensuite un **conteneur** ***sql-database*** à partir de l’image PostgreSQL officielle et associez ***/webdata*** à votre hôte en utilisant la commande ***/data*** sur le conteneur :

```none
sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash
```

Une fois dans l’invite de commande du nouveau conteneur, vérifiez la bonne configuration du volume partagé en utilisant la commande suivante :

```none
ls /data
```

Le fichier ***host-hello.txt***, créé sur l’hôte, est visible. Pour ajouter un fichier au volume partagé, utilisez la commande suivante :

```none
echo "Hello from the sql-database container." >> /data/sql-hello.txt
```

Utilisez les raccourcis **\[Ctrl\] + \[P\]** et **\[Ctrl\] + \[Q\]** pour quitter le conteneur et revenir à l’invite de l’ordinateur hôte.

À présent, lancez un conteneur « **Webapp »** à partir de l’image PHP+Apache officielle et associez ***/webdata*** à l’hôte ***/var/www/html*** sur le conteneur.

```none
sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash
```

Une fois dans l’invite de commande du nouveau conteneur, vérifiez la bonne configuration du volume partagé en utilisant la commande suivante :

```none
ls /var/www/html
```

Le fichier ***host-hello.txt*** créé sur l’hôte et le fichier *sql-hello.txt* créé sur le **conteneur de la base de données SQL** sont tous les deux visibles.

Ajoutez maintenant un fichier issu du dernier conteneur créé :

```none
echo "Hello from the webapp container." >> /var/www/html/webapp-hello.txt
```

Utilisez les raccourcis **\[Ctrl\] + \[P\]** et **\[Ctrl\] + \[Q\]** pour quitter le conteneur et revenir à l’invite de l’ordinateur hôte. Vous pouvez afficher les trois fichiers sur l’hôte en utilisant la commande suivante :

```none
sudo ls /webdata
```

Étant donné que les deux conteneurs se partagent désormais un répertoire hébergé par l’hôte, vous pouvez **déplacer vos données entre ces trois sites de façon instantanée** ; il vous suffit en effet de les transférer vers ce répertoire.

### Configurer un conteneur en tant que volume de données partagé

Vous pouvez également configurer un conteneur distinct en tant que volume de données partagé.

Pour ce faire, commencez par créer un conteneur de données. Puis, lors de la création du conteneur destiné à utiliser ce conteneur de données, ajoutez l’« argument » suivant à votre commande ***docker run*** :

```none
--volumes-from [name or ID of data container]
```

---

### Note

Pour cette solution, peu importe que le conteneur cible soit ou non en cours d’exécution. Les volumes Docker ne sont jamais supprimés ; ils sont même conservés après l’arrêt du conteneur.

---

Pour cet exemple, créez un conteneur de données « Data-Storage » (qui servira de volume de données). Deux conteneurs supplémentaires doivent être créés et partager le conteneur de données en tant que volume de stockage.

Lancez d’abord le **conteneur** « **Data-Storage** » à partir de l’image CentOS 7 officielle :

```none
sudo docker run -it -v /shared-data --name data-storage centos /bin/bash
```

Ajoutez ensuite un petit fichier au dossier ***/shared-data*** :

```none
echo "Hello from the data-storage container." >> /shared-data/data-storage-hello.txt
```

Utilisez les raccourcis **\[Ctrl\] + \[P\]** et **\[Ctrl\] + \[Q\]** pour quitter le conteneur et revenir à l’invite de l’ordinateur hôte.

Lancez à présent le **conteneur** **d’application** à partir de l’image Python officielle et définissez le **conteneur** **de stockage de données** en tant que volume :

```none
sudo docker run -it --name app --volumes-from data-storage python /bin/bash
```

Établissez une liste des fichiers du volume partagé en utilisant la commande suivante :

```none
ls /shared-data
```

Vous pouvez voir que le dossier ***/shared-data*** a été défini sur le conteneur de stockage de données à partir du dossier ***/shared-data*** et qu’il renferme le fichier ***data-storage-hello.txt***.

À présent, ajoutez un fichier depuis le conteneur d’application :

```none
echo "Hello from the app container." >> /shared-data/app-hello.txt
```

Utilisez les raccourcis **\[Ctrl\] + \[P\]** et **\[Ctrl\] + \[Q\]** pour quitter le conteneur et revenir à l’invite de l’ordinateur hôte.

Pour finir, lancez le **conteneur** **Web** à partir de l’image Apache officielle et définissez le **conteneur** **de stockage de données** en tant que volume :

```none
sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash
```

Établissez une liste des fichiers du volume partagé en utilisant la commande suivante :

```none
ls /shared-data
```

Les fichiers créés sont désormais visibles sur les **conteneurs de stockage** et **d’application**.

## Définir la lecture seule pour un volume

Jusque-là, nous avons créé ou défini des volumes accessibles en lecture comme en écriture.

Si vous souhaitez qu’un conteneur soit **uniquement accessible en lecture seule** sur un volume, il vous suffit d’ajouter ***:ro*** (pour « read-only ») au volume de conteneur spécifié par l’instruction ***-v*** :

```none
docker run -v /directory:/path:ro
```

Cette solution peut s’avérer utile, notamment en termes de sécurité. En outre, si vous souhaitez protéger les données d’un volume spécifique contre les suppressions ou écrasements accidentels dus à un autre conteneur Docker, nous vous conseillons d’envisager l’accès en lecture seule.

Vous pouvez par exemple créer sur l’hôte un volume ***limited-access*** en utilisant la commande suivante :

```none
sudo docker volume create --name limited-access
```

Exécutez ensuite un conteneur ***allowed-to-write*** de l’image **CentOS** et définissez le volume « **Limited-Access »** comme un volume « normal » (accessible en lecture comme en écriture) :

```none
sudo docker run -it --name allowed-to-write -v limited-access:/data centos /bin/bash
```

Une fois dans l’invite de commande de ce conteneur, créez un **fichier de test** en utilisant la commande suivante :

```none
echo "Hello from the container that is allowed to write." >> /data/hello.txt
```

Utilisez les raccourcis **\[Ctrl\] + \[P\]** et **\[Ctrl\] + \[Q\]** pour quitter le conteneur et revenir à l’invite de l’ordinateur hôte.

Exécutez ensuite un conteneur ***not-allowed-to-write*** de l’**image CentOS** et associez celui-ci au **volume « Limited-Access »** en tant que **volume en lecture seule** :

```none
sudo docker run -it --name not-allowed-to-write -v limited-access:/data:ro centos /bin/bash
```

Avez-vous déjà essayé de créer un fichier de test sur le volume partagé avec une commande semblable à celle qui suit ?

```none
echo "Hello from the container that is not allowed to write." >> /data/no-access.txt
```

Celle-ci vous renvoie une erreur expliquant que ce conteneur ne dispose d’aucun accès en écriture pour ce répertoire.

```none
bash: /data/no-access.txt: Read-only file system
```


This is a markdown version of: [https://www.ionos.fr/digitalguide/serveur/know-how/volumes-de-conteneurs-docker/](https://www.ionos.fr/digitalguide/serveur/know-how/volumes-de-conteneurs-docker/) for AI/LLM consumption.