web-dev-qa-db-fra.com

Comment analyser l'utilisation du disque d'un conteneur Docker

Je peux voir que Docker prend 12 Go de mon système de fichiers:

2.7G    /var/lib/docker/vfs/dir
2.7G    /var/lib/docker/vfs
2.8G    /var/lib/docker/devicemapper/mnt
6.3G    /var/lib/docker/devicemapper/devicemapper
9.1G    /var/lib/docker/devicemapper
12G     /var/lib/docker

Mais comment puis-je savoir comment cela est distribué sur les conteneurs?

J'ai essayé de joindre les conteneurs en exécutant (la nouvelle commande v1.3)

docker exec -it <container_name> bash

puis en exécutant 'df -h' pour analyser l'utilisation du disque. Cela semble fonctionner, mais pas avec les conteneurs qui utilisent des "volumes à partir de".

Par exemple, j'utilise un conteneur de données uniquement pour MongoDB, appelé "mongo-data".

Quand je lance docker run -it --volumes-from mongo-data busybox, puis df -h à l'intérieur du conteneur, le système de fichiers monté sur /data/db (mon conteneur de données uniquement "mongo-data") utilise 11.3G, mais quand Je fais du -h /data/db, il dit qu'il utilise seulement 2.1G.

Alors, comment analyser l'utilisation d'un disque conteneur/volume? Ou, dans mon cas, comment puis-je connaître la taille du conteneur 'mongo-data'?

209
AlonL

Pour voir la taille de fichier de vos conteneurs, vous pouvez utiliser l'argument --size de docker ps:

docker ps --size
394
Maxime

Après 1.13.0, Docker inclut une nouvelle commande docker system df pour afficher l’utilisation du disque de menu fixe.

$ docker system df
TYPE            TOTAL        ACTIVE     SIZE        RECLAIMABLE
Images          5            1          2.777 GB    2.647 GB (95%)
Containers      1            1          0 B         0B
Local Volumes   4            1          3.207 GB    2.261 (70%)

Pour afficher des informations plus détaillées sur l'utilisation de l'espace:

$ docker system df --verbose
238
Hemerson Varela

Poster ceci comme une réponse parce que mes commentaires ci-dessus sont cachés:

Lister la taille d'un conteneur:

du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" <container_name>`

Répertoriez les tailles des volumes d'un conteneur:

docker inspect -f "{{.Volumes}}" <container_name> | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs Sudo du -d 1 -h

Édition: Répertoriez toutes les tailles et tous les volumes des conteneurs en cours d'exécution:

for d in `docker ps -q`; do
    d_name=`docker inspect -f {{.Name}} $d`
    echo "========================================================="
    echo "$d_name ($d) container size:"
    Sudo du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" $d`
    echo "$d_name ($d) volumes:"
    docker inspect -f "{{.Volumes}}" $d | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs Sudo du -d 1 -h
done

REMARQUE: changez 'devicemapper' en fonction de votre système de fichiers Docker (par exemple, 'aufs')

30
AlonL

La partie volume ne fonctionnant plus, si quelqu'un est intéressé, je modifie un peu le script ci-dessus:

for d in `docker ps | awk '{print $1}' | tail -n +2`; do
    d_name=`docker inspect -f {{.Name}} $d`
    echo "========================================================="
    echo "$d_name ($d) container size:"
    Sudo du -d 2 -h /var/lib/docker/aufs | grep `docker inspect -f "{{.Id}}" $d`
    echo "$d_name ($d) volumes:"
    for mount in `docker inspect -f "{{range .Mounts}} {{.Source}}:{{.Destination}}                                                                                                                                                      
    {{end}}" $d`; do
        size=`echo $mount | cut -d':' -f1 | Sudo xargs du -d 0 -h`
        mnt=`echo $mount | cut -d':' -f2`
        echo "$size mounted on $mnt"
    done
done
22
Juanito

(cette réponse n'est pas utile, mais laissez-la ici car certains commentaires peuvent l'être)

docker images affichera la "taille virtuelle", c'est-à-dire combien au total, y compris toutes les couches inférieures. Il y a donc une double comptabilisation si vous avez des conteneurs qui partagent la même image de base.

documentation

10
Bryan

J'utilise docker stats $(docker ps --format={{.Names}}) --no-stream pour obtenir:

  1. L'utilisation du processeur,
  2. Utilisation de la mémoire/Total de la mémoire allouée au conteneur (peut être allouée avec la commande d'exécution du menu fixe)
  3. Mem%
  4. Bloquer I/O
  5. Net I/O
6
Abhishek Jain

Vous pouvez utiliser

docker history IMAGE_ID

pour voir comment la taille de l'image est répartie entre ses différents sous-composants.

6
eiTan LaVi

Si vous souhaitez réduire la taille des images comportant plusieurs couches, je peux vous recommander l'utilitaire docker-squash de Jason Wilder. Obtenez-le de GitHub ici: https://github.com/jwilder/docker-squash

4
mhvelplund

Gardez à l'esprit que docker ps --size peut être une commande coûteuse, nécessitant plus de quelques minutes. Il en va de même pour les demandes d'API de liste de conteneurs avec size=1. Il vaut mieux ne pas l'exécuter trop souvent.

Jetez un oeil à alternatives nous avons compilé, y compris l'option du -hs pour le répertoire de volumes persistants du menu fixe.

3
Sergei Rodionov