Como analisar o uso do disco de um contêiner do Docker

258

Percebo que o Docker ocupa 12 GB do meu sistema de arquivos:

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

Mas, como sei como isso é distribuído pelos contêineres?

Tentei conectar-me aos contêineres executando (o novo comando v1.3)

docker exec -it <container_name> bash

e, em seguida, executando 'df -h' para analisar o uso do disco. Parece estar funcionando, mas não com contêineres que usam 'volumes de'.

Por exemplo, eu uso um contêiner somente de dados para o MongoDB, chamado 'mongo-data'.

Quando executo docker run -it --volumes-from mongo-data busyboxe, em seguida, df -hdentro do contêiner, ele diz que o sistema de arquivos montado /data/db(contêiner somente de dados 'mongo-data') usa 11.3G, mas quando o faço du -h /data/db, diz que usa apenas 2.1G.

Então, como analiso o uso de um contêiner / disco em volume? Ou, no meu caso, como descubro o tamanho do contêiner 'mongo-data'?

AlonL
fonte
Se você deseja reduzir o tamanho das imagens em várias camadas, posso recomendar o docker-squashutilitário Jason Wilder . Obtenha-o no GitHub aqui: github.com/jwilder/docker-squash
mhvelplund 18/16
No Mac OS X, há uma questão em aberto "não Docker não liberar espaço em disco ...": github.com/docker/for-mac/issues/371
asmaier

Respostas:

461

Para ver o tamanho do arquivo de seus contêineres, você pode usar o --sizeargumento de docker ps:

docker ps --size
Maxime
fonte
25
Observe que o docker ps --size pode demorar alguns minutos para ser concluído e produzirá IO pesada no host: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Sergei Rodionov
5
Notei também que a execução docker ps -snão leva em consideração os logs mantidos dentro de / var / lib / docker /.
Demee
17
Ela gera dois valores, assim: 27.2MB (virtual 173MB)qual é a diferença entre eles?
Mohammed Noureldin 6/08/19
11
@MohammedNoureldin Aqui está uma explicação: github.com/docker/docker.github.io/issues/…
aleclarson
4
Observe que isso não funciona no Docker para Windows - apenas informa 0 para tudo.
Mike Christensen
303

Após a versão 1.13.0, o Docker inclui um novo comando docker system dfpara mostrar o uso do disco do 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 informações mais detalhadas sobre o uso do espaço:

$ docker system df --verbose
Hemerson Varela
fonte
Um comando útil se você tiver muitos componentes:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq
o que significa a coluna SIZE do contêiner? Eu tenho alguns contêineres desativados e este comando mostra SIZE = 100MB, por exemplo.
danilo
TAMANHO = 100 MB para o contêiner desativado
danilo
31

Postando isso como resposta, porque meus comentários acima foram ocultados:

Liste o tamanho de um contêiner:

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

Liste os tamanhos dos volumes de um contêiner:

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

Editar: lista todos os tamanhos e volumes de contêineres em execução:

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: Altere 'devicemapper' de acordo com o sistema de arquivos do Docker (por exemplo, 'aufs')

AlonL
fonte
8
"du -d 2" não funciona no meu sistema Centos, eu tive que usar "du --max-depth 2".
dr-jan
2
No Mac, mostra /var/lib/docker/devicemapper: No such file or directory. Alguma idéia de onde o devicemapper está armazenado no mac?
Markus15
Markus: se você estiver usando o boot2docker, precisará executar o ducomando na VM do host do boot2docker. O comando também pode falhar se você estiver usando, em aufsvez do mapeador de dispositivos.
James
que tal 'docker ps -q' para listar os hashes dos contêineres em vez do awk / tail?
Andrew Wolfe
O tamanho do contêiner está sempre em branco na minha instalação do Ubuntu 14.04 / Docker 1.10.2.
Mhvelplund 18/05/19
22

A parte do volume não funcionou mais, por isso, se alguém estiver interessado, basta alterar um pouco o script acima:

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
fonte
Mount Points! = Volumes
derFunk
O Mac Docker 1.12.1 coloca os arquivos de imagem em ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs. Os nomes de arquivo para os quais não contêm o .Id ou o .Name :-(
paul_h
10

(essa resposta não é útil, mas deixe aqui, já que alguns dos comentários podem ser)

docker imagesmostrará o 'tamanho virtual', ou seja, quanto total, incluindo todas as camadas inferiores. Portanto, faça uma contagem dupla se você tiver contêineres que compartilhem a mesma imagem base.

documentação

Bryan
fonte
3
Não estou falando das imagens, mas dos contêineres (a lista mostrada executando 'docker ps').
AlonL
1
Recipientes são como processos; eles não têm espaço em disco.
Bryan
2
"O comando docker run primeiro cria uma camada de contêiner gravável sobre a imagem especificada ..." ( docs.docker.com/v1.1/reference/commandline/cli ) Essa camada é o que quero dizer ou quaisquer outros volumes montados para o contêiner via 'volumes de', etc.
AlonL 5/11
1
Talvez essa ferramenta ajude? github.com/cpuguy83/docker-volumes Referenciado em container42.com/2014/11/03/docker-indepth-volumes
Bryan
1
Obrigado, não satisfaz as minhas necessidades, mas é uma boa ferramenta.
AlonL
10

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

  1. Utilização do CPU,
  2. Uso de mem / mem total alocado para o contêiner (pode ser alocado com o comando docker run)
  3. Mem%
  4. E / S de bloco
  5. E / S líquida
Abhishek Jain
fonte
8

Você pode usar

docker history IMAGE_ID

para ver como o tamanho da imagem é distribuído entre seus vários subcomponentes.

eiTan LaVi
fonte
4

Lembre-se de que docker ps --sizepode ser um comando caro, levando mais de alguns minutos para ser concluído. O mesmo se aplica às solicitações de API da lista de contêineres size=1. É melhor não executá-lo com muita frequência.

Veja as alternativas que compilamos, incluindo a du -hsopção para o diretório de volume persistente do docker.

Sergei Rodionov
fonte
Não é o caso no meu servidor - é executado em milissegundos. YMMV ressalva ao acima (teste, como diz Sergei "... pode ...")
Todd Curry
Eu também estou testando, ainda é aceitável usando janela de encaixe ps --size
andikurnia
3

Melhorando a resposta de Maxime:

docker ps --size

Você verá algo assim:

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

Ao iniciar um contêiner, a imagem da qual o contêiner é iniciado é montada somente leitura (virtual) .
Além disso, é montada uma camada gravável, na qual as alterações feitas no contêiner são gravadas.

Portanto, o tamanho Virtual (183 MB no exemplo) é usado apenas uma vez, independentemente de quantos contêineres são iniciados a partir da mesma imagem - posso iniciar um contêiner ou mil; nenhum espaço em disco extra é usado .
O "Tamanho" (2B no exemplo) é único por contêiner, portanto, o espaço total usado no disco é:

183MB + 5B + 2B

Esteja ciente de que o tamanho mostrado não inclui todo o espaço em disco usado para um contêiner.
Coisas que não estão incluídas atualmente são;
- volumes
- troca
- pontos de verificação
- espaço em disco usado para arquivos de log gerados pelo contêiner

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

danilo
fonte