Docker est un logiciel open source de création et de gestion de con­te­neurs. Avec un volume Docker, vous pouvez partager des données entre vos con­te­neurs ou sau­ve­gar­der les données d’un conteneur Docker de façon per­ma­nente.

Con­di­tions

Le système de fichiers Docker

Pour com­prendre les volumes Docker, il est essentiel de savoir comment fonc­tionne le système de fichiers Docker.

Une image Docker est cons­ti­tuée de plusieurs couches, chacune d’elles en lecture seule. Pour toute image lancée depuis un conteneur, Docker ajoute une nouvelle couche ins­crip­tible 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 ins­crip­tible su­pé­rieure. Le fichier original (en lecture seule) n’est donc pas modifié.

En sup­pri­mant un conteneur, vous perdrez également sa couche ins­crip­tible su­pé­rieure. Cela signifie que toute mo­di­fi­ca­tion effectuée après le lancement du conteneur est alors supprimée.

Compute Engine
La solution IaaS idéale pour gérer vos charges de travail
  • vCPU aux coûts avan­ta­geux et cœurs dédiés per­for­mants
  • Sans en­ga­ge­ment pour plus de flexi­bi­lité
  • As­sis­tance par des experts 24h/24 et 7j/7 incluse

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 sup­pres­sion 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 con­seil­lons d’opter pour un volume de conteneur Docker pour effectuer les opé­ra­tions suivantes :

  • trans­fé­rer des données vers un conteneur Docker ;
  • en­re­gis­trer des données depuis un conteneur Docker ;
  • partager des données entre vos con­te­neurs Docker.

Les volumes Docker n’ap­par­tien­nent pas à l’« Union File System » (avec son accès en lecture seule et sa couche ins­crip­tible). Un volume consiste plutôt en un dossier que se partagent le conteneur et l’or­di­na­teur hôte. Plusieurs con­te­neurs peuvent également se partager un même volume.

Conseil

Sur le serveur Cloud IONOS, vous pouvez choisir Docker en tant qu’ap­pli­ca­tion Cloud préins­tal­lée. Vous pouvez ainsi accéder partout à vos ap­pli­ca­tions.

Volumes Docker : les bases

Un volume de conteneur est hébergé par l’or­di­na­teur 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é­per­toires de l’hôte.

Vous pouvez créer et gérer des volumes Docker de dif­fé­rentes manières. Chacune d’elles comporte des avantages et des in­con­vé­nients.

Uti­li­sa­tion de la commande « volume create » de Docker

Depuis la version 1.9.0, dis­po­nible 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 fa­ci­le­ment les volumes Docker pour les attribuer aux con­te­neurs cor­res­pon­dants.

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

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 :

-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é­per­toire /data de votre conteneur, vous devez utiliser la commande suivante :

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 :

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 :

sudo docker volume inspect [volume name]

Cette commande vous fournit des in­for­ma­tions sur le volume, notamment sur son point de montage et le ré­per­toire du système hôte per­met­tant d’accéder au volume Docker.

Pour obtenir plus d’in­for­ma­tions sur le volume data créé ci-dessus, il convient par exemple d’utiliser la commande suivante :

sudo docker volume inspect data-volume

Étape 5 : supprimer un volume

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

sudo docker volume rm [volume name]

Il est im­pos­sible 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 :

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 :

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

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

sudo docker volume rm data-volume

Créer un volume Docker et spécifier un ré­per­toire de l’hôte

Pour définir un ré­per­toire spé­ci­fique de l’or­di­na­teur hôte comme un volume Docker sur le conteneur, ajoutez l’« argument » suivant à la commande docker run :

-v [host directory]:[container directory]

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

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

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

sudo mkdir /hostvolume

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

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

Lancez ensuite un conteneur my-directory-test et attribuez /host­vo­lume à l’hôte /con­tai­ner­vo­lume du conteneur en utilisant la commande suivante :

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

ls /containervolume

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

Cette action fonc­tionne également dans le sens inverse. Les fichiers placés dans ce ré­per­toire 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 :

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

Utilisez les rac­cour­cis [Ctrl] + [P] et [Ctrl] + [Q] pour quitter le conteneur et revenir à l’invite de l’or­di­na­teur hôte. Utilisez la commande suivante pour établir une liste des fichiers du volume partagé :

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 :

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 :

VOLUME /myvolume

En guise de test, créez d’abord un fichier Do­cker­file en utilisant la commande suivante :

sudo nano Dockerfile

Insérez ensuite le contenu suivant dans votre fichier :

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

En­re­gis­trez le fichier, puis fermez-le.

Utilisez ensuite la commande qui suit afin de créer une image do­cker­file-vo­lu­me­test à partir de ce fichier Docker :

sudo docker build -t dockerfile-volumetest

Lancez ensuite un conteneur my-do­cker­file-test à partir de cette image, en utilisant la commande suivante :

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

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

Utilisez les rac­cour­cis [Ctrl] + [P] et [Ctrl] + [Q] pour quitter le conteneur et revenir à l’invite de l’or­di­na­teur hôte.

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

sudo docker inspect my-dockerfile-test

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

Source cor­res­pond au ré­per­toire de l’or­di­na­teur hôte.

Des­ti­na­tion cor­res­pond au dossier du conteneur.

Vérifiez le ré­per­toire source sur votre or­di­na­teur hôte. La commande à utiliser pour cet exemple est la suivante :

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

Vous trouverez alors le fichier do­cker­file-container-hello.txt créé sur le conteneur.

Aperçu des avantages et in­con­vé­nients des dif­fé­rentes méthodes

Méthode Avantage In­con­vé­nient
Commande « volume create » Rapidité et sim­pli­cité d’uti­li­sa­tion Volume créé au­to­ma­ti­que­ment sur l’hôte et difficile à trouver
Création d’un volume Docker avec un ré­per­toire sur l’hôte Pos­si­bi­lité d’at­tri­bu­tion du conteneur à un dossier donné de l’hôte Im­pos­si­bi­lité de renommer le volume et de procéder à une au­to­ma­ti­sa­tion avec Do­cker­file
Création avec un fichier Docker Au­to­ma­ti­sa­tion du processus Pas d’at­tri­bu­tion à un dossier hôte et im­pos­si­bi­lité de renommer le volume

Partage de volumes Docker entre plusieurs con­te­neurs

Dans de nom­breuses si­tua­tions, il peut s’avérer utile de partager un volume Docker entre plusieurs con­te­neurs, et il existe dif­fé­rentes façons d’y parvenir.

Partager un volume sur l’hôte

Un volume créé sur l’or­di­na­teur hôte peut être utilisé si­mul­ta­né­ment par plusieurs con­te­neurs. Vous pouvez ainsi procéder à un échange de données entre les con­te­neurs et l’hôte.

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

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

sudo mkdir /webdata

Créez un petit fichier de test dans ce ré­per­toire en utilisant la commande suivante :

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

Lancez ensuite un conteneur sql-database à partir de l’image Post­greSQL of­fi­cielle et associez /webdata à votre hôte en utilisant la commande /data sur le conteneur :

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 con­fi­gu­ra­tion du volume partagé en utilisant la commande suivante :

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 :

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

Utilisez les rac­cour­cis [Ctrl] + [P] et [Ctrl] + [Q] pour quitter le conteneur et revenir à l’invite de l’or­di­na­teur hôte.

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

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 con­fi­gu­ra­tion du volume partagé en utilisant la commande suivante :

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 main­te­nant un fichier issu du dernier conteneur créé :

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

Utilisez les rac­cour­cis [Ctrl] + [P] et [Ctrl] + [Q] pour quitter le conteneur et revenir à l’invite de l’or­di­na­teur hôte. Vous pouvez afficher les trois fichiers sur l’hôte en utilisant la commande suivante :

sudo ls /webdata

Étant donné que les deux con­te­neurs se partagent désormais un ré­per­toire hébergé par l’hôte, vous pouvez déplacer vos données entre ces trois sites de façon ins­tan­ta­née ; il vous suffit en effet de les trans­fé­rer vers ce ré­per­toire.

Con­fi­gu­rer un conteneur en tant que volume de données partagé

Vous pouvez également con­fi­gu­rer 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 :

--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 con­te­neurs sup­plé­men­taires 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 of­fi­cielle :

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

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

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

Utilisez les rac­cour­cis [Ctrl] + [P] et [Ctrl] + [Q] pour quitter le conteneur et revenir à l’invite de l’or­di­na­teur hôte.

Lancez à présent le conteneur d’ap­pli­ca­tion à partir de l’image Python of­fi­cielle et dé­fi­nis­sez le conteneur de stockage de données en tant que volume :

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

Éta­blis­sez une liste des fichiers du volume partagé en utilisant la commande suivante :

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’ap­pli­ca­tion :

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

Utilisez les rac­cour­cis [Ctrl] + [P] et [Ctrl] + [Q] pour quitter le conteneur et revenir à l’invite de l’or­di­na­teur hôte.

Pour finir, lancez le conteneur Web à partir de l’image Apache of­fi­cielle et dé­fi­nis­sez le conteneur de stockage de données en tant que volume :

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

Éta­blis­sez une liste des fichiers du volume partagé en utilisant la commande suivante :

ls /shared-data

Les fichiers créés sont désormais visibles sur les con­te­neurs de stockage et d’ap­pli­ca­tion.

Serveurs dédiés
Per­for­mance et in­no­va­tion
  • Pro­ces­seurs dernière gé­né­ra­tion
  • Hardware dédié haute per­for­mance
  • Data centers certifiés ISO

Définir la lecture seule pour un volume

Jusque-là, nous avons créé ou défini des volumes ac­ces­sibles en lecture comme en écriture.

Si vous souhaitez qu’un conteneur soit uni­que­ment ac­ces­sible en lecture seule sur un volume, il vous suffit d’ajouter :ro (pour « read-only ») au volume de conteneur spécifié par l’ins­truc­tion -v :

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é­ci­fique contre les sup­pres­sions ou écra­se­ments ac­ci­den­tels dus à un autre conteneur Docker, nous vous con­seil­lons 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 : 

sudo docker volume create --name limited-access

Exécutez ensuite un conteneur allowed-to-write de l’image CentOS et dé­fi­nis­sez le volume « Limited-Access » comme un volume « normal » (ac­ces­sible en lecture comme en écriture) :

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 :

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

Utilisez les rac­cour­cis [Ctrl] + [P] et [Ctrl] + [Q] pour quitter le conteneur et revenir à l’invite de l’or­di­na­teur 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 :

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 ?

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

Celle-ci vous renvoie une erreur ex­pli­quant que ce conteneur ne dispose d’aucun accès en écriture pour ce ré­per­toire.

bash: /data/no-access.txt: Read-only file system
Aller au menu principal