Comment accéder aux fichiers en dehors d'un conteneur Docker

Si les conteneurs sont isolés, comment peuvent-ils communiquer avec la machine hôte, peut-être pour stocker des données? Parce que lorsque nous créons un conteneur à partir d'une image, toutes les données générées sont perdues lorsque le conteneur est supprimé.

Nous avons donc besoin d'un moyen d'avoir un stockage permanent.

Nous pouvons le faire en utilisantLier des monturesetVolumes.

Il n'y a pas beaucoup de différence entre les deux, sauf que les montages de liaison peuvent pointer vers n'importe quel dossier sur l'ordinateur hôte et ne sont pas gérés directement par Docker.

Commençons par eux. Un exemple classique est celui des journaux. Supposons que votre application crée un fichier journal, à l'intérieur du conteneur, dans/usr/src/app/logs. Vous pouvez mapper cela à un dossier sur la machine hôte, en utilisant-v(pareil que--volume) lorsque vous exécutez le conteneur avecdocker run, comme ça:-v ~/logs:/usr/src/app/logs

Cela mappera ce dossier au sous-dossier des journaux dans le répertoire de base de l'utilisateur.

Nœud: le-mou--mountflag fonctionne de manière très similaire

C'est le drapeau utilisé avec leexamplenodeimage que nous avons créée précédemment:

docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode

Nous pouvons donc maintenant exécuter notre application Node et tout journal sera stocké sur l'ordinateur hôte plutôt que dans le conteneur Docker.

Notez que leexamplenodel'application ne génère aucune connexion/usr/src/app/logs, ce n'est qu'un exemple et vous devez d'abord configurer cette connexion.

Les détails sur le volume seront répertoriés lorsque vous exécutezdocker inspectsur le nom du conteneur, sous «Montages»:

"Mounts": [
    {
        "Type": "bind",
        "Source": "/Users/flavio/logs",
        "Destination": "/usr/src/app/logs",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

Can you see "Type": "bind"? That means that we have created a bind mount.

Now, let’s talk about Volumes.

The difference between Bind Mounts and Volumes is that by creating volumes, Docker will store the data in a folder it manages, which means it will take care of file permissions and ownership, and it will give you the tools to manage those volumes. While bind mounts are based on filesystem paths, and Docker can’t provide the tooling around them.

For example, Docker lets you remove all unused volumes by running docker volume prune or docker system prune --volumes.

To create a volume, we first need to run docker volume create:

docker volume create logs

Now you can use docker volume ls and docker volume inspect to get more data about the system volumes:

Now run docker run with the option -v logs:/usr/src/app/logs (tell the volume name instead of a folder)

docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode

Now running docker inspect on the image will show the mounted volume:

"Mounts": [
    {
        "Type": "volume",
        "Name": "logs",
        "Source": "/var/lib/docker/volumes/logs/_data",
        "Destination": "/usr/src/app/logs",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
],

See? Now the logs will be stored in the /var/lib/docker/volumes/logs/_data folder.

Volumes will be essential when it will be time to deploy a container on a cloud service, for example.

You can remove a volume running docker volume rm <name>.


More docker tutorials: