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
- Vous avez installé Docker et le logiciel fonctionne correctement.
- Vous connaissez les fonctionnalités et les commandes de base de 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.
- vCPU aux coûts avantageux et cœurs dédiés performants
- Sans engagement pour plus de flexibilité
- Assistance 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 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.
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]
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.
Profitez de votre propre serveur, avec hardware dédié, intégration Cloud, facturation à la minute et processeur Intel® Xeon® ou AMD.
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