Comprendre et gérer des volumes de conteneurs Docker

Docker 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

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.

IONOS Cloud Compute Engine

Les moyennes et grandes entreprises choisissent le Cloud Made in Germany. IaaS et PaaS du champion caché aux champions cachés.

Sûr
Fiable
Flexible

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

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

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

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

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

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 :

sudo mkdir /hostvolume

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

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 :

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

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

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 Dockerfile 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

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 :

sudo docker build -t dockerfile-volumetest

Lancez ensuite un conteneur my-dockerfile-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 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 :

sudo docker inspect my-dockerfile-test

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

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 :

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

Méthode

Avantage

Inconvénient

Commande « volume create »

Rapidité et simplicité d’utilisation

Volume créé automatiquement sur l’hôte et difficile à trouver

Création d’un volume Docker avec un répertoire sur l’hôte

Possibilité d’attribution du conteneur à un dossier donné de l’hôte

Impossibilité de renommer le volume et de procéder à une automatisation avec Dockerfile

Création avec un fichier Docker

Automatisation du processus

Pas d’attribution à un dossier hôte et impossibilité de renommer le volume

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 :

sudo mkdir /webdata

Créez un petit fichier de test dans ce répertoire 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 PostgreSQL officielle 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 configuration 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 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.

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 :

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

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 :

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 :

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

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

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 :

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 :

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 :

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 :

ls /shared-data

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

Serveurs dédiés avec IONOS

Au croisement du hardware et du Cloud : des serveurs dédiés avec intégration Cloud et facturation à la minute + conseiller personnel ! 

Assistance 24/7
Trafic illimité
Certificat SSL

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 :

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 : 

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

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

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 expliquant que ce conteneur ne dispose d’aucun accès en écriture pour ce répertoire.

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