So analysieren Sie die Festplattennutzung eines Docker-Containers

258

Ich kann sehen, dass Docker 12 GB meines Dateisystems benötigt:

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

Aber woher weiß ich, wie dies auf die Container verteilt ist?

Ich habe versucht, durch Ausführen (der neue Befehl v1.3) eine Verbindung zu den Containern herzustellen.

docker exec -it <container_name> bash

und dann 'df -h' ausführen, um die Festplattennutzung zu analysieren. Es scheint zu funktionieren, aber nicht mit Containern, die "Volumes-from" verwenden.

Zum Beispiel verwende ich für MongoDB einen Nur-Daten-Container namens 'Mongo-Daten'.

Wenn ich ausgeführt werde docker run -it --volumes-from mongo-data busyboxund dann df -him Container, heißt es, dass das Dateisystem, auf dem /data/db(mein Nur-Mongo-Daten-Datencontainer) gemountet ist, 11,3 G verwendet, aber wenn ich dies tue du -h /data/db, heißt es, dass es nur 2,1 G verwendet.

Wie analysiere ich die Verwendung eines Containers / Datenträgers? Oder wie finde ich in meinem Fall die Containergröße "Mongo-Daten" heraus?

AlonL
quelle
Wenn Sie die Größe von Bildern mit vielen Ebenen reduzieren möchten, kann ich das docker-squashDienstprogramm von Jason Wilder empfehlen . Erhalten Sie es von GitHub hier: github.com/jwilder/docker-squash
mhvelplund
Unter Mac OS X gibt es ein offenes Problem "Docker gibt keinen Speicherplatz frei ...": github.com/docker/for-mac/issues/371
asmaier

Antworten:

460

Um die Dateigröße Ihrer Container anzuzeigen, können Sie das folgende --sizeArgument verwenden docker ps:

docker ps --size
Maxime
quelle
25
Beachten Sie, dass Docker ps --size einige Minuten dauern kann und schwere E / A auf dem Host erzeugt: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Sergei Rodionov
5
Mir ist auch aufgefallen, dass beim Ausführen docker ps -skeine Protokolle berücksichtigt werden, die in / var / lib / docker / gespeichert sind.
Demee
17
Es gibt zwei Werte aus, wie 27.2MB (virtual 173MB)ist der Unterschied zwischen ihnen?
Mohammed Noureldin
11
@ MohammedNoureldin Hier ist eine Erklärung: github.com/docker/docker.github.io/issues/…
Aleclarson
4
Beachten Sie, dass dies unter Docker für Windows nicht funktioniert. Es wird lediglich 0 für alles gemeldet.
Mike Christensen
303

Nach 1.13.0 enthält Docker einen neuen Befehl docker system dfzum Anzeigen der Docker- Datenträgerverwendung.

$ 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%)

So zeigen Sie detailliertere Informationen zur Speicherplatznutzung an:

$ docker system df --verbose
Hemerson Varela
quelle
Ein nützlicher Befehl, wenn Sie viele Komponenten haben:docker system df --verbose > docker.stats-2019-07-18.log
Joseluisq
Was bedeutet die Spalte GRÖSSE des Containers? Ich habe einige Container ausgeschaltet, und dieser Befehl zeigt zum Beispiel SIZE = 100MB an.
Danilo
GRÖSSE = 100 MB für den Container aus
Danilo
31

Dies als Antwort posten, da meine obigen Kommentare ausgeblendet wurden:

Listen Sie die Größe eines Containers auf:

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

Listen Sie die Größen der Volumina eines Containers auf:

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

Bearbeiten: Listet alle Größen und Volumina der laufenden Container auf:

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

HINWEIS: Ändern Sie 'devicemapper' entsprechend Ihrem Docker-Dateisystem (z. B. 'aufs').

AlonL
quelle
8
"du -d 2" funktioniert auf meinem Centos-System nicht, ich musste stattdessen "du --max-depth 2" verwenden.
Dr. Jan
2
Auf dem Mac wird es angezeigt /var/lib/docker/devicemapper: No such file or directory. Irgendeine Idee, wo der Devicemapper auf einem Mac gespeichert ist?
Markus
Markus: Wenn Sie boot2docker verwenden, müssen Sie den duBefehl in Ihrer boot2docker-Host-VM ausführen. Der Befehl kann auch fehlschlagen, wenn Sie aufsanstelle von Device Mapper verwenden.
James
Wie wäre es mit 'docker ps -q', um die Hashes der Container anstelle von awk / tail aufzulisten?
Andrew Wolfe
Die Containergröße ist in meiner Ubuntu 14.04 / Docker 1.10.2-Installation immer leer.
Mhvelplund
22

Der Volume-Teil hat nicht mehr funktioniert. Wenn also jemand interessiert ist, ändere ich einfach das obige Skript ein wenig:

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
quelle
Mount Points! = Volumes
derFunk
Mac Docker 1.12.1 legt Bilddateien in ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs ab. Die Dateinamen, für die weder die .Id noch der .Name enthalten sind :-(
paul_h
10

(Diese Antwort ist nicht nützlich, aber lassen Sie sie hier, da einige der Kommentare sein können)

docker imageszeigt die 'virtuelle Größe' an, dh wie viel insgesamt einschließlich aller unteren Ebenen. Also einige Doppelzählungen, wenn Sie Container haben, die das gleiche Basis-Image haben.

Dokumentation

Bryan
quelle
3
Ich spreche nicht über die Bilder, sondern über die Container (Die Liste, die durch Ausführen von 'docker ps' angezeigt wird).
AlonL
1
Container sind wie Prozesse; Sie haben keinen Speicherplatz.
Bryan
2
"Der Docker-Befehl run erstellt zuerst eine beschreibbare Containerebene über dem angegebenen Image ..." ( docs.docker.com/v1.1/reference/commandline/cli ) Diese Ebene ist das, was ich meine, oder alle anderen bereitgestellten Volumes zum Container über 'Volumes-from' usw.
AlonL
1
Vielleicht hilft dieses Tool? github.com/cpuguy83/docker-volumes Referenziert von container42.com/2014/11/03/docker-indepth-volumes
Bryan
1
Danke, es befriedigt meine Bedürfnisse nicht, aber es ist ein schönes Werkzeug.
AlonL
10

Ich benutze docker stats $(docker ps --format={{.Names}}) --no-stream, um zu bekommen:

  1. CPU auslastung,
  2. Mem-Nutzung / Gesamtem Mem, das dem Container zugewiesen ist (kann mit dem Docker-Ausführungsbefehl zugewiesen werden)
  3. Mem%
  4. Block I / O.
  5. Netto-E / A.
Abhishek Jain
quelle
8

Sie können verwenden

docker history IMAGE_ID

um zu sehen, wie die Bildgröße auf die verschiedenen Unterkomponenten verteilt wird.

eiTan LaVi
quelle
4

Beachten Sie, dass docker ps --sizedies ein teurer Befehl sein kann, dessen Ausführung mehr als ein paar Minuten dauert. Gleiches gilt für Containerlisten-API-Anfragen mit size=1. Es ist besser, es nicht zu oft auszuführen.

Schauen Sie sich die von uns kompilierten Alternativen an , einschließlich der du -hsOption für das Docker-Verzeichnis für persistente Volumes.

Sergei Rodionov
quelle
Auf meinem Server nicht der Fall - läuft in Millisekunden. YMMV Vorbehalt zu den oben genannten (Test, wie Sergei sagt "... Mai ...")
Todd Curry
Ich teste auch, es ist immer noch akzeptabel mit Docker ps --size
andikurnia
3

Verbesserung der Antwort von Maxime:

docker ps --size

Sie werden so etwas sehen:

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

Beim Starten eines Containers wird das Image, von dem aus der Container gestartet wird, schreibgeschützt (virtuell) bereitgestellt .
Darüber hinaus wird eine beschreibbare Ebene bereitgestellt, in die alle am Container vorgenommenen Änderungen geschrieben werden.

Die virtuelle Größe (183 MB im Beispiel) wird also nur einmal verwendet, unabhängig davon, wie viele Container von demselben Image aus gestartet werden. Ich kann 1 oder tausend Container starten. Es wird kein zusätzlicher Speicherplatz verwendet .
Die "Größe" (im Beispiel 2B) ist jedoch pro Container eindeutig, sodass der gesamte auf der Festplatte verwendete Speicherplatz wie folgt ist:

183 MB + 5B + 2B

Beachten Sie, dass die angezeigte Größe nicht den gesamten für einen Container verwendeten Speicherplatz enthält.
Dinge, die derzeit nicht enthalten sind, sind:
- Volumes
- Swapping
- Checkpoints
- Speicherplatz für vom Container generierte Protokolldateien

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

Danilo
quelle