Come analizzare l'utilizzo del disco di un contenitore Docker


258

Vedo che Docker occupa 12 GB del mio filesystem:

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

Ma come faccio a sapere come viene distribuito sui contenitori?

Ho provato a collegarmi ai contenitori eseguendo (il nuovo comando v1.3)

docker exec -it <container_name> bash

e quindi eseguendo 'df -h' per analizzare l'utilizzo del disco. Sembra funzionare, ma non con contenitori che usano "volumi da".

Ad esempio, utilizzo un contenitore di soli dati per MongoDB, chiamato "mongo-data".

Quando corro docker run -it --volumes-from mongo-data busybox, e poi df -hall'interno del contenitore, Dice che il filesystem montato sul /data/dbmio contenitore di soli dati 'mongo-data' usa 11.3G, ma quando lo faccio du -h /data/db, dice che usa solo 2.1G.

Quindi, come posso analizzare l'utilizzo di un disco contenitore / volume? Oppure, nel mio caso, come posso scoprire la dimensione del contenitore 'mongo-data'?


Se vuoi ridurre le dimensioni delle immagini a più livelli, posso consigliare l' docker-squashutilità di Jason Wilder . Scarica da GitHub qui: github.com/jwilder/docker-squash
mhvelplund

Su Mac OS X c'è un problema aperto "Docker non rilascia spazio su disco ...": github.com/docker/for-mac/issues/371
asmaier,

Risposte:


461

Per visualizzare le dimensioni del file dei contenitori, è possibile utilizzare l' --sizeargomento di docker ps:

docker ps --size

25
Si noti che la finestra mobile ps - dimensione può richiedere alcuni minuti per essere completata e produrrà un forte IO sull'host: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Sergei Rodionov,

5
Ho notato anche che l'esecuzione docker ps -snon tiene conto dei registri tenuti in / var / lib / docker /.
scade il

17
Emette due valori, in questo modo 27.2MB (virtual 173MB)qual è la differenza tra loro?
Mohammed Noureldin,

11
@MohammedNoureldin Ecco una spiegazione: github.com/docker/docker.github.io/issues/…
aleclarson,

4
Nota che questo non funziona su Docker per Windows: riporta solo 0 per tutto.
Mike Christensen,

303

Dopo 1.13.0, Docker include un nuovo comando docker system dfper mostrare l'utilizzo del disco 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%)

Per mostrare informazioni più dettagliate sull'uso dello spazio:

$ docker system df --verbose

Un comando utile se hai molti componenti:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq,

cosa significa la colonna FORMATO del contenitore? Ho alcuni contenitori spenti, e questo comando mostra SIZE = 100 MB per esempio.
danilo,

DIMENSIONE = 100 MB per il contenitore spento
danilo

31

Pubblicando questo come risposta perché i miei commenti sopra sono stati nascosti:

Elencare le dimensioni di un contenitore:

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

Elencare le dimensioni dei volumi di un contenitore:

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

Modifica: elenca tutte le dimensioni e i volumi dei contenitori in esecuzione:

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

NOTA: Cambia 'devicemapper' secondo il tuo filesystem Docker (es. 'Aufs')


8
"du -d 2" non funziona sul mio sistema Centos, invece ho dovuto usare "du --max-depth 2".
dr-jan,

2
Su Mac mostra /var/lib/docker/devicemapper: No such file or directory. Qualche idea su dove sia memorizzato devicemapper su Mac?
Markus,

Markus: se si utilizza boot2docker, è necessario eseguire il ducomando all'interno della macchina virtuale host boot2docker. Il comando può anche fallire se si utilizza al aufsposto di Device Mapper.
James,

che ne dici di 'docker ps -q' per elencare gli hash dei container invece di awk / tail?
Andrew Wolfe,

La dimensione del contenitore è sempre vuota sulla mia installazione di Ubuntu 14.04 / Docker 1.10.2.
mhvelplund,

22

La parte del volume non ha più funzionato, quindi se qualcuno è interessato, cambio un po 'lo script sopra:

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

Mount Points! = Volumes
derFunk,

Mac Docker 1.12.1 inserisce i file di immagine in ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs. I nomi dei file per i quali non contengono .Id o .Name :-(
paul_h

10

(questa risposta non è utile, ma lasciandola qui poiché alcuni dei commenti potrebbero essere)

docker imagesmostrerà la 'dimensione virtuale', cioè quanto in totale includendo tutti i livelli inferiori. Quindi un doppio conteggio se si hanno contenitori che condividono la stessa immagine di base.

documentazione


3
Non sto parlando delle immagini, ma dei contenitori (l'elenco mostrato eseguendo "docker ps").
AlonL,

1
I contenitori sono come processi; non hanno spazio su disco.
Bryan,

2
"Il comando docker run crea prima un layer contenitore scrivibile sull'immagine specificata ..." ( docs.docker.com/v1.1/reference/commandline/cli ) Quel layer è ciò che intendo, o qualsiasi altro volume montato al container tramite 'volume-da', ecc.
AlonL


1
Grazie, non soddisfa le mie esigenze ma è uno strumento piacevole.
AlonL,

9

Uso docker stats $(docker ps --format={{.Names}}) --no-streamper ottenere:

  1. Uso della CPU,
  2. Utilizzo mem / Mem totale allocato al contenitore (può essere allocato con il comando Esegui finestra mobile)
  3. Mem%
  4. Blocco I / O
  5. I / O netto

8

Puoi usare

docker history IMAGE_ID

per vedere come viene distribuita la dimensione dell'immagine tra i suoi vari sottocomponenti.


4

Tieni presente che docker ps --sizepotrebbe essere un comando costoso, che richiede più di qualche minuto per il completamento. Lo stesso vale per le richieste API dell'elenco contenitori con size=1. È meglio non eseguirlo troppo spesso.

Dai un'occhiata alle alternative che abbiamo compilato, inclusa l' du -hsopzione per la directory del volume persistente della finestra mobile.


Non è il caso sul mio server: funziona in millisecondi. YMMV avvertimento di cui sopra (prova, come dice Sergei "... maggio ...")
Todd Curry

Sto anche testando, è ancora accettabile usando la finestra mobile ps
dimensione

3

Migliorare la risposta di Maxime:

docker ps --size

Vedrai qualcosa del genere:

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

Quando si avvia un contenitore, l'immagine da cui viene avviato il contenitore viene montata in sola lettura (virtuale) .
Inoltre, viene montato un livello scrivibile, in cui vengono scritte tutte le modifiche apportate al contenitore.

Quindi la dimensione virtuale (183 MB nell'esempio) viene utilizzata una sola volta, indipendentemente dal numero di contenitori avviati dalla stessa immagine: posso avviare 1 contenitore o un migliaio; non viene utilizzato spazio su disco aggiuntivo .
La "Dimensione" (2B nell'esempio) è unica per contenitore, quindi lo spazio totale utilizzato sul disco è:

183 MB + 5 B + 2 B

Tenere presente che la dimensione visualizzata non include tutto lo spazio su disco utilizzato per un contenitore.
Le cose che non sono attualmente incluse lo sono;
- volumi
- scambio
- checkpoint
- spazio su disco utilizzato per i file di registro generati dal contenitore

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.