Cómo analizar el uso del disco de un contenedor Docker

258

Puedo ver que Docker toma 12 GB de mi sistema de archivos:

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

Pero, ¿cómo sé cómo se distribuye esto en los contenedores?

Traté de conectar a los contenedores ejecutando (el nuevo comando v1.3)

docker exec -it <container_name> bash

y luego ejecuta 'df -h' para analizar el uso del disco. Parece estar funcionando, pero no con contenedores que usan 'volume-from'.

Por ejemplo, uso un contenedor de solo datos para MongoDB, llamado 'mongo-data'.

Cuando ejecuto docker run -it --volumes-from mongo-data busybox, y luego df -hdentro del contenedor, dice que el sistema de archivos montado en /data/db(mi contenedor de datos 'mongo-data') usa 11.3G, pero cuando lo hago du -h /data/db, dice que usa solo 2.1G.

Entonces, ¿cómo analizo el uso de un contenedor / volumen de disco? O, en mi caso, ¿cómo puedo averiguar el tamaño del contenedor 'mongo-data'?

AlonL
fuente
Si desea reducir el tamaño de las imágenes de muchas capas, puedo recomendar la docker-squashutilidad de Jason Wilder . Consíguelo en GitHub aquí: github.com/jwilder/docker-squash
mhvelplund
En Mac OS X hay un problema abierto "Docker no libera espacio en disco ...": github.com/docker/for-mac/issues/371
asmaier

Respuestas:

461

Para ver el tamaño del archivo de sus contenedores, puede usar el --sizeargumento de docker ps:

docker ps --size
Maxime
fuente
25
Tenga en cuenta que docker ps --size puede tardar varios minutos en completarse y producirá E / S pesadas en el host: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Sergei Rodionov
55
También noté que la ejecución docker ps -sno tiene en cuenta los registros guardados dentro de / var / lib / docker /.
Demee
17
Produce dos valores, como este, 27.2MB (virtual 173MB)¿cuál es la diferencia entre ellos?
Mohammed Noureldin
11
@MohammedNoureldin Aquí hay una explicación: github.com/docker/docker.github.io/issues/…
aleclarson
44
Tenga en cuenta que esto no funciona en Docker para Windows, solo informa 0 para todo.
Mike Christensen el
303

Después de 1.13.0, Docker incluye un nuevo comando docker system dfpara mostrar el uso 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%)

Para mostrar información más detallada sobre el uso del espacio:

$ docker system df --verbose
Hemerson Varela
fuente
Un comando útil si tiene muchos componentes:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq
¿Qué significa la columna TAMAÑO del contenedor? Tengo algunos contenedores apagados, y este comando muestra SIZE = 100MB por ejemplo.
Danilo
TAMAÑO = 100MB para el contenedor apagado
danilo
31

Publicando esto como respuesta porque mis comentarios anteriores se ocultaron:

Liste el tamaño de un contenedor:

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

Liste los tamaños de los volúmenes de un contenedor:

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

Editar: enumere todos los tamaños y volúmenes de contenedores en ejecución:

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: Cambie 'devicemapper' de acuerdo con su sistema de archivos Docker (por ejemplo, 'aufs')

AlonL
fuente
8
"du -d 2" no funciona en mi sistema Centos, en su lugar tuve que usar "du --max-depth 2".
dr-ene
2
En Mac se nota /var/lib/docker/devicemapper: No such file or directory. ¿Alguna idea de dónde está guardado el dispositivo en Mac?
Markus
Markus: si está usando boot2docker, debe ejecutar el ducomando dentro de su máquina virtual host host boot2docker. El comando también puede fallar si está utilizando el aufsmapeador de dispositivos.
James
¿Qué tal 'docker ps -q' para enumerar los hashes de los contenedores en lugar de awk / tail?
Andrew Wolfe
El tamaño del contenedor siempre está en blanco en mi instalación de Ubuntu 14.04 / Docker 1.10.2.
mhvelplund
22

La parte del volumen ya no funcionaba, así que si alguien está interesado, solo cambio un poco el script anterior:

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
fuente
Puntos de montaje! = Volúmenes
derFunk
Mac Docker 1.12.1 coloca archivos de imagen en ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs. Los nombres de archivo para los que no contienen el .Id o el .Name :-(
paul_h
10

(esta respuesta no es útil, pero la dejo aquí ya que algunos de los comentarios pueden serlo)

docker imagesmostrará el "tamaño virtual", es decir, la cantidad total que incluye todas las capas inferiores. Entonces, cuente dos veces si tiene contenedores que comparten la misma imagen base.

documentación

Bryan
fuente
3
No estoy hablando de las imágenes, sino de los contenedores (la lista que se muestra ejecutando 'docker ps').
AlonL
1
Los contenedores son como procesos; No tienen espacio en disco.
Bryan
2
"El comando docker run primero crea una capa de contenedor grabable sobre la imagen especificada ..." ( docs.docker.com/v1.1/reference/commandline/cli ) Esa capa es lo que quiero decir, o cualquier otro volumen que esté montado al contenedor a través de '
volume
1
Tal vez esta herramienta ayudará? github.com/cpuguy83/docker-volumes Referenciado desde container42.com/2014/11/03/docker-indepth-volumes
Bryan
1
Gracias, no satisface mis necesidades, pero es una buena herramienta.
AlonL
9

Yo uso docker stats $(docker ps --format={{.Names}}) --no-streampara obtener:

  1. Uso de CPU,
  2. Uso de memoria / memoria total asignada al contenedor (se puede asignar con el comando Docker Run)
  3. Mem%
  4. Bloquear E / S
  5. E / S neta
Abhishek Jain
fuente
8

Puedes usar

docker history IMAGE_ID

para ver cómo se distribuye el tamaño de la imagen entre sus diversos subcomponentes.

eiTan LaVi
fuente
4

Tenga en cuenta que docker ps --sizepuede ser un comando costoso, que demora más de unos minutos en completarse. Lo mismo se aplica a las solicitudes de API de lista de contenedores con size=1. Es mejor no ejecutarlo con demasiada frecuencia.

Eche un vistazo a las alternativas que compilamos, incluida la du -hsopción para el directorio de volumen persistente de Docker.

Sergei Rodionov
fuente
No es el caso en mi servidor: se ejecuta en milisegundos. Advertencia de YMMV a lo anterior (prueba, como Sergei dice "... puede ...")
Todd Curry
También estoy probando, todavía es aceptable usar docker ps --size
andikurnia
3

Mejorando la respuesta de Maxime:

docker ps --size

Verás algo como esto:

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

Al iniciar un contenedor, la imagen desde la que se inicia el contenedor se monta de solo lectura (virtual) .
Además de eso, se monta una capa grabable, en la que se escriben los cambios realizados en el contenedor.

Por lo tanto, el tamaño virtual (183 MB en el ejemplo) se usa solo una vez, independientemente de cuántos contenedores se inicien desde la misma imagen: puedo iniciar 1 contenedor o mil; No se utiliza espacio en disco adicional .
Sin embargo, el "Tamaño" (2B en el ejemplo) es único por contenedor, por lo que el espacio total utilizado en el disco es:

183MB + 5B + 2B

Tenga en cuenta que el tamaño que se muestra no incluye todo el espacio en disco utilizado para un contenedor.
Las cosas que no están incluidas actualmente son;
- volúmenes
- intercambio
- puntos de control
- espacio en disco utilizado para archivos de registro generados por contenedor

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

danilo
fuente