Retour au blog

Partage de données entre conteneurs Docker

Partage de données entre conteneurs Docker

Introduction

Docker est une plateforme de conteneurs qui constitue un environnement standardisé, léger, virtualisé, portable et défini par logiciel, permettant au logiciel de s'exécuter de manière isolée par rapport aux autres logiciels s'exécutant sur la machine hôte physique. Docker est un composant déterminant de l'aspect Développement et Intégration Continus du développement logiciel. En fournissant un environnement d'exécution cohérent, Docker garantit que le logiciel se comporte de la même manière, quelle que soit la machine hôte physique sur laquelle il est déployé. Pour un aperçu complet de l'écosystème Docker, consultez cet article.

Bien que les conteneurs Docker soient autonomes, ils ont parfois besoin de partager l'accès aux données ou de conserver les données sur le disque après l'arrêt du conteneur. Les données peuvent se présenter sous la forme de bases de données, de fichiers journaux ou de données générées par l'utilisateur. Il est impossible d'inclure de telles données dans un fichier de configuration d'image Docker, mais elles doivent être disponibles pour que votre application fonctionne comme prévu. Le partage et la persistance des données dans les conteneurs Docker sont gérés par les volumes Docker. Les volumes Docker peuvent être créés lors de la création du conteneur ou créés ultérieurement et attachés aux conteneurs. Dans ce tutoriel, nous aborderons les quatre différentes manières de partager des données entre conteneurs.

Prérequis

Veuillez noter que, bien que nous travaillions avec Ubuntu 20.04, les instructions et les commandes pour Docker fonctionneront sur tout autre système d'exploitation sur lequel Docker est installé et où l'utilisateur sudo a été ajouté au groupe docker, comme expliqué dans les prérequis ci-dessus.

Étape 1 : Créer des volumes Docker indépendants

Nous allons commencer par créer des volumes indépendants qui ne sont liés à aucun conteneur Docker. Pour ce faire, nous disposons de la commande docker volume create qui a été introduite dans la version 1.9 de Docker. Entrez la commande suivante pour créer un volume nommé Step1DataVolume :

Vous devriez voir la sortie suivante indiquant que la création du volume a réussi :

Docker Volume Create

Maintenant que nous avons un volume indépendant, nous pouvons créer un nouveau conteneur à partir de l'image officielle Ubuntu à titre d'exemple pour l'utiliser. Entrez la commande suivante pour créer le conteneur et attacher le volume :

Dans cette commande, le drapeau --rm supprimera automatiquement le conteneur après la sortie. Le drapeau -v est utilisé pour spécifier et monter le volume. Le drapeau -v prend le nom du volume, deux points, et le chemin absolu à l'intérieur du conteneur où le volume doit apparaître. Gardez à l'esprit que lors de l'exécution de la commande, si les répertoires spécifiés dans le chemin n'existent pas, ils seront créés. S'ils existent déjà, le volume monté masquera le contenu existant. Pour le drapeau -ti , le -t donne accès au terminal, et le -i nous permet d'interagir avec le conteneur via le terminal.

Une fois à l'intérieur du conteneur, exécutez la commande suivante pour écrire des données dans le volume :

Tapez exit et appuyez sur Entrée pour quitter le conteneur. Comme expliqué, le conteneur est automatiquement supprimé lorsque vous quittez, grâce au drapeau --rm, cependant, le volume restera accessible.

Pour vérifier que le volume existe toujours, vous pouvez utiliser la commande docker volume inspect :

Vous devriez voir la sortie suivante :

Docker Volume Inspect

Ensuite, créons un nouveau conteneur. Tout d'abord, attachez le volume et voyez si nous pouvons accéder au texte que nous avons créé dans le conteneur précédent. Entrez la commande suivante pour créer et exécuter le conteneur en utilisant le ubuntu image :

À l'intérieur du conteneur, exécutez la commande suivante pour vérifier que le StepOne.txt fichier existe :

Vous devriez voir une sortie similaire :

Docker Volume Content 1

Ensuite, saisissez exit et appuyez sur entrée pour quitter le conteneur. Dans cette étape, vous avez appris à gérer la persistance des données à l'aide de volumes Docker indépendants et à attacher des volumes aux conteneurs.

Étape 2 : Créer un volume Docker qui persiste les données lorsque vous supprimez un conteneur

Dans cette étape, nous utiliserons une seule commande pour créer un volume en même temps que nous créons un conteneur. Nous supprimerons ensuite le conteneur et attacherons le volume à un nouveau conteneur. La commande est similaire à celle utilisée à l'Étape 1, cependant, nous ajoutons une option --name, pour spécifier un nom pour le conteneur :

Une fois à l'intérieur du conteneur, entrez la commande suivante pour écrire des données dans le volume et vérifier que les données s'y trouvent :

Voici la sortie des trois commandes :

Persistent Docker Volume

Ensuite, quittez le conteneur. Lorsque vous redémarrerez le conteneur à l'aide de la commande suivante, le volume s'attachera automatiquement :

À l'intérieur du conteneur, vérifiez que le volume est monté en vérifiant l'existence du StepTwo.txt fichier à l'aide de la commande :

Voici la sortie :

Docker Volume After Restart

Vous pouvez quitter le conteneur maintenant. Docker empêche la suppression d'un volume référencé par un autre conteneur. Vous pouvez essayer de supprimer le volume à l'aide de la commande :

Vous devriez voir le message d'erreur dans la sortie :

Error Response

Supprimons le conteneur en utilisant l'ID de conteneur affiché dans la sortie avec la commande docker rm :

Remplacez l' ID du conteneur par l' ID de votre conteneur affiché dans votre terminal. La commande supprime le conteneur, mais elle ne supprime pas le volume que nous avons créé. Vous pouvez lister les volumes disponibles à l'aide de la commande docker volume ls pour vérifier :

Voici la sortie :

Docker Volume List

Pour supprimer le conteneur créé à l'Étape 2, entrez la commande suivante :

Dans cette étape, vous avez pu créer un volume Docker en même temps que vous créiez un conteneur. Voyons comment nous pouvons créer un volume à partir d'un répertoire existant contenant des données.

Étape 3 : Créer un volume Docker à partir d'un répertoire existant contenant des données

Si vous souhaitez copier des données dans un volume, vous pouvez créer un volume lors de la création d'un conteneur et fournir le chemin d'accès à un répertoire contenant les données dans l'image de base. Dans la commande ci-dessous, nous créons un conteneur et ajoutons un volume de données au niveau de /var, qui est un répertoire contenant des données dans l'image de base :

Lorsque la commande s'exécute, le contenu du répertoire /var de l'image de base sera copié dans le volume. Le volume peut être attaché à un nouveau conteneur. Ensuite, quittez le conteneur :

Create Docker Volume

Entrez la commande suivante pour créer le conteneur, attacher le volume et lister le contenu du volume à l'aide de la commande ls :

Vous devriez voir une sortie similaire de la commande, qui est une copie du contenu du répertoire /var de l'image de base désormais disponible dans le Step3DataVolume:

Copy Docker Volume

Bien que le montage du /var répertoire comme nous l'avons fait dans cet exemple puisse être peu pratique, cela nous aide à comprendre que vous pouvez monter n'importe quel répertoire créé dans vos images personnalisées sur un volume Docker pour rendre les données disponibles pour d'autres conteneurs.

Étape 4 : Partage de données entre plusieurs conteneurs Docker

Dans la plupart des cas, vous souhaiterez que plusieurs conteneurs accèdent aux données d'un seul volume Docker. Dans les exemples précédents, nous n'avons attaché un volume qu'à un seul conteneur. Maintenant, vous allez apprendre à attacher un volume à plusieurs conteneurs. Bien que vous puissiez y parvenir facilement, Docker ne gère pas le verrouillage des fichiers. Pour que plusieurs conteneurs écrivent sur le même volume, vous devez concevoir individuellement les applications exécutées dans ces conteneurs pour gérer l'écriture dans des magasins de données partagés afin d'éviter la corruption des données.

  • Créez Step4Container1 et Step4DataVolume

Utilisez la commande docker run avec l'option --name pour créer un conteneur nommé :

À l'intérieur du conteneur, exécutez la commande suivante pour créer un fichier texte et ajouter du texte :

Après cela, quittez le conteneur et revenez à l'environnement hôte. Maintenant, nous voulons créer un autre conteneur et monter les volumes de Step4Container1 sur celui-ci.

  • Créez Step4Container2 et attachez les volumes du conteneur Step4Container1

Exécutez la commande suivante pour créer Step4Container2 et monter les volumes de Step4Container1:

À l'intérieur du conteneur, utilisez la commande cat pour vérifier la persistance des données :

Vous devriez voir la sortie suivante :

Container Data Sharing

Nous pouvons ajouter du texte supplémentaire au fichier depuis Step4Container2 en saisissant la commande suivante :

Quittez le conteneur après cela et nous retournerons à Step4Container1 pour vérifier si les données sont toujours présentes.

  • Vérifier les modifications apportées au volume Docker entre différents conteneurs

Pour afficher les modifications, vous devez d'abord redémarrer le Step4Container1 en utilisant la commande :

Vérifiez les modifications à l'aide de la commande :

Vous devriez voir une sortie similaire à la capture d'écran ci-dessous :

Copied Container Data

Une fois que vous avez vérifié que les deux conteneurs peuvent lire et écrire des données sur le même volume, vous pouvez maintenant quitter le conteneur. Comme mentionné, Docker ne gère pas le verrouillage des fichiers, c'est le rôle de la logique applicative exécutée à l'intérieur des conteneurs de gérer l'accès en lecture-écriture aux magasins de données partagés. Docker permet de monter des volumes en lecture seule pour éviter la corruption accidentelle des données par des conteneurs qui ne nécessitent qu'un accès en lecture seule en ajoutant :ro comme indiqué dans l'exemple suivant.

  • Monter un volume sur un conteneur Docker en lecture seule

Pour cet exemple, nous allons créer un conteneur nommé Step4Container3. Dans la commande de création, nous montons les volumes de Step4Container1 et ajoutons :ro pour spécifier que ce conteneur a un accès en lecture seule mais ne peut pas écrire sur le volume. Exécutez la commande suivante dans votre terminal :

Une fois à l'intérieur du conteneur, vous pouvez lire le fichier texte dans le volume en saisissant la commande suivante :

Read Only Mount

Cependant, si vous essayez de supprimer le fichier à l'aide de la commande :

Vous obtiendrez un message d'erreur dans votre terminal comme :

Read Only Error

Une fois que vous avez vérifié les permissions de lecture-écriture, vous pouvez quitter le conteneur. Si vous souhaitez nettoyer les conteneurs et le volume créés dans ce tutoriel, exécutez les commandes suivantes :

Dans cette étape, vous avez appris à partager des données entre plusieurs conteneurs à l'aide de volumes Docker ainsi qu'à monter des volumes de données sur des conteneurs en lecture seule.

Conclusion

Dans ce tutoriel, vous avez créé des volumes Docker et appris à partager des données entre des conteneurs Docker. En abordant le partage de données entre conteneurs, nous avons noté que la logique applicative individuelle à l'intérieur du conteneur doit gérer le verrouillage des fichiers pour éviter la corruption des données lors de l'écriture dans des stockages de données partagés, car Docker ne dispose d'aucune implémentation pour gérer le verrouillage des fichiers.

Pour plus de ressources sur l'utilisation de Docker, vous pouvez consulter d'autres tutoriels sur notre blog :

Bonne informatique !

author

Pranay Kapgate

Auteur · CloudSigma

Preslav Dobrev est un designer créatif chez CloudSigma, axé sur une identité commerciale cohérente à travers des canaux marketing traditionnels et innovants. Il excelle à fusionner la vision artistique avec le marketing stratégique pour créer des récits de marque percutants.

Commentaires

Aucun commentaire pour l'instant. Soyez le premier.