Explication détaillée du volume de données du conteneur Docker

1. Introduction aux volumes de données

Docker regroupera l'application et l'environnement d'exécution pour former l'opération de conteneur. Si les données générées par le conteneur Docker ne génèrent pas une nouvelle image via docker commit, de sorte que les données soient enregistrées dans le cadre de l'image, alors lorsque le conteneur est supprimé , les données disparaîtront naturellement. . Pour enregistrer des données dans Docker, nous utilisons des volumes. |

Un volume est un répertoire ou un fichier qui existe dans un ou plusieurs conteneurs et est monté sur le conteneur par Docker, mais le volume n'appartient pas à Union FileSystem, il peut donc contourner le système de fichiers union pour fournir un stockage persistant ou des données partagées. Caractéristiques : .

Les volumes sont conçus pour la persistance des données et sont complètement indépendants du cycle de vie du conteneur, ainsi Docker ne supprimera pas le volume de données monté lorsque le conteneur est supprimé.

Caractéristiques des volumes de données :

  1. Volumes de données pour partager ou réutiliser les données entre conteneurs
  2. Les changements de volume peuvent prendre effet directement
  3. Les modifications des volumes de données ne seront pas incluses dans les mises à jour en miroir
  4. Le cycle de vie d'un volume de données dure jusqu'à ce qu'aucun conteneur ne l'utilise

2. Simple à utiliser

Exécutez le conteneur en spécifiant la commande mount data volume :

docker run -it -v 主机目录:容器目录

Créez un volume de données entre le répertoire hôte /home/test et le conteneur /home, créez d'abord le fichier test.java dans le répertoire du conteneur, puis accédez au répertoire hôte pour vérifier si le fichier existe.
insérez la description de l'image ici
Pour afficher les métadonnées correspondant au conteneur docker inspect 容器id, vous pouvez afficher les informations sur le volume de données créé sur le nœud Mounts.
insérez la description de l'image ici

Même si le conteneur cesse de s'exécuter ou s'il est supprimé, la synchronisation des données peut toujours être réalisée et le volume de données local ne sera pas perdu.

3. Le conteneur MySQL établit le volume de données et synchronise les données

Le répertoire de stockage des fichiers de données par défaut de MySQL sous Linux est /var/lib/mysql, et l'emplacement du fichier de configuration par défaut est /etc/mysql/conf.d. Afin d'assurer la perte de données après la suppression de l'image ou du conteneur MySQL, le suivant l'établissement Les volumes de données contiennent des données et des fichiers MySQL.

docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker images;
REPOSITORY            TAG       IMAGE ID       CREATED             SIZE
mytomcat              1.0       f189aac861de   About an hour ago   653MB
mysql                 5.7       f07dfa83b528   6 days ago          448MB
tomcat                latest    feba8d001e3f   10 days ago         649MB
nginx                 latest    ae2feff98a0c   12 days ago         133MB
centos                latest    300e315adb2f   2 weeks ago         209MB
portainer/portainer   latest    62771b0b9b09   5 months ago        79.1MB
elasticsearch         7.6.2     f29a1ee41030   9 months ago        791MB
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
72efdb845471b6bd19077b596af51122baa982c01211c39f989afaca556b149f
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd /home
[root@iZwz99sm8v95sckz8bd2c4Z home]# ls
hai  mysql  pan  test  test.java
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd mysql/conf
[root@iZwz99sm8v95sckz8bd2c4Z conf]# ls
[root@iZwz99sm8v95sckz8bd2c4Z conf]# cd /home/mysql/data
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem  test

Si l'utilisation du mot de passe configuré pour se connecter au service mysql échoue, la raison est probablement qu'il existe déjà des fichiers dans le fichier de configuration monté sur la machine et que la configuration dans le conteneur est écrasée. Nous pouvons supprimer la configuration du fichier dans le fichier correspondant. fichier local. .

4. Commandes communes

(1) Créer un volume de données

docker volume create my-vol

(2) Afficher tous les volumes de données

$ docker volume ls
local my-vol

(3) Afficher les informations du volume de données spécifié

$ docker volume inspect my-vol
[
{
    
    
"Driver": "local",
"Labels": {
    
    },
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {
    
    },
"Scope": "local"
}
]

(4) Supprimer le volume de donnéesdocker volume rm ...

$ docker volume rm my-vol

(5) Supprimer le volume concerné lors de la suppression du conteneur

$ docker rm -v ...

Les volumes de données sont conçus pour conserver les données, leur cycle de vie est indépendant des conteneurs, Docker ne supprime pas automatiquement les volumes de données après la suppression des conteneurs et il n'existe aucun mécanisme de récupération de place pour traiter les données qui ne sont référencées par aucun rouleau de conteneurs. Si vous devez supprimer le volume de données lors de la suppression du conteneur. Vous pouvez utiliser la commande docker rm -v lors de la suppression d'un conteneur.

Les volumes de données sans propriétaire peuvent occuper beaucoup d'espace, pour nettoyer utilisez la commande suivante

$ docker volume prune

(5) Utilisez --mount pour créer un volume de données
Montez un répertoire hôte en tant que volume de données. Utilisez l'indicateur --mount pour spécifier de monter un répertoire localhost dans le conteneur.

$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp 
python app.py

La commande ci-dessus monte le répertoire /src/webapp de l'hôte dans le répertoire /opt/webapp du conteneur. Les utilisateurs peuvent placer certains programmes dans un répertoire local pour voir si le conteneur fonctionne correctement. Le chemin vers le répertoire local doit être un chemin absolu, si le répertoire n'existe pas, Docker le créera automatiquement pour vous.

L'autorisation par défaut pour Docker de monter le répertoire hôte est en lecture-écriture, et les utilisateurs peuvent également spécifier la lecture seule en ajoutant le paramètre readonly.

$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly之后,就挂载为只读了。如果你在容器内/src/webapp目录新建文件,会显示如下错误
/src/webapp # touch new.txt
touch: new.txt: Read-only file system

5. Montures nommées et montures anonymes

5.1 Monture anonyme

Le montage anonyme signifie que lors de la spécification d'un volume de données, le chemin de l'hôte correspondant au chemin du conteneur n'est pas spécifié, de sorte que le chemin de l'hôte mappé correspondant est le chemin par défaut /var/lib/docker/volumes/ Un dossier nommé de manière aléatoire est automatiquement généré.

Exécutez comme suit et montez le conteneur Nginx de manière anonyme :

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
d3a27b969d122d5516cac75e99b17dff7aaaf1e0c042385c6b05990053f1259

Afficher tous les volumes de données, la valeur de VOLUME NAME ici est le répertoire réel.

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls
DRIVER    VOLUME NAME
local     0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local     668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local     e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a

5.2 Mont nommé

Le montage nommé consiste à spécifier le nom du dossier, qui est différent du chemin de montage spécifié. Le nom du dossier spécifié ici se trouve sous le chemin du volume de données par défaut spécifié par Docker. docker volume lsVous pouvez afficher l'état du répertoire du volume de données actuel via la commande.

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
4ceaff19e5275dcd3014a8e7a8af618f7f7ce0da18d605c7c41a8653e78bf912
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls
DRIVER    VOLUME NAME
local     0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local     668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local     e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
local     juming-nginx

La commande permettant d'afficher les informations sur le volume de données spécifié :docker volume inspect数据卷名称

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume inspect juming-nginx
[
    {
    
    
        "CreatedAt": "2020-12-29T22:40:25+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

Vous pouvez voir que le volume de données hôte est monté sur /var/lib/docker/volumes/juming-nginx/_data

Tous les volumes de données Docker sont dans le répertoire /var/lib/docker/volumes/ par défaut

[root@iZwz99sm8v95sckz8bd2c4Z volumes]# ls
0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26  backingFsBlockDev                                                 juming-nginx
668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956  e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a  metadata.db

La différence entre un montage anonyme, un montage nommé et un montage en spécifiant le chemin est la suivante :
-v chemin dans le conteneur#montage anonyme

-v volume name : chemin à l'intérieur du conteneur #named mount

-v /host path : chemin dans le conteneur #chemin spécifié mount

Spécifiez les paramètres pertinents du mappage du volume de données :

ro - lecture seule Lecture seule. Si la lecture seule est définie, seul le chemin de l'hôte peut être manipulé et le chemin correspondant dans le conteneur ne peut pas être manipulé.

rw ----- readwrite lire et écrire

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

6. Définir le volume de données dans Dockerfile

Nous pouvons utiliser la commande VOLUME dans le Dockerfile pour ajouter un ou plusieurs volumes de données à l'image.

Ce qui suit utilise Dockerfile pour créer une nouvelle image, le contenu du fichier dockerfile01 et les deux répertoires volume01 et volume02 sont montés de manière anonyme :

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

Exécuter l'image de construction

[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile01 -t ethan/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 215ef28fd5a6
Removing intermediate container 215ef28fd5a6
 ---> f506ddf133d2
Step 3/4 : CMD echo "----end----"
 ---> Running in 62a1c4b9dc7b
Removing intermediate container 62a1c4b9dc7b
 ---> bbea81a6e94e
Step 4/4 : CMD /bin/bash
 ---> Running in 245d239f3776
Removing intermediate container 245d239f3776
 ---> 1df90e6fd790
Successfully built 1df90e6fd790
Successfully tagged ethan/centos:1.0
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
ethan/centos          1.0       1df90e6fd790   13 minutes ago   209MB
mytomcat              1.0       f189aac861de   25 hours ago     653MB
mysql                 5.7       f07dfa83b528   7 days ago       448MB
tomcat                latest    feba8d001e3f   11 days ago      649MB
nginx                 latest    ae2feff98a0c   13 days ago      133MB
centos                latest    300e315adb2f   3 weeks ago      209MB
portainer/portainer   latest    62771b0b9b09   5 months ago     79.1MB
elasticsearch         7.6.2     f29a1ee41030   9 months ago     791MB

Après avoir terminé la génération de l'image, démarrez le conteneur généré par vous-même

[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker run -it 1df90e6fd790 /bin/bash
[root@828d43dba78e /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root  360 Dec 29 15:41 dev
drwxr-xr-x   1 root root 4096 Dec 29 15:41 etc
drwxr-xr-x   2 root root 4096 Nov  3 15:22 home
lrwxrwxrwx   1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3 15:22 media
drwxr-xr-x   2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x   2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 111 root root    0 Dec 29 15:41 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3 15:22 srv
dr-xr-xr-x  13 root root    0 Dec 29 15:41 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var
drwxr-xr-x   2 root root 4096 Dec 29 15:41 volume01
drwxr-xr-x   2 root root 4096 Dec 29 15:41 volume02

Vous pouvez voir le répertoire du volume de données monté automatiquement. Voir le répertoire de volumes de données de l'hôte correspondant ci-dessous

[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker inspect 828d43dba78e
[
    {
    
    
        "Id": "828d43dba78ecaa10e7e57c1091ee8cf3581dae88187aa04163946dfc86bfd76",
        "Created": "2020-12-29T15:41:29.297091075Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
    
    
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1719,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-12-29T15:41:34.107755138Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
...
#重点:
        "Mounts": [
            {
    
    
                "Type": "volume",
                "Name": "c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc",
                "Source": "/var/lib/docker/volumes/c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
    
    
                "Type": "volume",
                "Name": "1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f",
                "Source": "/var/lib/docker/volumes/1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

Vous pouvez voir le répertoire de montage de l'hôte sous Monts. Étant donné que le répertoire hôte n'est pas spécifié dans le dockerfile, il s'agit d'un montage anonyme et un chemin nommé de manière aléatoire est généré dans le répertoire /var/lib/docker/volumes/.

7. Volumes de données de conteneur

Le volume de données du conteneur fait référence à l'établissement d'un volume de données pour synchroniser les données entre plusieurs conteneurs et réaliser la synchronisation des données entre les conteneurs.
insérez la description de l'image ici

Le premier conteneur de démarrage 1, volume01 et volume02 sont des répertoires de montage.

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it --name cnetos01 ethan/centos:1.0
[root@731d53b8c3d5 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02

Ensuite, démarrez le conteneur 2 --volumes-fromet définissez la relation de montage du volume de données entre le conteneur 2 et le conteneur 1 via les paramètres.

[root@iZwz99sm8v95sckz8bd2c4Z /]# docker run -it --name centos02 --volumes-from cnetos01 ethan/centos:1.0
[root@7f90d4147511 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root  360 Dec 30 14:58 dev
drwxr-xr-x   1 root root 4096 Dec 30 14:58 etc
drwxr-xr-x   2 root root 4096 Nov  3 15:22 home
lrwxrwxrwx   1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3 15:22 media
drwxr-xr-x   2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x   2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 108 root root    0 Dec 30 14:58 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3 15:22 srv
dr-xr-xr-x  13 root root    0 Dec 29 15:41 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var
drwxr-xr-x   2 root root 4096 Dec 30 14:54 volume01
drwxr-xr-x   2 root root 4096 Dec 30 14:54 volume02

Ajoutez d'abord le fichier dans le volume01 dans le conteneur 2

[root@7f90d4147511 /]# cd volume01
[root@7f90d4147511 volume01]# touch test.java
[root@7f90d4147511 volume01]# ls
test.java

Ensuite, vous pouvez voir que les fichiers du conteneur 1 seront également ajoutés.

Ce qui suit consiste à synchroniser les deux bases de données MySQL et les fichiers de configuration, de la même manière que l'opération ci-dessus, créez d'abord un volume de données, puis créez un montage de volume de données de conteneur pour un autre conteneur MySQL, par exemple :

[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

Je suppose que tu aimes

Origine blog.csdn.net/huangjhai/article/details/119860628
conseillé
Classement