Rendre vos données persistantesPersist your data

Si vous n’avez pas remarqué, la liste TODO est nettoyée chaque fois que vous lancez le conteneur.In case you didn't notice, the todo list is being wiped clean every single time you launch the container. Pourquoi ?Why is this? Penchons-nous sur la façon dont le conteneur fonctionne.Let's dive into how the container is working.

Système de fichiers du conteneurThe container's filesystem

Lorsqu’un conteneur s’exécute, il utilise les différentes couches d’une image pour son système de fichiers.When a container runs, it uses the various layers from an image for its filesystem. Chaque conteneur obtient également son propre « espace de travail » pour créer, mettre à jour ou supprimer des fichiers.Each container also gets its own "scratch space" to create, update, or remove files. Les modifications ne seront pas visibles dans un autre conteneur, même s' ils utilisent la même image.Any changes won't be seen in another container, even if they are using the same image.

Voir cela dans la pratiqueSee this in practice

Pour voir cela en action, vous allez démarrer deux conteneurs et créer un fichier dans chacun d’eux.To see this in action, you're going to start two containers and create a file in each. Ce que vous verrez, c’est que les fichiers créés dans un conteneur ne sont pas disponibles dans un autre.What you'll see is that the files created in one container aren't available in another.

  1. Démarrez un ubuntu conteneur qui créera un fichier nommé /data.txt avec un nombre aléatoire compris entre 1 et 10000.Start a ubuntu container that will create a file named /data.txt with a random number between 1 and 10000.

    docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
    

    Si vous êtes curieux de connaître la commande, vous démarrez un interpréteur de commandes bash et appelez deux commandes (pourquoi il a le && ).In case you're curious about the command, you're starting a bash shell and invoking two commands (why it has the &&). La première partie sélectionne un nombre aléatoire unique et l’écrit dans /data.txt .The first portion picks a single random number and writes it to /data.txt. La deuxième commande surveille simplement un fichier pour que le conteneur reste en cours d’exécution.The second command is simply watching a file to keep the container running.

  2. Valider vous pouvez voir la sortie à l’aide exec de pour accéder au conteneur.Validate you can see the output by using exec to get into the container. Pour ce faire, ouvrez l’extension de VS Code et cliquez sur l’option attacher l’interpréteur de commandes.To do so, open the VS Code extension and on click on the Attach Shell option. Cela permet exec d’ouvrir un interpréteur de commandes dans le conteneur au sein du terminal vs code.This will use exec to open a shell in the container within the VS Code terminal.

    VS Code ouvrir l’interface CLI dans le conteneur Ubuntu

    Vous verrez un terminal qui exécute un shell dans le conteneur Ubuntu.You will see a terminal that is running a shell in the Ubuntu container. Exécutez la commande suivante pour afficher le contenu du /data.txt fichier.Run the following command to see the content of the /data.txt file. Fermez ce terminal ultérieurement.Close this terminal afterwards again.

    cat /data.txt
    

    Si vous préférez la ligne de commande, vous pouvez utiliser la docker exec commande pour faire de même.If you prefer the command line, you can use the docker exec command to do the same. Vous devez récupérer l’ID du conteneur (utilisez docker ps pour l’extraire) et récupérer le contenu à l’aide de la commande suivante.You need to get the container's ID (use docker ps to get it) and get the content with the following command.

    docker exec <container-id> cat /data.txt
    

    Vous devez voir un nombre aléatoire !You should see a random number!

  3. À présent, démarrez un autre ubuntu conteneur (la même image) et vous verrez que vous n’avez pas le même fichier.Now, start another ubuntu container (the same image) and you'll see you don't have the same file.

    docker run -it ubuntu ls /
    

    Et regardez !And look! Il n’y a aucun data.txt fichier là !There's no data.txt file there! C’est parce qu’il a été écrit dans l’espace de travail uniquement pour le premier conteneur.That's because it was written to the scratch space for only the first container.

  4. Continuez et supprimez le premier conteneur à l’aide de la docker rm -f commande.Go ahead and remove the first container using the docker rm -f command.

Volumes de conteneurContainer volumes

Avec l’expérience précédente, vous avez vu que chaque conteneur démarre à partir de la définition d’image chaque fois qu’il démarre.With the previous experiment, you saw that each container starts from the image definition each time it starts. Alors que les conteneurs peuvent créer, mettre à jour et supprimer des fichiers, ces modifications sont perdues lorsque le conteneur est supprimé et que toutes les modifications sont isolées dans ce conteneur.While containers can create, update, and delete files, those changes are lost when the container is removed and all changes are isolated to that container. Avec les volumes, vous pouvez modifier tout cela.With volumes, you can change all of this.

Les volumes permettent de reconnecter des chemins de système de fichiers spécifiques du conteneur à l’ordinateur hôte.Volumes provide the ability to connect specific filesystem paths of the container back to the host machine. Si un répertoire du conteneur est monté, les modifications apportées à ce répertoire sont également visibles sur l’ordinateur hôte.If a directory in the container is mounted, changes in that directory are also seen on the host machine. Si vous montez ce même répertoire à travers les redémarrages de conteneur, vous verrez les mêmes fichiers.If you mount that same directory across container restarts, you'd see the same files.

Il existe deux principaux types de volumes.There are two main types of volumes. vous pouvez utiliser les deux à la fois, mais vous commencerez par des volumes nommés.you will eventually use both, but you will start with named volumes.

Conserver vos données TODOPersist your Todo data

Par défaut, l’application todo stocke ses données dans une base de données SQLite à l’adresse /etc/todos/todo.db .By default, the todo app stores its data in a SQLite Database at /etc/todos/todo.db. Si vous n’êtes pas familiarisé avec SQLite, pas de soucis !If you're not familiar with SQLite, no worries! Il s’agit simplement d’une base de données relationnelle dans laquelle toutes les données sont stockées dans un seul fichier.It's simply a relational database in which all of the data is stored in a single file. Bien qu’il ne s’agit pas de la meilleure solution pour les applications à grande échelle, cela fonctionne pour les petites démonstrations.While this isn't the best for large-scale applications, it works for small demos. Nous allons nous pencher sur l’activation ultérieure du moteur de base de données.We'll talk about switching this to an actual database engine later.

Si la base de données est un fichier unique, si vous pouvez conserver ce fichier sur l’ordinateur hôte et le rendre accessible au conteneur suivant, il doit pouvoir reprendre là où le dernier s’est arrêté.With the database being a single file, if you can persist that file on the host and make it available to the next container, it should be able to pick up where the last one left off. En créant un volume et en attachant (souvent appelé « montage ») à l’annuaire dans lequel les données sont stockées, vous pouvez conserver les données.By creating a volume and attaching (often called "mounting") it to the directory the data is stored in, you can persist the data. À mesure que le conteneur écrit dans le todo.db fichier, il est conservé sur l’hôte du volume.As the container writes to the todo.db file, it's persisted to the host in the volume.

Comme nous l’avons vu, vous allez utiliser un volume nommé.As mentioned, you're going to use a named volume. Imaginez un volume nommé comme un simple compartiment de données.Think of a named volume as simply a bucket of data. L’arrimeur conserve l’emplacement physique sur le disque et il vous suffit de mémoriser le nom du volume.Docker maintains the physical location on the disk and you only need to remember the name of the volume. Chaque fois que vous utilisez le volume, l’arrimeur s’assure que les données correctes sont fournies.Every time you use the volume, Docker will make sure the correct data is provided.

  1. Créez un volume à l’aide de la docker volume create commande.Create a volume by using the docker volume create command.

    docker volume create todo-db
    
  2. Arrêtez le conteneur d’application todo une fois de plus dans la vue d’ancrage (ou avec docker rm -f <id> ), car il est toujours en cours d’exécution sans utiliser le volume persistant.Stop the todo app container once again in the Docker view (or with docker rm -f <id>), as it is still running without using the persistent volume.

  3. Démarrez le conteneur d’application TODO, mais ajoutez l' -v indicateur pour spécifier un montage de volume.Start the todo app container, but add the -v flag to specify a volume mount. vous allez utiliser le volume nommé et le monter sur /etc/todos , ce qui capture tous les fichiers créés dans le chemin d’accès.you will use the named volume and mount it to /etc/todos, which will capture all files created at the path.

    docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
    
  4. Une fois le conteneur démarré, ouvrez l’application et ajoutez quelques éléments à votre liste TODO.Once the container starts up, open the app and add a few items to your todo list.

    Éléments ajoutés à la liste de tâches

  5. Supprimez le conteneur de l’application todo.Remove the container for the todo app. Utilisez la vue d’ancrage ou docker ps pour obtenir l’ID, puis docker rm -f <id> pour le supprimer.Use the Docker view or docker ps to get the ID and then docker rm -f <id> to remove it.

  6. Démarrez un nouveau conteneur à l’aide de la même commande que ci-dessus.Start a new container using the same command from above.

  7. Ouvrez l’application.Open the app. Vos éléments doivent toujours apparaître dans votre liste.You should see your items still in your list!

  8. Continuez et supprimez le conteneur lorsque vous avez terminé l’extraction de votre liste.Go ahead and remove the container when you're done checking out your list.

Hourra!Hooray! Vous savez maintenant comment conserver les données !You've now learned how to persist data!

Conseil

Bien que les volumes nommés et les montages de liaison (dont nous allons parler dans une minute) soient les deux principaux types de volumes pris en charge par l’installation par défaut du moteur d’ancrage, de nombreux plug-ins de pilote de volume sont disponibles pour prendre en charge NFS, SFTP, NetApp et bien plus encore.While named volumes and bind mounts (which we'll talk about in a minute) are the two main types of volumes supported by a default Docker engine installation, there are many volume driver plugins available to support NFS, SFTP, NetApp, and more! Cela est particulièrement important lorsque vous commencez à exécuter des conteneurs sur plusieurs hôtes dans un environnement en cluster avec essaim, Kubernetes, etc.This will be especially important once you start running containers on multiple hosts in a clustered environment with Swarm, Kubernetes, and so on.

Plongez dans votre volumeDive into your volume

Beaucoup de gens demandent souvent « où est-ce que l’arrimeur stocke mes données lorsque j’utilise un volume nommé ? »A lot of people frequently ask "Where is Docker actually storing my data when I use a named volume?" Si vous souhaitez en savoir plus, vous pouvez utiliser la docker volume inspect commande.If you want to know, you can use the docker volume inspect command.

docker volume inspect todo-db
[
    {
        "CreatedAt": "2019-09-26T02:18:36Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

MountpointEst l’emplacement réel sur le disque où sont stockées les données.The Mountpoint is the actual location on the disk where the data is stored. Notez que sur la plupart des ordinateurs, vous devez disposer d’un accès racine pour accéder à ce répertoire à partir de l’hôte.Note that on most machines, you'll need to have root access to access this directory from the host. C’est là que c’est là !But, that's where it is!

Notes

Accès aux données de volume directement sur le Bureau de l’ordinateur d’amarrage En cours d’exécution dans le Bureau de l’Ancreur, les commandes de l’arrimeur s’exécutent en réalité dans une petite machine virtuelle sur votre ordinateur.Accessing Volume data directly on Docker Desktop While running in Docker Desktop, the Docker commands are actually running inside a small VM on your machine. Si vous souhaitez examiner le contenu réel du répertoire de montage , vous devez d’abord obtenir l’intérieur de la machine virtuelle.If you wanted to look at the actual contents of the Mountpoint directory, you would need to first get inside of the VM. Dans WSL 2, il se trouve à l’intérieur d’un WSL 2 distribution et il est accessible via l’Explorateur de fichiers.In WSL 2, this is inside a WSL 2 distro and can be accessed through the File Explorer.

RécapitulatifRecap

À ce stade, vous disposez d’une application opérationnelle qui peut survivre aux redémarrages !At this point, you have a functioning application that can survive restarts! Vous pouvez l’afficher à vos investisseurs et espérer qu’ils peuvent attraper votre vision.You can show it off to your investors and hope they can catch your vision!

Toutefois, vous avez vu précédemment que la reconstruction d’images pour chaque modification prend beaucoup de temps.However, you saw earlier that rebuilding images for every change takes quite a bit of time. Le meilleur moyen d’apporter des modifications, est-il possible d’effectuer des modifications ?There's got to be a better way to make changes, right? Avec les montages de liaison (que nous avons indiqués plus haut), il existe une meilleure méthode.With bind mounts (which we hinted at earlier), there is a better way! Jetons un coup d’œil à ce moment là !Let's take a look at that now!

Étapes suivantesNext steps

Poursuivez avec le didacticiel.Continue with the tutorial!