Introduction détaillée au pilote de stockage Docker
J'ai récemment travaillé sur un projet et je ne savais pas comment utiliser le pilote de stockage Docker pendant cette période, j'ai donc cherché des informations en ligne et je l'ai résolu. Je vais l'enregistrer ici.
But
Docker est un moteur de conteneur d'application open source qui utilise principalement l'espace de noms du noyau Linux pour atteindre l'isolement de sable et utilise le CGROUP pour atteindre la limitation des ressources. Docker est un conteneur Linux léger utilisé pour le développement et le déploiement unifiés, en essayant de résoudre le problème de la "dépendance de l'enfer", en combinant des services et des composants dépendants, similaires aux conteneurs utilisés par les navires et en réalisant une installation et un déploiement rapides.
1. L'architecture de base de Docker - Client et démon
Comprenons d'abord l'architecture de base et le processus de démarrage de Docker. En fait, Docker adopte une architecture C / S, y compris le client et le serveur. Docker Daemon accepte les demandes des clients en tant que serveur et traite ces demandes (créer, exécuter, soumettre des conteneurs). Le client et le serveur communiquent sur la même machine via l'API RESTFul. Dans le processus d'utilisation spécifique, après avoir exécuté le service de service Docker, le processus Docker Deamon Daemon est généré sur l'hôte, exécuté en arrière-plan et attendez des messages du client (c'est-à-dire des commandes Docker d'entrée, telles que Docker Pull xxx, docker run…, docker eng xxx) pour réaliser l'interaction avec Docker Deamon. Après avoir commencé le service Docker, vous pouvez voir le processus Docker.
Défaut
[root @ localhost ~] # PS -AUX | Grep Dockerroot 11701 0,0 0,4 359208 16624? SSL 21:05 0:00 / USR / bin / docker -d -h fd: // - Selinux-Soulable --Insecure-Registry 186.100.8.216:5000root 11861 0.0 0.0 113004 2256 PTS / 0 S + 23:01 0:00 Grep -Color = Auto Docker
Ceci est principalement dû au fait que lorsque vous spécifiez le système de fichiers ultérieurement, vous devez configurer le pilote de stockage spécifique dans / etc / sysconfig / docker (cela écrira un blog spécial), puis démarrer Docker Daemon, et ne peut pas fonctionner via les paramètres de la commande RUN. Vous pouvez également le définir directement à partir de la ligne de commande hôte via Docker d.
2. Méthode de stockage Docker - Pilote de stockage
La partie centrale du modèle Docker est d'utiliser efficacement le mécanisme de miroir hiérarchique. Le miroir peut être hérité de la hiérarchie. Sur la base de l'image de base (sans l'image parent), diverses images d'application spécifiques peuvent être faites. Différents conteneurs Docker peuvent partager certaines couches de système de fichiers de base et, en même temps, couplés à leurs propres couches de changement uniques, améliorant considérablement l'efficacité de stockage. Le mécanisme principal est de modèle hiérarchique et de monter différents répertoires avec le même système de fichiers virtuel (unir plusieurs répertoires en un seul système de fichiers virtuel, à partir de cet article). Plusieurs pilotes de stockage différents sont utilisés pour Mirror Storage Docker, notamment: AUFS, DeviceMapper, BTRFS et superposition (sur le site officiel). Ce qui suit est une brève introduction aux différents pilotes de stockage.
AUFS
AUFS (AnotherUnionfs) est un système de fichiers conjoint. AUFS prend en charge la définition des autorisations ReadOnly, ReadWrite et Whiteoutable pour chaque répertoire membre (similaire à GIT). Dans le même temps, il existe un concept similaire dans AUFS, où les branches avec des autorisations en lecture seule peuvent être modifiées logiquement progressivement (n'étant pas affecté la partie en lecture seule). Le seul pilote de stockage d'AUFS peut réaliser le partage de bibliothèques d'exécution exécutables et partageables entre les conteneurs, donc lorsque vous exécutez des centaines de temps d'exécution avec le même code de programme ou les mêmes bibliothèques d'exécution, AUFS est un très bon choix.
Mappeur de dispositif
Le mappeur de l'appareil est un mécanisme de cadre de cartographie des appareils logiques aux dispositifs physiques fournis dans le noyau Linux 2.6. Dans le cadre de ce mécanisme, les utilisateurs peuvent facilement formuler des stratégies de gestion pour la mise en œuvre des ressources de stockage en fonction de leurs besoins (voir les détails). Le pilote de mappeur de périphérique créera un fichier simple 100 g contenant vos images et conteneurs, chaque conteneur est limité à un volume de taille 10g (Remarque: Il s'agit d'un fichier clairsemé créé automatiquement à l'aide de Loopback, en particulier des données et des métadonnées sous / var / lib / docker / devicemapper / DeviceMeper, qui peuvent être étendues dynamiquement). Vous pouvez ajuster la taille du conteneur Docker, pour une référence spécifique) Vous pouvez utiliser le paramètre -s pour spécifier le pilote lors du démarrage du démon Docker, c'est-à-dire que vous pouvez définir le pilote de stockage Docker par Docker -D -S DeviceMapper. Fermez d'abord le service Docker et exécutez la commande:
Défaut
[root @ localhost ~] # docker -d -s deviceMapperInfo [0000] + Job Servapi (Unix: ///var/run/docker.sock) info [0000] écouter http sur unix (/var/run/docker.sock) info infit_networksworwe (0) Info [0000] Chargement des conteneurs: Démarrez. .... Info [0000] Chargement des conteneurs: fait. Info [0000] Docker Daemon: 1.4.0 4595d4f / 1.4.0; execdriver: natif-0.2; GraphDriver: DeviceMapper info [0000] + Job AcceptConnections () info [0000] -Job AcceptConnections () = OK (0)
De plus, Docker peut spécifier le paramètre de stockage-opt lors du démarrage du conteneur, mais maintenant seul DeviceMapper peut accepter les paramètres de paramètres. Il y aura des affichages de blog ciblés plus tard.
Btrfs
Le pilote BTRFS peut être très efficace dans Docker Build. Cependant, comme DeviceMapper, il ne prend pas en charge le stockage partagé entre les appareils (participer au site officiel). BTRFS prend en charge les instantanés et les clones, et peut également gérer facilement plusieurs appareils physiques. (Pour plus de détails, veuillez consulter l'introduction d'IBM à BTRFS)
recouvrir
La superposition est très similaire à l'AUFS, mais ses performances sont meilleures que les AUF et ont une bonne utilisation de la mémoire. Il a maintenant été fusionné dans le noyau Linux 3.18. Commande d'utilisation spécifique: superposition docker ds
Remarque sur le site officiel: il n'est actuellement pas pris en charge sur BTRFS ou toute copie sur le système de fichiers d'écriture et ne doit être utilisé que sur les partitions EXT4.
3 Structure du répertoire Docker
Les deux concepts les plus importants de Docker sont les miroirs et les conteneurs. Alors, où l'image que nous tirons est stockée? Une fois le conteneur de run miroir démarré, où le contenu de notre opération est-il modifié? Parce que les moteurs spécifiques sont différents, l'effet de mise en œuvre finale est différent. Analyons la structure de stockage de Docker à l'aide du pilote de stockage de mappeur de périphérique à titre d'exemple.
1. Entrez le répertoire / var / lib / docker et répertoriez le contenu:
Défaut
[root @ localhost ~] # cd / var / lib / docker / [root @ localhost docker] # lSContainers DeviceMapper execdriver graph init linkgraph.db RepoSitories-DeviceMapper tmp fiducies volumes
Selon le contenu du répertoire, il est évident que le pilote DeviceMapper est utilisé.
Remarque: Les dossiers indiqués ci-dessous sont tous sous / var / lib / docker.
2. Quel dossier tire un fichier image? (reportez-vous à)
Les informations d'image de Pull sont enregistrées dans le dossier du graphique, et le contenu de l'image existe sous DeviceMapper / DeviceMapper / Data.
3. Où fonctionne le conteneur démarré?
Les informations de configuration des conteneurs démarrées sont enregistrées dans les conteneurs et l'exécutif / natif / est également affiché.
Le contenu de l'opération dans le conteneur est enregistré sous DeviceMapper / DeviceMapper / Data.
4. Le rôle du graphique
Dans l'architecture Docker, il joue le gardien de l'image de conteneur téléchargé et l'enregistreur de la relation entre l'image de conteneur téléchargé. Dans le répertoire local du graphique, les informations spécifiques stockées pour chaque image de conteneur sont: les métadonnées (JSON) de l'image du conteneur, la taille de la couche (couche) de l'image de conteneur et les rootfs spécifiques représentés par l'image de conteneur.
5. Test expérimental:
- Initialement, aucun conteneur n'est activé:
Défaut
[root @ localhost docker] # ll CONTUSTEURS / TOTAL 0
- Démarrez un conteneur:
Défaut
[root @ localhost docker] # docker run -i -t --rm centos: 7 / bin / bash [root @ 187a8f9d2865 /] #
L'UUID du conteneur démarré = 187A8F9D2865
- Avant de démarrer le conteneur, vérifiez la taille réelle du fichier sous / var / lib / docker / devicemapper / deviceMapper /
Défaut
[root @ bhdocker216 docker] # du -h DeviceMapper / DeviceMapper / * 2.1g DeviceMapper / DeviceMapper / Data3.5m DeviceMapper / DeviceMapper / Metadata
- Voir sur l'hôte
Défaut
[root @ bhdocker216 docker] # ls conteneurs / 187a8f9d2865c2ac *** 91b981
Vérifiez le contenu du conteneur démarré sous le dossier UUID:
Défaut
[root @ bhdocker216 conteneurs] # ll 187a8f9d2865c2ac *** 91b981total 24-rw -----. 1 racine racine 273 mars 5 23:59 187a8f9d2865 *** - json.log-rw-r--. 1 racine racine 1683 mars 5 23:58 config.json-rw-r--. 1 racine racine 334 mars 5 23:58 hostconfig.json-rw-r--. 1 racine racine 13 mars 5 23:58 Hostname-rw-r--. 1 racine racine 174 mars 5 23:58 hôtes-rw-r--. 1 racine racine 69 mars 5 23:58 Resolv.conf- Ajouter un fichier dans le conteneur de démarrage et afficher.
Créez d'abord un fichier dans le conteneur en cours d'exécution:
Défaut
[Root @ 8a1e3ad05d9e /] # dd if = / dev / zero of = flopppy.img bs = 512 count = 57605760 + 0 enregistre in5760 + 0 enregistre Out2949120 octets (2,9 Mb) copié, 0,0126794 S, 233 MB / S
Affichez ensuite le fichier sous / var / lib / docker / deviceMapper / DeviceMapper /:
Défaut
[root @ bhdocker216 docker] # Du -h DeviceMapper / DeviceMapper / * 5.5g DeviceMapper / DeviceMapper / Data4.6m DeviceMapper / DeviceMapper / Metadata
La taille de cet endroit est un peu différente car j'ai d'abord exécuté #dd if = / dev / zero de = test.txt bs = 1m count = 8000 pour créer un fichier de taille 8g. Je l'ai terminé car c'était trop lent, mais je peux clairement voir que les deux dossiers ont changé (ajouté) lorsqu'ils fonctionnent dans le conteneur en cours d'exécution.
- Vérifiez le graphique. Lorsqu'une seule image (Ubuntu14.10) est tirée, 7 répertoires nommés Long Uuid apparaissent. Comment cela est-il arrivé?
Utilisez Docker Images Tree pour répertorier la structure de l'arborescence du miroir, et nous pouvons voir la structure de stockage hiérarchique du miroir. L'Ubuntu final (couche 7) est basé sur les modifications de la couche 6, c'est-à-dire que la couche n-th de cet arbre logique est basée sur les changements N-1, et la couche N dépend de l'image N-1. La 0e couche, la taille est 0, est appelée image de base.
- Quel est le contenu du répertoire graphique / uuid?
Défaut
[root @ localhost graph] # ll 01bf15a18638145eb *** -htotal 8.0k-rw -----. 1 racine racine 1,6k 5 mars 18:02 JSON-RW -----. 1 racine racine 9 mars 5 18:02 couchersize
Voir le contenu de la couche: la taille de la couche de représentation numérique (unité: b). JOSN: Enregistrez les métadonnées de cette image (telles que: taille, architecture, config, conteneur, ** UUID des parents **, etc.).
- Voir le dossier DeviceMapper / DeviceMapper
Il y a deux dossiers, données et métadonnées. En fait, le pilote de mappeur de périphérique stocke les fichiers miroir et conteneur dans le fichier ** data **. Vous pouvez afficher la taille des données et des métadonnées via les informations Docker. De plus, vous pouvez utiliser du h (utilisé ci-dessus) pour afficher les tailles réelles de ces deux fichiers clairsemés.
- ExecDriver
Défaut
[root @ bhdocker216 docker] # ls execdriver / natif / 8a1e3ad05d9e66a455e683a2c *** 2437bdcccdfdfa // Voir le contenu à l'intérieur: [root @ bhdocker216 8a1e3ad05d9e66a455e ***]
- Volumes
Les volumes sans le paramètre -v sont vides. Après les tests, si le conteneur est démarré, ajoutez le paramètre -v, un UUID sera affiché dans le dossier Volumes. Une recherche globale sera effectuée sur l'hôte et trouvée uniquement sous des volumes. Cela n'a rien à voir avec l'image et l'UUID du conteneur.
Défaut
[root @ bhdocker216 docker] # find / -Name 86eb77f9f5e25676f100 *** d5a / var / lib / docker / volumes / 86eb77f9f5e25676f100 *** d5a // 86EB77F9F5E25676F100 *** d5aconfig.json [root @ bhdocker216 Volumes] # Cat 86EB77F9F5E25676F100 *** D5A /config.json {"Id": "86eb77f9f5e25676f100a89ba727bc15185303236aae0dcf4c172223e37651d5a", "path": "/ home / data", "isbindmount": true, "Writable": true} Description du tableau de la fonction du dossier
Faites un résumé, organisez une table et expliquez les fonctions de différents dossiers sous / var / lib / docker:
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!