Docker dispose de quatre méthodes de stockage : 1. "Stockage par défaut", les données sont enregistrées dans le conteneur en cours d'exécution, les données sont également supprimées 2. "Volume de données" ; " , montez directement n'importe quel répertoire ou fichier dans le système de fichiers hôte ; 4. "tmpfs mount".
L'environnement d'exploitation de ce tutoriel : système linux5.9.8, version docker-1.13.1, ordinateur Dell G3.
Plusieurs méthodes de stockage des conteneurs Docker
Le stockage des conteneurs peut être divisé en deux grandes catégories :
L'une est liée aux images, ce dont nous avons discuté dans "Bases de la technologie des conteneurs Docker - Fichier commun System OverlayFS" La fonctionnalité de copie sur écriture de la couche conteneur mentionnée dans l'article. Par défaut, tous les fichiers créés dans le conteneur sont stockés sur la couche conteneur inscriptible. Cette méthode de stockage direct des fichiers sur la couche conteneur rend les données difficiles à conserver et à partager en raison de la dépendance aux pilotes de stockage et de l'utilisation de l'écriture directe sur l'hôte. système de fichiers. Cette abstraction supplémentaire réduit les performances par rapport au volume de données.
L'autre est le stockage hôte, qui est utilisé en liant ou en suspendant le répertoire hôte dans le conteneur. Les données peuvent être conservées même après l'arrêt du conteneur. Présentez principalement ce dernier.
Plusieurs méthodes de montage du stockage
Nous dessinons ici le diagramme suivant en fonction des différents emplacements où les données sont stockées sur l'hôte Docker :
Docker dispose de quatre méthodes de stockage : par défaut, volumes de données, montages liés. montage, montage tmpfs (disponible uniquement dans l'environnement Linux), dont les volumes et les montages de liaison implémentent les données de conteneur persistantes.
1. Stockage par défaut
Les données sont enregistrées dans le conteneur en cours d'exécution, une fois le conteneur supprimé, les données sont également supprimées
2.montages de liaison
Par rapport aux volumes, les montages de liaison ont des fonctions limitées. Lors de l'utilisation du montage lié, un fichier ou un répertoire sur l'hôte est monté dans le conteneur. Le fichier ou le répertoire est référencé par son chemin complet sur l'hôte. Il n'est pas nécessaire que le répertoire existe déjà sur l'hôte Docker. S'il n'existe pas, Docker le créera pour nous. Notez que seuls les répertoires peuvent être créés automatiquement.
Nous lions le montage d'un répertoire /nginx/html via l'option -v et jetons un œil dans le conteneur
docker run -dt -v /nginx/html:/usr/share/nginx/html --name nginx nginx
Affichez le champ Mounts du conteneur via docker inspect nginx
"Mounts": [ { "Type": "bind", "Source": "/nginx/html", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
Ensuite, nous créons un index.html sur l'hôte du docker et écrivez-le bonjour nginx, puis accédez à l'adresse IP du conteneur. Évidemment, notre montage a pris effet.
[root@localhost ~]# echo "hello nginx" > /nginx/html/index.html [root@localhost ~]# curl 172.17.0.4 hello nginx
Il y a un problème ici. Nous pouvons modifier les fichiers via l'hôte Docker pour rendre les fichiers du conteneur efficaces. La même chose est vraie en sens inverse. Le conteneur peut modifier, créer et supprimer le contenu du système de fichiers hôte. Pour résoudre ce problème, nous pouvons configurer les autorisations du répertoire de montage lors de la création du conteneur, telles que les autorisations en lecture seule suivantes :
docker run -dt -v /nginx/html:/usr/share/nginx/html:ro --name nginx nginx
Donc, lorsque nous utilisons bind mount, vous exploitez le système de fichiers hôte, vous devez savoir ce qui suit :
Quel contenu contient le répertoire que vous montez, afin de ne pas affecter les autres applications ?
Si votre conteneur doit avoir l'autorisation d'exploiter ces répertoires.
3.volumes data volumes
Les volumes de stockage de volumes sont créés et gérés par Docker Nous pouvons utiliser la commande docker volume create pour créer des volumes explicitement, ou créer des volumes lorsque le conteneur est créé.
[root@localhost ~]# docker volume create nginx_volume nginx_volume [root@localhost volumes]# docker inspect nginx_volume [ { "CreatedAt": "2021-08-12T01:58:04-04:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data", "Name": "nginx_volume", "Options": {}, "Scope": "local" } ]
Vous pouvez voir que le point de montage se trouve sous le répertoire racine de docker /var/lib/docker/volumes
Utilisez docker volume rm/prune pour effacer un ou tous les volumes inutilisés. Vous pouvez utiliser la commande docker pour gérer. le volume. Comparaison Un avantage des supports de liaison.
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local owncloud-docker-server_files local owncloud-docker-server_mysql local owncloud-docker-server_redis [root@localhost ~]# docker volume prune WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: owncloud-docker-server_files owncloud-docker-server_mysql owncloud-docker-server_redis Total reclaimed space: 199.4MB
Si la source de montage du conteneur n'est pas spécifiée lors de la création du conteneur, docker créera automatiquement pour nous un volume anonyme, également situé dans le répertoire racine de docker.
[root@localhost volumes]# docker run -dt -v /usr/share/nginx/html --name nginx_with_volume nginx d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6 [root@localhost volumes]# docker volume ls DRIVER VOLUME NAME local d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 local nginx_volume [root@localhost volumes]# ls /var/lib/docker/volumes/ backingFsBlockDev d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 metadata.db nginx_volume
Après avoir créé un volume de montage, le stockage à ce moment est cohérent avec les montages de liaison. Cependant, lorsqu'il n'est pas garanti que l'hôte du docker ait une structure de répertoires ou de fichiers donnée, le volume peut nous aider à combiner la configuration du docker. hôte avec la séparation du runtime du conteneur. De cette façon, lorsque nous devons sauvegarder, restaurer ou migrer des données d'un hôte Docker à un autre, le volume est très pratique et peut être séparé des restrictions du chemin de l'hôte.
Lors de l'utilisation de montages et de volumes de liaison, nous devons faire attention aux principes de couverture de propagation suivants :
Lors du montage d'un volume vide : le contenu du répertoire dans le conteneur sera propagé (copié) sur le volume.
Lors de la liaison d'un volume monté ou non vide : le contenu du répertoire dans le conteneur sera écrasé par le volume ou le répertoire hôte lié.
4.tmpfs mount
tmpfs mount n'est disponible que pour les hôtes Linux, lorsque nous utilisons tmpfs mount pour créer un conteneur, le conteneur peut créer des fichiers en dehors de la couche inscriptible du conteneur. Conservez les données en mémoire et lorsque le conteneur est arrêté, les données écrites seront également supprimées. Principalement utilisé pour le stockage temporaire de fichiers sensibles que vous ne souhaitez pas conserver dans la couche inscriptible de l'hôte ou du conteneur.
Montez un bloc mémoire via l'option --tmpfs.
docker run -dt --name busybox_tmpfs --tmpfs /etc/running busybox
Mettez les paramètres dans la méthode --mount pour spécifier la taille de stockage temporaire.
docker run -dt --name busybox_tmpfs2 --mount type=tmpfs,tmpfs-size=2048,destination=/etc/running busybox
Partage de données de stockage
在容器之间共享数据主要有两种方法,第一种比较简单,只需要将目录或者volume挂载到多个容器中即可。这里不做赘述,我们来看一下通过中间容器实现共享的方式。
我们创建一个中间容器,包含绑定挂载目录和一个卷。
docker create -v /share:/volume1 -v /volume2 --name volume_share busybox
在我们需要共享的容器中通过选项--volumes-from拿过来用即可
docker run -d -t --volumes-from volume_share --name container1 busybox
我们inspect检查一下Mounts字段,此时container1已经挂载到了一个bind目录和一个volume
"Mounts": [ { "Type": "bind", "Source": "/share", "Destination": "/volume1", "Mode": "", "RW": true, "Propagation": "rprivate" }, { "Type": "volume", "Name": "21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e", "Source": "/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data", "Destination": "/volume2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
推荐学习:《docker视频教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!