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

259

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 réparti sur les conteneurs?

J'ai essayé de m'attacher aux conteneurs en exécutant (la nouvelle commande v1.3)

docker exec -it <container_name> bash

puis exécutez «df -h» pour analyser l'utilisation du disque. Il semble fonctionner, mais pas avec des conteneurs qui utilisent des «volumes-from».

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

Lorsque je cours docker run -it --volumes-from mongo-data busybox, puis df -hà l'intérieur du conteneur, il est dit que le système de fichiers monté /data/db(mon conteneur de données 'mongo-data') utilise 11.3G, mais quand je le fais du -h /data/db, il dit qu'il n'utilise que 2.1G.

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

AlonL
la source
Si vous souhaitez réduire la taille des images à plusieurs couches, je peux recommander l' docker-squashutilitaire de Jason Wilder . Obtenez-le sur GitHub ici: github.com/jwilder/docker-squash
mhvelplund
Sur Mac OS X, il existe un problème ouvert "Docker ne libère pas d'espace disque ...": github.com/docker/for-mac/issues/371
asmaier

Réponses:

462

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

docker ps --size
Maxime
la source
25
Notez que docker ps --size peut prendre plusieurs minutes et produira de lourdes E / S sur l'hôte: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Sergei Rodionov
5
J'ai également remarqué que l'exécution docker ps -sne prend pas en compte les journaux conservés dans / var / lib / docker /.
Demee
17
Il produit deux valeurs, comme celle-ci, 27.2MB (virtual 173MB)quelle est la différence entre elles?
Mohammed Noureldin
11
@MohammedNoureldin Voici une explication: github.com/docker/docker.github.io/issues/…
aleclarson
4
Notez que cela ne fonctionne pas sur Docker pour Windows - il signale simplement 0 pour tout.
Mike Christensen
304

Après 1.13.0, Docker inclut une nouvelle commande docker system dfpour afficher l'utilisation du disque Docker .

$ 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
Hemerson Varela
la source
Une commande utile si vous avez beaucoup de composants:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq
que signifie la colonne SIZE du conteneur? J'ai des conteneurs hors tension, et cette commande affiche SIZE = 100MB par exemple.
danilo
SIZE = 100MB for the container off
danilo
31

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

Indiquez la taille d'un conteneur:

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

Énumérez 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

Modifier: répertoriez toutes les tailles et 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: modifiez «devicemapper» en fonction de votre système de fichiers Docker (par exemple, «aufs»)

AlonL
la source
8
"du -d 2" ne fonctionne pas sur mon système Centos, j'ai dû utiliser "du --max-depth 2" à la place.
dr-jan
2
Sur Mac, ça se voit /var/lib/docker/devicemapper: No such file or directory. Une idée où le devicemapper est stocké sur mac?
Markus
Markus: si vous utilisez boot2docker, vous devez exécuter la ducommande dans votre machine virtuelle hôte boot2docker. La commande peut également échouer si vous utilisez aufsau lieu du mappeur de périphériques.
James
que diriez-vous de 'docker ps -q' pour lister les hachages des conteneurs au lieu de awk / tail?
Andrew Wolfe
La taille du conteneur est toujours vide sur mon installation Ubuntu 14.04 / Docker 1.10.2.
mhvelplund
22

La partie volume ne fonctionnait plus, donc si quelqu'un est intéressé, je change juste 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
Juanito
la source
Points de montage! = Volumes
derFunk
Mac Docker 1.12.1 place les fichiers image dans ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs. Les noms de fichiers pour lesquels ne contiennent pas le .Id ou le .Name :-(
paul_h
10

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

docker imagesmontrera la «taille virtuelle», c'est-à-dire combien au total, y compris toutes les couches inférieures. Donc, un double comptage si vous avez des conteneurs qui partagent la même image de base.

Documentation

Bryan
la source
3
Je ne parle pas des images, mais des conteneurs (la liste affichée en exécutant 'docker ps').
AlonL
1
Les conteneurs sont comme des processus; ils n'ont pas d'espace disque.
Bryan
2
"La commande docker run crée d'abord une couche conteneur inscriptible sur l'image spécifiée ..." ( docs.docker.com/v1.1/reference/commandline/cli ) Cette couche est ce que je veux dire, ou tout autre volume monté au conteneur via 'volumes-from', etc.
AlonL
1
Peut-être que cet outil vous aidera? github.com/cpuguy83/docker-volumes Référencé à partir de container42.com/2014/11/03/docker-indepth-volumes
Bryan
1
Merci, ça ne répond pas à mes besoins mais c'est un bel outil.
AlonL
9

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

  1. L'utilisation du processeur,
  2. Utilisation de Mem / Mem total alloué au conteneur (peut être alloué avec la commande Docker Run)
  3. Mem%
  4. Bloquer les E / S
  5. E / S nettes
Abhishek Jain
la source
8

Vous pouvez utiliser

docker history IMAGE_ID

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

eiTan LaVi
la source
4

Gardez à l'esprit que cette commande docker ps --sizepeut être coûteuse et prendre plus de quelques minutes. Il en va de même pour les demandes d'API de liste de conteneurs avecsize=1 . Il vaut mieux ne pas l'exécuter trop souvent.

Jetez un œil aux alternatives que nous avons compilées, y compris l' du -hsoption pour le répertoire de volume persistant du docker.

Sergei Rodionov
la source
Pas le cas sur mon serveur - fonctionne en millisecondes. YMMV mise en garde à ce qui précède (test, comme le dit Sergei "... peut ...")
Todd Curry
Je teste également, c'est toujours acceptable en utilisant docker ps --size
andikurnia
3

Améliorer la réponse de Maxime:

docker ps --size

Vous verrez quelque chose comme ceci:

+---------------+---------------+--------------------+
| CONTAINER ID  | IMAGE         | SIZE               |
+===============+===============+====================+
| 6ca0cef8db8d  | nginx         | 2B (virtual 183MB) |
| 3ab1a4d8dc5a  | nginx         | 5B (virtual 183MB) |
+---------------+---------------+--------------------+

Lors du démarrage d'un conteneur, l'image à partir de laquelle le conteneur est démarré est montée en lecture seule (virtuelle) .
En plus de cela, une couche inscriptible est montée, dans laquelle toutes les modifications apportées au conteneur sont écrites.

Ainsi, la taille virtuelle (183 Mo dans l'exemple) n'est utilisée qu'une seule fois, quel que soit le nombre de conteneurs démarrés à partir de la même image - je peux démarrer 1 conteneur ou mille; aucun espace disque supplémentaire n'est utilisé .
La "taille" (2B dans l'exemple) est cependant unique par conteneur, donc l'espace total utilisé sur le disque est:

183 Mo + 5B + 2B

N'oubliez pas que la taille indiquée n'inclut pas tout l'espace disque utilisé pour un conteneur.
Les choses qui ne sont pas incluses actuellement sont;
- volumes
- permutation
- points de contrôle
- espace disque utilisé pour les fichiers journaux générés par le conteneur

https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362

danilo
la source