GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Comment partager des données entre des conteneurs Docker sur Ubuntu 22.04

Introduction

Docker est un outil de conteneurisation populaire utilisé pour fournir aux applications logicielles un système de fichiers contenant tout ce dont elles ont besoin pour fonctionner. L'utilisation de conteneurs Docker garantit que le logiciel se comportera de la même manière, quel que soit l'endroit où il est déployé, car son environnement d'exécution est cohérent.

En général, les conteneurs Docker sont éphémères et s'exécutent aussi longtemps qu'il faut pour que la commande émise dans le conteneur se termine. Parfois, cependant, les applications doivent partager l'accès aux données ou conserver les données après la suppression d'un conteneur. Les bases de données, le contenu généré par l'utilisateur pour un site Web et les fichiers journaux ne sont que quelques exemples de données peu pratiques ou impossibles à inclure dans une image Docker, mais auxquelles les applications doivent accéder. Un accès permanent aux données est fourni avec Docker Volumes.

Les volumes Docker peuvent être créés et attachés dans la même commande qui crée un conteneur, ou ils peuvent être créés indépendamment de tout conteneur et attachés ultérieurement. Dans cet article, vous découvrirez quatre façons différentes de partager des données entre conteneurs.

Prérequis

Pour suivre cet article, vous aurez besoin d'un serveur Ubuntu 22.04 avec les éléments suivants :

  • Un utilisateur non root avec des privilèges sudo. Le guide Configuration initiale du serveur avec Ubuntu 22.04 explique comment le configurer.
  • Docker installé avec les instructions de l'étape 1 et Étape 2 de Comment installer et utiliser Docker sur Ubuntu 22.04

Remarque : Même si les prérequis donnent des instructions pour installer Docker sur Ubuntu 22.04, le docker Les commandes pour les volumes de données Docker dans cet article devraient fonctionner sur d'autres systèmes d'exploitation tant que Docker est installé et que l'utilisateur sudo a été ajouté au docker groupe.

Étape 1 — Création d'un volume indépendant

Introduit dans la version 1.9 de Docker, le docker volume create La commande vous permet de créer un volume sans le lier à un conteneur particulier. Vous utiliserez cette commande pour ajouter un volume nommé DataVolume1 :

  1. docker volume create --name DataVolume1

Le nom s'affiche, indiquant que la commande a réussi :

OutputDataVolume1

Pour utiliser le volume, vous allez créer un nouveau conteneur à partir de l'image Ubuntu, en utilisant le --rm drapeau pour le supprimer automatiquement lorsque vous quittez. Vous utiliserez également -v pour monter le nouveau volume. -v nécessite le nom du volume, deux-points, puis le chemin absolu vers l'endroit où le volume doit apparaître à l'intérieur du conteneur. Si les répertoires du chemin n'existent pas dans le cadre de l'image, ils seront créés lors de l'exécution de la commande. S'ils font existent, le volume monté masquera le contenu existant :

  1. docker run -ti --rm -v DataVolume1:/datavolume1 ubuntu

Dans le conteneur, écrivez des données sur le volume :

  1. echo "Example1" > /datavolume1/Example1.txt

Parce que vous avez utilisé le --rm flag, votre conteneur sera automatiquement supprimé lorsque vous quitterez. Votre volume, cependant, sera toujours accessible.

  1. exit

Vous pouvez vérifier que le volume est présent sur votre système avec docker volume inspect :

  1. docker volume inspect DataVolume1
Output[
    {
        "CreatedAt": "2018-07-11T16:57:54Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/DataVolume1/_data",
        "Name": "DataVolume1",
        "Options": {},
        "Scope": "local"
    }
]

Remarque : Vous pouvez même consulter les données sur l'hôte au chemin répertorié comme Mountpoint . Vous devez toutefois éviter de le modifier, car cela peut entraîner une corruption des données si les applications ou les conteneurs ne sont pas conscients des modifications.

Ensuite, démarrez un nouveau conteneur et attachez DataVolume1 :

  1. docker run --rm -ti -v DataVolume1:/datavolume1 ubuntu

Vérifiez le contenu :

  1. cat /datavolume1/Example1.txt
OutputExample1

Quittez le conteneur :

  1. exit

Dans cet exemple, vous avez créé un volume, l'avez attaché à un conteneur et vérifié sa persistance.

Étape 2 - Création d'un volume qui persiste lorsque le conteneur est supprimé

Dans l'exemple suivant, vous allez créer un volume en même temps que le conteneur, supprimer le conteneur, puis attacher le volume à un nouveau conteneur.

Vous utiliserez le docker run commande pour créer un nouveau conteneur en utilisant l'image Ubuntu de base. -t nous donnera un terminal, et -i nous permettra d'interagir avec lui. Pour plus de clarté, vous utiliserez --name pour identifier le conteneur.

Le -v flag nous permettra de créer un nouveau volume, que vous appellerez DataVolume2 . Vous utiliserez deux points pour séparer ce nom du chemin où le volume doit être monté dans le conteneur. Enfin, vous spécifierez l'image de base Ubuntu et vous fierez à la commande par défaut dans le fichier Docker de l'image de base Ubuntu, bash , pour nous faire tomber dans une coquille :

  1. docker run -ti --name=Container2 -v DataVolume2:/datavolume2 ubuntu

Remarque : Le -v le drapeau est très flexible. Il peut lier ou nommer un volume avec juste un léger ajustement de la syntaxe. Si le premier argument commence par un / ou ~/ vous créez un bindmount. Supprimez cela et vous nommez le volume. Par exemple :

  • -v /path:/path/in/container monte le répertoire hôte, /path au /path/in/container
  • -v path:/path/in/container crée un volume nommé path sans relation avec l'hôte.

Pour en savoir plus sur le montage lié d'un répertoire à partir de l'hôte, consultez Comment partager des données entre un conteneur Docker et l'hôte

Dans le conteneur, vous écrivez des données sur le volume :

  1. echo "Example2" > /datavolume2/Example2.txt
  2. cat /datavolume2/Example2.txt
OutputExample2

Quittez le conteneur :

  1. exit

Lorsque vous redémarrez le conteneur, le volume se monte automatiquement :

  1. docker start -ai Container2

Vérifiez que le volume est bien monté et que vos données sont toujours en place :

  1. cat /datavolume2/Example2.txt
OutputExample2

Enfin, quittez et nettoyez :

  1. exit

Docker ne nous laissera pas supprimer un volume s'il est référencé par un conteneur. Pour voir ce qui se passe, essayez :

  1. docker volume rm DataVolume2

Le message nous indique que le volume est toujours utilisé et fournit la version longue de l'ID du conteneur :

OutputError response from daemon: unable to remove volume: remove DataVolume2: volume is in use - [d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63]

Vous pouvez utiliser l'ID dans le message d'erreur ci-dessus pour supprimer le conteneur :

  1. docker rm d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63
Outputd0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63

Le retrait du conteneur n'affectera pas le volume. Vous pouvez voir qu'il est toujours présent sur le système en listant les volumes avec docker volume ls :

  1. docker volume ls
OutputDRIVER              VOLUME NAME
local               DataVolume2

Et vous pouvez utiliser docker volume rm pour le supprimer :

  1. docker volume rm DataVolume2

Dans cet exemple, vous avez créé un volume de données vide en même temps que vous avez créé un conteneur. Dans votre prochain exemple, vous explorerez ce qui se passe lorsque vous créez un volume avec un répertoire de conteneur qui contient déjà des données.

Étape 3 - Création d'un volume à partir d'un répertoire existant avec des données

Généralement, créer un volume indépendamment avec docker volume create et en créer un tout en créant un conteneur sont équivalents, à une exception près. Si vous créez un volume en même temps que vous créez un conteneur et vous fournissez le chemin d'accès à un répertoire contenant des données dans l'image de base, ces données seront copiées dans le volume.

Par exemple, vous allez créer un conteneur et ajouter le volume de données à /var , un répertoire qui contient des données dans l'image de base :

  1. docker run -ti --rm -v DataVolume3:/var ubuntu

Tout le contenu du /var de l'image de base répertoire est copié dans le volume et vous pouvez monter ce volume dans un nouveau conteneur.

Quittez le conteneur actuel :

  1. exit

Cette fois, plutôt que de s'appuyer sur le bash par défaut de l'image de base commande, vous émettez votre propre ls commande, qui affichera le contenu du volume sans entrer dans le shell :

  1. docker run --rm -v DataVolume3:/datavolume3 ubuntu ls datavolume3

Le répertoire datavolume3 a maintenant une copie du contenu du /var de l'image de base répertoire :

Outputbackups
cache
lib
local
lock
log
mail
opt
run
spool
tmp

Il est peu probable que vous vouliez monter /var/ de cette façon, mais cela peut être utile si vous avez créé votre propre image et que vous souhaitez un moyen simple de conserver les données. Dans votre prochain exemple, vous montrerez comment un volume peut être partagé entre plusieurs conteneurs.

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

Jusqu'à présent, vous avez attaché un volume à un conteneur à la fois. Souvent, vous voudrez que plusieurs conteneurs soient attachés au même volume de données. C'est relativement simple à accomplir, mais il y a une mise en garde critique :pour le moment, Docker ne gère pas le verrouillage des fichiers. Si vous avez besoin de plusieurs conteneurs écrivant sur le volume, les applications exécutées dans ces conteneurs doivent être conçu pour écrire dans des magasins de données partagés afin d'empêcher la corruption des données.

Créer Container4 et DataVolume4

Utiliser docker run pour créer un nouveau conteneur nommé Container4 avec un volume de données attaché :

  1. docker run -ti --name=Container4 -v DataVolume4:/datavolume4 ubuntu

Ensuite, vous allez créer un fichier et ajouter du texte :

  1. echo "This file is shared between containers" > /datavolume4/Example4.txt

Ensuite, vous quitterez le conteneur :

  1. exit

Cela nous ramène à l'invite de commande de l'hôte, où vous allez créer un nouveau conteneur qui monte le volume de données à partir de Container4 .

Créer Container5 et monter des volumes à partir de Container4

Vous allez créer Container5 , et montez les volumes depuis Container4 :

  1. docker run -ti --name=Container5 --volumes-from Container4 ubuntu

Vérifiez la persistance des données :

  1. cat /datavolume4/Example4.txt
OutputThis file is shared between containers

Maintenant, ajoutez du texte de Container5 :

  1. echo "Both containers can write to DataVolume4" >> /datavolume4/Example4.txt

Enfin, vous quitterez le conteneur :

  1. exit

Ensuite, vous vérifierez que vos données sont toujours présentes dans Container4 .

Afficher les modifications apportées dans Container5

Maintenant, vérifiez les modifications qui ont été écrites dans le volume de données par Container5 en redémarrant Container4 :

  1. docker start -ai Container4

Vérifiez les modifications :

  1. cat /datavolume4/Example4.txt
OutputThis file is shared between containers
Both containers can write to DataVolume4

Maintenant que vous avez vérifié que les deux conteneurs pouvaient lire et écrire à partir du volume de données, vous allez quitter le conteneur :

  1. exit

Encore une fois, Docker ne gère aucun verrouillage de fichier, donc les applications doivent compte pour le fichier de verrouillage eux-mêmes. Il est possible de monter un volume Docker en lecture seule pour s'assurer que la corruption des données ne se produira pas par accident lorsqu'un conteneur nécessite un accès en lecture seule en ajoutant :ro . Vous allez maintenant voir comment cela fonctionne.

Démarrer le conteneur 6 et monter le volume en lecture seule

Une fois qu'un volume a été monté dans un conteneur, plutôt que de le démonter comme vous le feriez avec un système de fichiers Linux typique, vous pouvez à la place créer un nouveau conteneur monté comme vous le souhaitez et, si nécessaire, supprimer le conteneur précédent. Pour rendre le volume en lecture seule, vous ajoutez :ro à la fin du nom du conteneur :

  1. docker run -ti --name=Container6 --volumes-from Container4:ro ubuntu

Vous vérifierez le statut en lecture seule en essayant de supprimer votre exemple de fichier :

  1. rm /datavolume4/Example4.txt
Outputrm: cannot remove '/datavolume4/Example4.txt': Read-only file system

Enfin, vous quitterez le conteneur et nettoyerez vos conteneurs et volumes de test :

  1. exit

Maintenant que vous avez terminé, nettoyez vos conteneurs et votre volume :

  1. docker rm Container4 Container5 Container6
  2. docker volume rm DataVolume4

Dans cet exemple, vous avez montré comment partager des données entre deux conteneurs à l'aide d'un volume de données et comment monter un volume de données en lecture seule.

Conclusion

Dans ce didacticiel, vous avez créé un volume de données qui permettait aux données de persister grâce à la suppression d'un conteneur. Vous avez partagé des volumes de données entre conteneurs, avec la mise en garde que les applications devront être conçues pour gérer le verrouillage des fichiers afin d'éviter la corruption des données. Enfin, vous avez montré comment monter un volume partagé en mode lecture seule. Si vous souhaitez en savoir plus sur le partage de données entre les conteneurs et le système hôte, consultez Comment partager des données entre le conteneur Docker et l'hôte.


Docker
  1. Comment installer Docker sur Ubuntu 18.04 / Ubuntu 18.10 / Ubuntu 19.04

  2. Comment utiliser Docker Compose

  3. Comment connecter des conteneurs Docker

  4. Comment répertorier les conteneurs Docker

  5. Comment installer Docker et exécuter des conteneurs Docker dans Ubuntu

Comment installer Docker sur Ubuntu 14.04

Comment installer Docker Compose sur Ubuntu

Comment exécuter des conteneurs Docker

Comment supprimer les conteneurs Docker

Comment arrêter les conteneurs Docker

Comment partager un fichier entre Ubuntu et Windows 10 ?