Docker Learning (2) Explication détaillée des images et des volumes de données des conteneurs

7. Outils de gestion graphiques

Le contenu de cet article est résumé du contenu de Docker Quick Start (1) ;

Portaniner est un outil de gestion graphique pour Docker.Il fournit un panneau d'arrière-plan que nous pouvons utiliser, similaire aux outils tels que le panneau de visualisation de base de données SQLyog.

1. Téléchargez et installez

# -p 8088:9000  			 # 内部9000端口映射外部端口为8088
# -v /var/run/docker.sock:/var/run/docker.sock 	(这是挂载技术,后面再学习)
# --privileged=true 		# 授权可以访问
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer


[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Already exists 
49d59ee0881a: Already exists 
a2300fd28637: Already exists 
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
3cad49e5d24c55ba9aebbcde2d593f948e7aba91751ae27148dac709314fab14
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED         STATUS         PORTS                    NAMES
3cad49e5d24c   portainer/portainer   "/portainer"        8 seconds ago   Up 8 seconds   0.0.0.0:8088->9000/tcp   jovial_perlman
3e7fc95c278a   tomcat                "catalina.sh run"   9 hours ago     Up 9 hours     0.0.0.0:3355->8080/tcp   tomcat01
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# 

2. Accès via le réseau externe, http://adresse IP du serveur : 8088

Le serveur Alibaba Cloud définit un groupe de sécurité. Lors de la première connexion, vous devez définir le mot de passe de l'utilisateur administrateur.
Insérer la description de l'image ici

Après avoir défini le mot de passe et créé l'utilisateur, entrez dans la page ci-dessous et sélectionnez la connexion locale.

Insérer la description de l'image ici

Voici l'aperçu global de l'interface visuelle :

Insérer la description de l'image ici

Insérer la description de l'image ici

8. Explication détaillée de l'image Docker

8.1. Qu'est-ce qu'un miroir ?

Une image est un progiciel léger et exécutable indépendant utilisé pour empaqueter des environnements d'exécution de logiciels et des logiciels développés sur la base de l'environnement d'exécution. Il contient tout ce qui est nécessaire pour exécuter un logiciel donné, y compris le code, les dépendances d'exécution et les bibliothèques. Les variables d'environnement et les fichiers de configuration.

8.2. Principe de chargement de l'image Docker

8.2.1. Système de fichiers Union (UnionFS)

Système de fichiers Union (UnionFS) :

  • Développé par l'Université d'État de New York en 2004, il peut monter conjointement le contenu de plusieurs répertoires dans le même répertoire, tandis que les emplacements physiques des répertoires sont séparés. UnionFS peut fusionner des systèmes de fichiers en lecture seule et en lecture-écriture et dispose d'une fonction de copie sur écriture, permettant d'enregistrer les modifications apportées au système de fichiers en lecture seule dans le système de fichiers inscriptible.

  • Il s'agit d'un système de fichiers en couches, léger et hautes performances. Il prend en charge les modifications du système de fichiers qui peuvent être superposées couche par couche en une seule soumission. En même temps, différents répertoires peuvent être montés sur le même système de fichiers virtuel.

  • C'est la base des images Docker. Les images peuvent être héritées par superposition. Sur la base de l'image de base (sans image parent), diverses images d'application spécifiques peuvent être produites.

Caractéristiques : Chargez plusieurs systèmes de fichiers en même temps, mais de l'extérieur, un seul système de fichiers est visible. Le chargement conjoint superposera chaque couche de systèmes de fichiers, de sorte que le système de fichiers final contiendra tous les fichiers et répertoires sous-jacents.

8.2.2. Chargement de l'image Docker

Insérer la description de l'image ici

bootfs (système de fichiers de démarrage) comprend principalement le chargeur de démarrage et le noyau. Le chargeur de démarrage est principalement destiné au démarrage et au noyau. Le système de fichiers bootfs sera chargé au premier démarrage de Linux. La couche inférieure de l'image Docker est bootfs. Cette couche est la même que celle de notre système Linux/Unix typique, y compris le chargeur de démarrage et le noyau. Une fois le démarrage terminé, l'intégralité du noyau est dans la mémoire. À ce moment, le droit d'utiliser la mémoire a été transféré de bootfs au noyau. À ce moment, le système désinstallera également bootfs.

rootfs (système de fichiers racine), au-dessus de bootfs. Contient des répertoires et des fichiers standard tels que /dev, /proc, /bin, /etc dans les systèmes Linux typiques. Rootfs fait référence à diverses distributions de systèmes d'exploitation, telles que Ubuntu, Centos, etc.

Insérer la description de l'image ici

Habituellement, le CentOS que nous installons dans la machine virtuelle fait plusieurs Go. Pourquoi Docker ne fait-il que 230 Mo ?

Pour un système d'exploitation simplifié, rootfs peut être très petit et ne doit contenir que les commandes, outils et bibliothèques les plus basiques. Étant donné que la couche inférieure utilise directement le noyau de l'hôte, vous n'avez besoin que de fournir rootfs. On peut voir que pour différentes distributions Linux, les bootfs sont fondamentalement les mêmes, mais les rootfs seront différents, donc différentes distributions peuvent partager des bootfs.

8.3. Compréhension de la superposition

L'image Docker est en fait composée de couches de systèmes de fichiers. Comme mentionné ci-dessus, lors du téléchargement de l'image via Docker Pull, vous pouvez voir que l'image Docker semble être téléchargée couche par couche. Lors du téléchargement local de différentes versions d'une image, il existe des parties de fichier communes entre les différentes versions de l'image. Si cette partie existe déjà localement, elle ne sera pas téléchargée à plusieurs reprises et sera partagée directement.

Raisons de la stratification :

  1. Le plus grand avantage de la superposition est == ressources partagées ==
  2. Si plusieurs images sont créées à partir de la même image de base, l'hôte n'a qu'à enregistrer une copie de l'image de base sur le disque ;
  3. Dans le même temps, une seule image de base est chargée dans la mémoire pour servir tous les conteneurs, et chaque couche de l'image peut être partagée.

Téléchargez une image de la version MySQL 5.7 dans la machine virtuelle et observez la sortie du journal téléchargé, comme indiqué dans la figure ci-dessous. Le processus de téléchargement est téléchargé couche par couche. Si les couches précédentes existent déjà localement, il n'est pas nécessaire de les télécharger à nouveau. .

Insérer la description de l'image ici

Insérer la description de l'image ici

Afficher la couche d'image : l' image du docker inspecte le nom de l'image

Insérer la description de l'image ici

Insérer la description de l'image ici

Compréhension en couches :

Toutes les images Docker partent d'un calque d'image de base. Lorsque le contenu est modifié ou qu'un nouveau contenu est ajouté, un nouveau calque d'image sera créé au-dessus du calque d'image actuel. Par exemple, si vous créez une nouvelle image basée sur Ubuntu Linux 16.04, il s'agit de la première couche de la nouvelle image. Lorsque vous ajoutez du contenu lié à Python à cette image, une deuxième couche d'images sera créée au-dessus de la première couche. . Au fur et à mesure que vous continuez à ajouter des correctifs de sécurité (Security Patch), une image de troisième couche sera créée.

Insérer la description de l'image ici

Pour un autre exemple, l'image de premier niveau contient les fichiers 1, 2 et 3. Plus tard, une image de deuxième niveau est créée, qui contient les fichiers 4, 5 et 6. Plus tard, le contenu de l'image doit être modifié pour mettre à niveau le fichier. 5 au fichier 7. , les nouvelles mises à jour et modifications nécessitent la création d'une image de troisième couche. Dans ce cas, les fichiers de l’image supérieure écrasent les fichiers de l’image inférieure. Cela entraîne l'ajout de la version mise à jour du fichier à l'image en tant que nouveau calque d'image. Ainsi, de l'extérieur, l'image entière est divisée en trois couches et contient un total de 6 fichiers, dont le fichier 7 est une version mise à jour du fichier 5.

Insérer la description de l'image ici

Les images Dokcer sont en lecture seule. Lorsque le conteneur démarre, un nouveau calque inscriptible sera chargé au-dessus de l'image. Ce nouveau calque est communément appelé calque conteneur, et celui situé en dessous du conteneur est le calque image.

8.4. S'engager à soumettre l'image

Il existe deux manières de créer une image :

  • La première consiste à créer un miroir via commit
  • L'autre consiste à construire l'image via dockerfile (la méthode de construction dockerfile sera apprise plus tard)

Une fois le conteneur soumis via la validation, le conteneur peut être soumis en tant que nouvelle version d'image.

# docker commit -m=“提交的描述信息” -a=“作者信息” 容器id 目标镜像名:[TAG]

Comme mentionné ci-dessus à propos du déploiement de Tomcat, l'image Tomcat téléchargée par défaut est la plus petite image pour garantir le plus petit environnement d'exploitation. Le répertoire webapps dans l'image est vide. Vous devez entrer dans le conteneur et copier le contenu du répertoire webapps.dist dans webapps avant d'y accéder depuis le réseau externe via le mappage de port. À cette fin, créez une nouvelle image Tomcat comme suit : Soumettez un conteneur Tomcat entièrement opérationnel en tant que nouvelle image. Cela permet d'utiliser l'image directement après son téléchargement, sans avoir besoin de la copier.

Étapes pour créer une image Tomcat :

# 1. 下载默认的tomcat镜像
docker pull tomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull tomcat  # 下载tomcat镜像
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Already exists 
9b829c73b52b: Already exists 
cb5b7ae36172: Already exists 
6494e4811622: Already exists 
668f6fcc5fa5: Already exists 
dc120c3e0290: Already exists 
8f7c0eebb7b1: Already exists 
77b694f83996: Already exists 
0f611256ec3a: Already exists 
4f25def12f23: Already exists 
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images		#查看是否下载成功
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago     1.21GB
nginx                 latest    605c77e624dd   4 months ago    141MB
tomcat                latest    fb5657adc892   4 months ago    680MB
redis                 latest    7614ae9453d1   4 months ago    113MB
mysql                 latest    3218b38490ce   4 months ago    516MB
hello-world           latest    feb5d9fea6a5   7 months ago    13.3kB
centos                latest    5d0da3dc9764   7 months ago    231MB
portainer/portainer   latest    580c0e4e98b0   13 months ago   79.1MB
# 2. 启动这个tomcat镜像,
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -p 8023:8080 tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
# 3. 查看正在运行的容器
docker ps
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED         STATUS         PORTS                    NAMES
e315dfa9c866   tomcat                "catalina.sh run"   2 minutes ago   Up 2 minutes   0.0.0.0:8023->8080/tcp   strange_brown
3cad49e5d24c   portainer/portainer   "/portainer"        14 hours ago    Up 14 hours    0.0.0.0:8088->9000/tcp   jovial_perlman
# 4。 进入tomcat容器内部,查看webapps目录,没有内容,将webapps.dist目录中的内容拷贝到webapps目录中
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker exec -it e315dfa9c866 /bin/bash
root@e315dfa9c866:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
root@e315dfa9c866:/usr/local/tomcat/webapps# cd ..
root@e315dfa9c866:/usr/local/tomcat# cd webapps.dist
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# cd ..
root@e315dfa9c866:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@e315dfa9c866:/usr/local/tomcat/webapps# 

# 4. 将操作之后的容器通过commit提交成一个新的tomcat镜像,以后便可以直接下载这个新的镜像使用。
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker commit -m="new tomcat that added app to webapps" -a="Kevin-Ding" e315dfa9c866 mytomcat:1.0
sha256:fae635bb688d1260244034fe2ed158f28de3bd0fa5cc7269cb77edcc0d5b6931
# 5. docker images 便可查看到自己提交的镜像 mytomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mytomcat              1.0       fae635bb688d   28 seconds ago   684MB
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago      1.21GB
nginx                 latest    605c77e624dd   4 months ago     141MB
tomcat                latest    fb5657adc892   4 months ago     680MB
redis                 latest    7614ae9453d1   4 months ago     113MB
mysql                 latest    3218b38490ce   4 months ago     516MB
hello-world           latest    feb5d9fea6a5   7 months ago     13.3kB
centos                latest    5d0da3dc9764   7 months ago     231MB
portainer/portainer   latest    580c0e4e98b0   13 months ago    79.1MB

# 6.运行自己制作的镜像
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it mytomcat:1.0 /bin/bash
root@bc1b6aac1bea:/usr/local/tomcat# cd webapps	
root@bc1b6aac1bea:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@bc1b6aac1bea:/usr/local/tomcat/webapps# cd ..
root@bc1b6aac1bea:/usr/local/tomcat# exit

9. Volume de données du conteneur

9.1. Introduction aux volumes de données

Docker peut regrouper des applications et des environnements d'exploitation dans une image.

Si la base de données MySQL est déployée dans Docker et que Docker est accidentellement supprimé, cela ne signifierait-il pas que la base de données est supprimée et que la base de données a disparu ? Alors comment sauvegarder des données dans Docker ?

  1. Générez une nouvelle image via docker commit, enregistrez certaines données et validez dans une nouvelle image à chaque fois que les données changent, ce qui est un peu trop compliqué ;
  2. Les données du conteneur peuvent-elles être stockées localement et de manière persistante ?

Il s'agit de la technologie des volumes de données. Grâce au montage, le répertoire dans le conteneur est monté sous Linux, de sorte que les données peuvent être synchronisées avec l'emplacement local pour une persistance facile. Après tout, les données n'ont pas de prix.

L'objectif de conception des volumes est la persistance des données, qui est totalement indépendante du cycle de vie du conteneur. Par conséquent, Docker ne supprimera pas son volume de données monté lorsque le conteneur est supprimé.

Volume de données : réalise les opérations de persistance et de synchronisation des conteneurs, et peut également réaliser le partage de données entre conteneurs !

9.2. Utilisation de base

Méthode 1 : monter à l'aide de la commande -v

# docker run -it -v 主机目录:容器内目录		# 路径映射
# docker run -it -p 主机端口:容器端口		 # 端口映射

# 1.查看home目录下的目录结构
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
kevin  test.java
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# cd ..

# 2. 运行centos,并将centos的home目录挂载到虚拟机home目录的testcentos下 
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -v /home/testcentos:/home centos /bin/bash
[root@fc3e6a5f86ad /]# 

# 3. 新开窗口连接,查看虚拟机的home目录,发现testcentos目录
[root@iZ2ze1dg1xkfc3i15ybixmZ /]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
redis  test1.java  testcentos  test.java  www
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# 

内部查看挂载信息
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# docker inspect fc3e6a5f86ad
挂载信息:显示已经将/home 目录挂载到 /home/testcentos

Insérer la description de l'image ici

Créez un nouveau fichier test.java dans le répertoire personnel du conteneur. Le fichier peut être visualisé de manière synchrone dans le répertoire de la machine virtuelle testcentos.

Insérer la description de l'image ici

Ensuite, effectuez des modifications dans le fichier correspondant à la machine virtuelle pour voir si le fichier modifié peut s'afficher normalement dans le conteneur.

# 1. 先停止容器并退出,
[root@fc3e6a5f86ad /]# exit
exit
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# clear
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED        STATUS        PORTS                    NAMES
3cad49e5d24c   portainer/portainer   "/portainer"   25 hours ago   Up 11 hours   0.0.0.0:8088->9000/tcp   jovial_perlman
# 2.在主机中修改testcentos目录下的test.java
# vim操作,i进入插入模式; :wq保存并退出
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# vim test.java

# 3.重新启动刚才的centos,进入容器里面查看test.java发现内容已经被修改成功
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker start fc3e6a5f86ad
fc3e6a5f86ad
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker attach fc3e6a5f86ad
[root@fc3e6a5f86ad /]# cd home
[root@fc3e6a5f86ad home]# ls
test.java
[root@fc3e6a5f86ad home]# cat test.java
hello, Linux update			#成功显示修改信息

Le montage et la liaison des volumes de données sont un processus bidirectionnel. À l'avenir, le contenu de la partie de liaison de montage pourra être modifié uniquement sur la machine virtuelle sans entrer dans le conteneur !

9.3. Exercice - Installer et déployer MySQL

Pour la persistance des données MySQL, le répertoire de données dans MySQL peut être monté sur la machine virtuelle via le montage.

  1. Télécharger l'image MySQL
# docker pull 命令下载 mysql 5.7版本
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看本地镜像中是否下载了mysql 5.7
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mytomcat              1.0       fae635bb688d   2 days ago      684MB
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago     1.21GB
nginx                 latest    605c77e624dd   4 months ago    141MB
tomcat                latest    fb5657adc892   4 months ago    680MB
redis                 latest    7614ae9453d1   4 months ago    113MB
mysql                 5.7       c20987f18b13   4 months ago    448MB
hello-world           latest    feb5d9fea6a5   7 months ago    13.3kB
centos                latest    5d0da3dc9764   8 months ago    231MB
portainer/portainer   latest    580c0e4e98b0   14 months ago   79.1MB
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]#
  1. Exécutez l'image et terminez le montage du chemin
# 运行镜像
-d 后台运行
--name 指定名字
-v 主机目录:容器内目录	# 需要挂载多个路径时,每个挂载用一个-v即可
-p 主机端口:容器内端口	
-e MYSQL_ROOT_PASSWORD=123454321 初始化mysql的登录密码
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d --name mysql_5_7 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7
  1. Une fois le démarrage réussi, connectez-vous localement à la base de données MySQL pour ajouter une table de base de données et vous pourrez afficher le répertoire de montage correspondant dans le répertoire de la machine virtuelle.

Rappel chaleureux : le port par défaut pour la connexion en ligne de commande est 3306. Une fois le mappage des ports modifié, la commande de port -P doit être ajoutée à la ligne de commande.

[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# mysql -h 39.107.241.179 -P 3307 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

# 成功通过命令行进入到数据库

Après avoir supprimé le conteneur MySQL dans la machine virtuelle, le répertoire initialement monté dans la machine virtuelle est toujours conservé, garantissant ainsi qu'aucune donnée n'est perdue.

9.4. Montage anonyme et montage nommé

9.4.1. Montage anonyme

Le montage anonyme signifie littéralement que lors du montage d'un volume de données, le chemin à monter sur l'hôte n'est pas spécifié, le montage se fera donc sur le chemin par défaut de l'hôte : /var/lib/docker/volumes/ Nommez un dossier de manière aléatoire comme chemin de montage.

Test : exécutez le conteneur nginx et le chemin dans le conteneur monté de manière anonyme est : /etc/nginx

# -P(大写P) 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
# docker run 后台运行nginx,随机映射端口,匿名挂在
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -P -v /etc/nginx nginx
f7d28a8dc9ea221c0a8d192d8079b28166151d11890ac432b75b0389b4005f5f
# 运行成功之后,进入home目录
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
# 通过docker volume ls 查看所有的volumes
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER    VOLUME NAME
local     e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local     e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local     f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
# 看到volums的名字为随机生成的,此为匿名挂载
9.4.2. Monture nommée

Le montage nommé, comme son nom l'indique, consiste à spécifier le nom du volume lors du montage. Différent du chemin de montage spécifié, le chemin où se trouve le nom du volume spécifié dans le montage nommé est le chemin sous le volume de données par défaut.

Test : redémarrez un conteneur nginx, montez-le avec un nom et renommez-le en nginx02

# 随机指定端口,重命名为nginx02, 具名挂载,卷名设置为juming-nginx
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx nginx
# 重新启动一个具名挂载的nginx
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
206217bd55b69753a7788d1a9872bab2500e146e2c962394da3ddd0b600d9fd3
# 查看卷列表,可以看到有名为 juming-nginx的卷信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER    VOLUME NAME
local     e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local     e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local     f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
local     juming-nginx
# 通过docker volume inspect 卷名   查看指定卷的相关信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume inspect juming-nginx
[
    {
    
    
        "CreatedAt": "2022-05-15T23:49:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
# 查询出来的信息为:MountPoint为卷的默认挂载路径

Vous pouvez voir que le chemin de montage du volume juming-nginxde spécifié dans le volume de données hôte est : /var/lib/docker/volumes/volume name/_data ;

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

9.4.3. Différences

Comment faire la distinction entre une monture anonyme et une monture nommée ?

-v 容器内路径    			# 匿名挂载
-v 卷名:容器内路径			   # 具名挂载
-v /宿主机路径:容器内路径		 # 指定路径挂载

Pour résumer, le volume de données que nous avons monté peut être facilement trouvé grâce au montage nommé. Il est recommandé d'utiliser le montage nommé.

Un point supplémentaire : Instructions sur ro et rw lors du montage

  • ro readonly est en lecture seule.Lorsqu'il est défini sur une autorisation en lecture seule, cela signifie que le chemin correspondant dans le conteneur ne peut pas être exploité et ne peut être exploité que via le chemin de l'hôte.
  • rw readwrite peut lire et écrire, l'autorisation par défaut pour le montage de volumes.

Expression:

# ro(只读)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:ro nginx
#rw(可读可写)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:rw nginx

9.5. Créer une image à l'aide de la méthode DockerFile

Dockerfile est un fichier de construction utilisé pour créer une image Docker et est une commande de script.

La deuxième façon de créer une image : créer une image via dockerfile

  1. Tout d'abord, créez un nouveau dossier docker-test-volume dans le répertoire personnel, créez-y un nouveau fichier dockerfile1 et écrivez le script suivant :
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "----end----"

CMD /bin/bash 
  1. Après la création, la méthode docker build exécute l'image de construction

    # docker build -f dockerfile的全路径 -t 镜像名:tag .
    [root@kevinDing docker_test_volume]# docker build -f /home/docker_test_volume/dockerfile1 -t kevin/mycentos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 5d0da3dc9764
    Step 2/4 : VOLUME ["volume01", "volume02"]
     ---> Running in b860235245ea
    Removing intermediate container b860235245ea
     ---> 0bc3ac498d5f
    Step 3/4 : CMD echo "----end----"
     ---> Running in 324159180d29
    Removing intermediate container 324159180d29
     ---> 0a3ee43af21b
    Step 4/4 : CMD /bin/bash
     ---> Running in b3263513fb82
    Removing intermediate container b3263513fb82
     ---> f520432b291f
    Successfully built f520432b291f
    Successfully tagged kevin/mycentos:1.0
    [root@kevinDing docker_test_volume]# docker images
    REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
    kevin/mycentos   1.0       f520432b291f   6 seconds ago   231MB
    hello-world      latest    feb5d9fea6a5   7 months ago    13.3kB
    centos           latest    5d0da3dc9764   8 months ago    231MB
    [root@kevinDing docker_test_volume]# 
    
    

Insérer la description de l'image ici

  1. Exécutez l'image que vous avez créée et affichez les informations de répertoire dans l'image

    [root@kevinDing docker_test_volume]# docker run -it f520432b291f /bin/bash
    # 查看列表信息,可以看到最后两个文件为挂载的目录volume01和volume02
    [root@8ebf26cff30f /]# ls -l
    total 56
    lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
    drwxr-xr-x  5 root root  360 May 20 15:17 dev
    drwxr-xr-x  1 root root 4096 May 20 15:17 etc
    drwxr-xr-x  2 root root 4096 Nov  3  2020 home
    lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
    lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
    drwx------  2 root root 4096 Sep 15  2021 lost+found
    drwxr-xr-x  2 root root 4096 Nov  3  2020 media
    drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
    drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
    dr-xr-xr-x 94 root root    0 May 20 15:17 proc
    dr-xr-x---  2 root root 4096 Sep 15  2021 root
    drwxr-xr-x 11 root root 4096 Sep 15  2021 run
    lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
    drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
    dr-xr-xr-x 13 root root    0 May 17 01:11 sys
    drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
    drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
    drwxr-xr-x 20 root root 4096 Sep 15  2021 var
    drwxr-xr-x  2 root root 4096 May 20 15:17 volume01
    drwxr-xr-x  2 root root 4096 May 20 15:17 volume02
    [root@8ebf26cff30f /]# 
    
  2. Ouvrez une autre connexion et affichez les informations internes de l'image via Docker Inspect

    # 新开连接,查看运行的镜像
    [root@kevinDing /]# docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
    8ebf26cff30f   f520432b291f   "/bin/bash"   2 minutes ago   Up 2 minutes             suspicious_stonebraker
    # 进入到镜像内部查看
    [root@kevinDing /]# docker inspect f520432b291f
    
    [
        {
          
          
            "Id": "8ebf26cff30fd0eb9c75e144eb7c8b18bd07def9faa1d413fa12ad7f5c8efc90",
            "Created": "2022-05-20T15:17:29.740198902Z",
            "Path": "/bin/bash",
            "Args": [],
           ......   中间内容省略
            "Mounts": [
                {
          
          
                    "Type": "volume",
                    "Name": "de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273",
                    "Source": "/var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data",
                    "Destination": "volume01",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                },
                {
          
          
                    "Type": "volume",
                    "Name": "7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73",
                    "Source": "/var/lib/docker/volumes/7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73/_data",
                    "Destination": "volume02",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ]
        }
    ]
    
    
    
    

Insérer la description de l'image ici

  1. Vérifiez si le montage a réussi

    Entrez le répertoire de montage volume01 à l'intérieur de l'image, créez un fichier containers_test.txt et vérifiez si le fichier est généré dans le chemin de montage de volume01.

    [root@8ebf26cff30f /]# cd volume01
    [root@8ebf26cff30f volume01]# touch container_test.txt
    [root@8ebf26cff30f volume01]# ls
    container_test.txt
    [root@8ebf26cff30f volume01]# 
    # 在新开的连接中,进入到volume01的挂载路径中,可以查看到创建的文件
    [root@kevinDing volumes]# cd /var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data
    [root@kevinDing _data]# ls
    container_test.txt
    [root@kevinDing _data]# 
    

Insérer la description de l'image ici

9.6. Volume de données du conteneur

Le volume de données du conteneur fait référence à l'établissement d'un volume de données pour réaliser la synchronisation des données entre les conteneurs.

Insérer la description de l'image ici

Démarrez l'image centos créée ci-dessus, démarrez centos01centos02 et centos01 est le conteneur parent :

[root@kevinDing ~]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
kevin/mycentos   1.0       f520432b291f   52 minutes ago   231MB
hello-world      latest    feb5d9fea6a5   7 months ago     13.3kB
centos           latest    5d0da3dc9764   8 months ago     231MB
# 启动一个centos01容器
[root@kevinDing ~]# docker run -it --name centos01 kevin/mycentos:1.0
# ctrl+P+Q退出当前容器
# 再启动一个centos02容器, --volumes-from centos01
[root@kevinDing ~]# docker run -it --name centos02 --volumes-from centos01 kevin/mycentos:1.0

Après avoir ouvert une connexion, entrez deux conteneurs pour afficher le contenu :

[root@kevinDing ~]# docker ps
CONTAINER ID   IMAGE                COMMAND                  CS         PORTS     NAMES
5b0deb75f776   kevin/mycentos:1.0   "/bin/sh -c /bin/bash"   4minutes             centos02
b8dcce0bcf25   kevin/mycentos:1.0   "/bin/sh -c /bin/bash"   5minutes             centos01
[root@kevinDing ~]# docker attach b8dcce0bcf25
[root@b8dcce0bcf25 /]# ls -l
total 56
lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x  5 root root  360 May 20 16:04 dev
drwxr-xr-x  1 root root 4096 May 20 16:04 etc
drwxr-xr-x  2 root root 4096 Nov  3  2020 home
lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------  2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x  2 root root 4096 Nov  3  2020 media
drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 97 root root    0 May 20 16:04 proc
dr-xr-x---  2 root root 4096 Sep 15  2021 root
drwxr-xr-x 11 root root 4096 Sep 15  2021 run
lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x 13 root root    0 May 17 01:11 sys
drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
drwxr-xr-x 20 root root 4096 Sep 15  2021 var
drwxr-xr-x  2 root root 4096 May 20 16:04 volume01
drwxr-xr-x  2 root root 4096 May 20 16:04 volume02
[root@b8dcce0bcf25 /]# cd volume01
[root@b8dcce0bcf25 volume01]# ls
[root@b8dcce0bcf25 volume01]# touch test01.txt
[root@b8dcce0bcf25 volume01]# ls
test01.txt
[root@b8dcce0bcf25 volume01]# 

Insérer la description de l'image ici
Insérer la description de l'image ici

Si le conteneur centos01 est arrêté et supprimé, les données du conteneur centos02 ne seront pas affectées. Cela équivaut à une copie bidirectionnelle du répertoire monté lors de l'exécution de volumes à partir de, réalisant le partage de données entre les conteneurs.

De même, lors du partage de données entre plusieurs bases de données MySQL et fichiers de configuration, les opérations pour centos01 et centos02 ci-dessus sont similaires. Tout d'abord, démarrez mySQL01 et créez un volume de données. Utilisez ensuite –volumes-from pour monter le volume de données du conteneur sur un autre conteneur MySQL :

# 挂载第一个MySQL容器 匿名挂载
[root@KevinDing ~]# docker run -d --name mysql01 -p 3307:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7

# 挂载第二个MySQL,因为是挂载到mysql01,无需再进行-v的匿名挂载了
[root@KevinDing ~]# docker run -d --name mysql02 --volumes-from mysql01 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7

Cela permet la synchronisation des données entre deux conteneurs MySQL.

Les informations de configuration sont transférées entre les conteneurs et le cycle de vie d'un conteneur de volume de données se poursuit jusqu'à ce que plus aucun conteneur ne soit utilisé.
Une fois le contenu du conteneur parent conservé localement, les données locales ne seront pas perdues sans suppression.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43155804/article/details/124892975
conseillé
Classement