web-dev-qa-db-fra.com

Environnement docker propre: devicemapper

J'ai un environnement de docker avec 2 conteneurs (Jenkins et Nexus, tous deux avec leur propre volume nommé). J'ai un travail quotidien qui supprime les images et les conteneurs inutilisés. Cela fonctionne bien. Mais le problème est dans mon devicemapper:

du -sh /var/lib/docker/
30G docker/

Je peux chaque dossier dans mon dossier de menu fixe: Volumes (gros, mais c'est normal dans mon cas):

/var/lib/docker# du -sh volumes/
14G volumes/

Conteneurs

/var/lib/docker# du -sh containers/
3.2M    containers/

Images:

/var/lib/docker# du -sh image/
5.8M    image/

Devicemapper:

/var/lib/docker# du -sh devicemapper/
  16G   devicemapper/

/var/lib/docker/devicemapper/mnt est de 7,3 G /var/lib/docker/devicemapper/devicemapper est 8.1G

Informations sur Docker:

Storage Driver: devicemapper
 Pool Name: docker-202:1-xxx-pool
 Pool Blocksize: 65.54 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: ext4
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 5.377 GB
 Data Space Total: 107.4 GB
 Data Space Available: 28.8 GB
 Metadata Space Used: 6.148 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.141 GB
 Udev Sync Supported: true

Quel est cet espace et suis-je capable de le nettoyer sans casser des choses?

35
DenCowboy

N'utilisez pas de fichier de boucle devicemapper pour des problèmes graves ! Docker a de grands avertissements à ce sujet.

Le répertoire /var/lib/docker/devicemapper/devicemapper Contient les fichiers de boucle fragmentés contenant toutes les données montées par le menu fixe. Donc, vous auriez besoin d’utiliser des outils de LVM pour les explorer et faire des choses. Ayez une lecture bien les problèmes de suppression avec devicemapper , ils sont en quelque sorte résolus mais peut-être pas.

Si possible, je m'éloignerais de devicemapper ou utiliserais les LVM Thin Pool sur tout ce qui est basé sur RHEL. Si vous ne pouvez pas modifier les pilotes de stockage, la même procédure effacera au moins tout espace clairsemé alloué que vous ne pourrez pas récupérer.

Changer le pilote de stockage de docker

Le changement de pilote de stockage nécessitera de vider vos répertoires /var/lib/docker Qui contiennent toutes vos données de menu fixe. Il existe des moyens d’économiser des portions, mais cela implique de jouer avec les internes de Docker. Il est préférable d’engager et d’exporter tous les conteneurs ou volumes que vous souhaitez conserver et de les importer après le changement. Sinon, vous aurez une nouvelle installation vierge de Docker!

  1. Exporter des données

  2. Arrêtez Docker

  3. Supprimer /var/lib/docker

  4. Modifiez le démarrage de votre menu fixe pour utiliser le nouveau pilote de stockage. Définissez --storage-driver=<name> Dans /lib/systemd/system/docker.service Ou /etc/systemd/system/docker.service Ou /etc/default/docker Ou /etc/sysconfig/docker

  5. Démarrer Docker

  6. Importer des données

[~ # ~] aufs [~ # ~]

AUFS n'est pas dans le noyau principal (et ne le sera jamais), ce qui signifie que la distribution doit l'inclure de manière active. Pour Ubuntu, c'est dans les packages linux-image-extra.

apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

Puis changez l’option du pilote de stockage en --storage-driver=aufs

OverlayFS

OverlayFS est déjà disponible dans Ubuntu, il suffit de changer le pilote de stockage en --storage-driver=overlay2 Ou --storage-driver=overlay Si vous utilisez toujours un noyau 3.x.

Je ne sais pas à quel point c'est une bonne idée maintenant. Cela ne peut pas être pire que le fichier de boucle mais Le pilote overlay2 Est assez solide pour être utilisé par les développeurs, mais sa production n'est pas encore prête (par exemple, Docker Enterprise ne fournit pas de support), mais il est poussé à devenir le pilote standard en raison de problèmes AUFS/Kernel.

Direct LVM Thin Pool

Au lieu du fichier de boucle devicemapper, vous pouvez utiliser directement un thin pool LVM. RHEL facilite cela avec un utilitaire docker-storage-setup distribué avec leur paquet de menu fixe EPEL. Docker décrit en détail les étapes de configuration manuelle des volumes .

--storage-driver=devicemapper \
--storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \
--storage-opt dm.use_deferred_removal=true

Docker 17.06+ prend en charge la gestion pour vous des configurations de bloc simples direct-lvm.

Il suffit de ne jamais manquer d'espace dans le volume LVM. Vous vous retrouvez avec un démon Docker qui ne répond pas et qui doit être supprimé, puis des ressources LVM encore utilisées et difficiles à nettoyer.

43
Matt

Tout d'abord, qu'est-ce que devicemapper ( documentation officielle )

Device Mapper est inclus dans le noyau Linux principal depuis la version 2.6.9. C'est une partie essentielle de la famille RHEL des distributions Linux.

Le pilote devicemapper stocke chaque image et chaque conteneur sur son propre périphérique virtuel. Ces périphériques sont des périphériques d'instantané de copie sur écriture à provisioning léger.
La technologie Device Mapper fonctionne au niveau du bloc plutôt qu'au niveau du fichier. Cela signifie que les opérations de provisionnement fin et de copie sur écriture du pilote de stockage devicemapper fonctionnent avec des blocs plutôt que des fichiers entiers.

Devicemapper est le pilote de stockage Docker par défaut sur certaines distributions Linux.

Les hôtes Docker exécutant le pilote de stockage devicemapper utilisent par défaut un mode de configuration appelé loop-lvm. Ce mode utilise des fichiers fragmentés pour créer le pool dynamique utilisé par les instantanés d'image et de conteneur.

Docker 1.10 et versions ultérieures ne font plus correspondre les ID de couche d'image avec les noms de répertoire dans/var/lib/docker.
Cependant, il existe deux répertoires clés.

  • Le répertoire /var/lib/docker/devicemapper/mnt Contient les points de montage des couches image et conteneur .
  • Le répertoire/var/lib/docker/devicemapper/metadatadirectory contient un fichier pour chaque couche d'image et chaque instantané de conteneur.

Si votre docker info Indique que votre Storage Driver Est devicemapper (et non aufs), procédez avec prudence avec ces dossiers.
Voir par exemple numéro 18867 .

3
VonC

Un périodique docker system Prune -a fonctionne pour moi sur les systèmes où j'utilise devicemapper et non le LVM thinpool. Le motif que j'utilise est:

  • J'étiquette tous les conteneurs, images, etc. avec l'étiquette "protected" si je veux qu'ils soient exemptés du nettoyage
  • Je lance ensuite périodiquement docker system Prune -a --filter=label!=protected (manuellement ou sur cron avec - f )

Exemples d'étiquetage:

  • docker run --label protected ...
  • docker create --label=protected=true ...
  • Pour les images, le fichier de Dockerfile, par exemple LABEL protected=true
  • Pour ajouter une étiquette à une image existante que je ne peux pas reconstruire facilement, je crée un fichier Dockerfile avec ce qui précède, je crée une nouvelle image, puis permutez la nouvelle image pour l'ancienne (étiquette).

Général Docker documentation de l'étiquette

0
Akom

J'ai rencontré le même problème où dans mon fichier/var/lib/docker/devicemapper/devicemapper/data a atteint environ 91% du volume racine (~ 45G sur 50G). J'ai essayé de supprimer toutes les images indésirables, les volumes supprimés, rien n'a aidé à réduire ce fichier.

Est-ce que quelques-uns ont googlé et compris que les fichiers "données" étaient des fichiers fragmentés montés en boucle et que docker les utilisait pour stocker les emplacements de montage et d'autres fichiers que nous aurions stockés dans les conteneurs.

Enfin, j'ai supprimé toutes les images qui ont été exécutées avant et arrêté

docker rm $ (docker ps -aq)

La réduction du fichier devicemapper de manière significative. J'espère que cela peut vous aider.

0
Sriram Kannan