>> Aprentação e considerações

Hoje é dia de maldade…hehe!!!

Nessa sessão vamos brincar com alguns comandos DESTRUTIVOS do Docker, repetindo, são comandos DESTRUTIVOS, muito cuidado na sua utilização (depois não diga que não avisei…hehe)

Confira também os nossos posts anteriores da sequência Docker:
P01 – Instalação no Linux, e nosso primeiro container “hello-wolrd”!
P02 – Brincando com imagem centos e subindo um container NGINX

Pois bem, vamos ver comandos do Docker que nos ajudará a “Limpar a casa” e além disso vamos ver os comandos do Docker para remover TODOS os recursos por ele utilizados para talvez “começar do zero”.

Lets’go!

>> Docker system

Nas versões mais novas do Docker, mais precisamente à partir da versão 1.13, foi adicionado um novo subcomando simplesmente sensacional que é o “system”

Nesse tutorial vamos nos atentar a 2: df e prune

~# docker system --help

Usage:	docker system COMMAND

Manage Docker

Options:
      --help   Print usage

Commands:
  df          Show docker disk usage
  events      Get real time events from the server
  info        Display system-wide information
  prune       Remove unused data

Run 'docker system COMMAND --help' for more information on a command.

Onde:

df – Utilização de disco
events – Obtém eventos em tempo real
info – Exibe informações detalhadas do sistema
prune – Remove dados não utilizados

Até então não tínhamos como saber de forma simples o quanto de recursos de disco por exemplo o nosso docker daemon estava consumindo em nosso docker host tornando um pouco difícil essa manutenção.

Pois bem, o primeiro comando que vamos conhecer irá exibir de forma sumarizada o quanto o docker está consumindo no disco do nosso host, o “docker system df”

~# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              20                  8                   5.221GB             1.87GB (35%)
Containers          9                   1                   442.4MB             47.12MB (10%)
Local Volumes       15                  15                  848.9MB             0B (0%)

Como podemos ver com esse comando já sabemos a quantidade de “imagens”, “containers” e “volumes” que temos no TOTAL, ATIVOS e o TAMANHO em disco que está sendo utilizado de forma geral.

O comando abaixo exibe MUITAS informações e de forma detalhada exibindo o que exatamente cada recurso está consumindo do disco

~# docker system df -v

(Obs.: Não vou mostrar a saída…hehe…é MUITO GRANDE…rs)

>> docker “prune”

O “prune” tem por objetivo remover TODOS os recursos não utilizados, isso mesmo, tudo o que não está em uso vai pro beleléu!!! Muito cuidado com esse comando porque se existe um container que você deixa parado e eventualmente usa pra fazer algo, o prune o remove também, como bons “DevOpeiros” e Sysadmins vamos ao help:

~# docker system prune --help

Usage:	docker system prune [OPTIONS]

Remove unused data

Options:
  -a, --all             Remove all unused images not just dangling ones
      --filter filter   Provide filter values (e.g. 'until=')
  -f, --force           Do not prompt for confirmation
      --help            Print usage

Basicamente todos os subcomandos de docker tem o parâmetro -f ou –force que tem como característica padrão a remoção forçada ou no caso pular a fase da interatividade do comando.

Vamos manter a interatividade para ver o que será feito.

Logo na saída do comando temos um “WARNING”, que é um aviso falando que serão removidos todos os containers que estão parados, todas as redes, volumes e images pendentes e ao confirmarmos ele simplesmente remove os recursos exibindo o que foi removido e ao final exibe o quando de disco que foi liberado no docker host.

~# docker system prune 
WARNING! This will remove:
	- all stopped containers
	- all volumes not used by at least one container
	- all networks not used by at least one container
	- all dangling images
Are you sure you want to continue? [y/N] y
Deleted Containers:
a92052a3608fbd4e2972ba6baec47452785fb49084180230f42528b35db15319
aac9e5d0d624fa607af59d2a8e6cf737c01dec9e2acb4308548f4720435d6c48
d5b861f9038dbc7e6f29f42c2a5db426deda6561a8c7704dfd6f48731e85e210
feb0caefd1aad27abc7390f87586592ef9aea63e357370305924023298b1466c
849f2a8a4745b960001b6189b655587026e20717359c996758497dc81d8aa642
a25394fad67f6ffeebfaa570f0661baae78f8b3d18290bb935c6fa9314fb5c8c
057e0c071b886515ddd9ab51901942158f5ba65ebd2cf80e76f39eb696bdcb7d
b6decaf44c13bf324d59ecb4c687a256ae475a8324dba2547fd116da3636c01c

Deleted Volumes:
897c93b168aef06483b5bd16bb946b07f451f9736b1efc3720fe129e8739c02f
d85df8017d0b5536001b7c512d5ac0351c8d6fad4d911b26f00e8e0ec99ccb04
02be010002ad3e13e1bd9513decf6a4de3feb97134764de51b1a0abb34bf6da0
3c34732f4b65dc462e76d1c2b08cbc1bd8f3a340cfdd89419bfe1b1270ec6e51
5738d03abedb63492ab10e89b79ba378b4f7b87089acdc5767bdecd7620dfe1b
64b520004c2a44458955f18520afc43043e75eb5ca06366e8664d64747bfd824
9b4f4c1bc5c5137dff7062e7d7b1c70c9304e31b431222504f45296526640475
c8ed04aa5f5b051df3fd7a25398af941cc5f452b69477070b3e0e295b3db5a3f
ca57d2bfe6c6202402f9702d57b32c2df04787f649d76135aaf07f2ec686de78
090ffcc1851ed454cdd15f3c0c306a709db03d3016a5f3433c8b65370a768918
b8863dc30795d16a9ccfe39d4635e529df7995a5568e19318d1f8696587c425f
fe1dbf76d5a9bf1eac5cdbbc1efa782b5c6dce8980daec15313a0045ea611648
84b8804614db143e3f7a9d51c160032ed17c0171ee4c781e4012a0504050705a
93a8e9f35d956248b3dcb2e9c0c1a27a95a0ddf3bf974e4cebbce65196f6355a

Deleted Networks:
graylog_default
docker_gwbridge

Total reclaimed space: 694.2MB

O comando acima “docker system prune” já faz o trabalho de remoção para todos os recursos (pode ser que ele não funcione direito para imagens para isso use o “docker image prune -a” ).

Também podemos especificar se queremos apagar containers, imagens, volumes ou network, o que na verdade considero uma melhor opção pois muitas vezes queremos manter todos os nossos containers, volumes e rede, e apagar somente as imagens, ou enfim, da forma que você desejar, abaixo estou exibindo somente o help de cada um dos comandos para que você possa executá-los e testá-los de acordo com a necessidade

~# docker container prune --help

Usage:	docker container prune [OPTIONS]

Remove all stopped containers

Options:
      --filter filter   Provide filter values (e.g. 'until=')
  -f, --force           Do not prompt for confirmation
      --help            Print usage
~# docker image prune --help

Usage:	docker image prune [OPTIONS]

Remove unused images

Options:
  -a, --all             Remove all unused images, not just dangling ones
      --filter filter   Provide filter values (e.g. 'until=')
  -f, --force           Do not prompt for confirmation
      --help            Print usage
~# docker volume prune --help

Usage:	docker volume prune [OPTIONS]

Remove all unused volumes

Options:
  -f, --force   Do not prompt for confirmation
      --help    Print usage
~# docker network prune --help

Usage:	docker network prune [OPTIONS]

Remove all unused networks

Options:
      --filter filter   Provide filter values (e.g. 'until=')
  -f, --force           Do not prompt for confirmation
      --help            Print usage

>> E se eu quiser limpar o meu sistema todo? Dar um “reset” no meu docker

Agora vamos dar um “FATALITY” em tudo o que temos de Docker em nossa máquina, vamos utilizar o parâmetro “-q” que vai exibir somente o container_id para que possamos utilizar para as remoções.

Listando todos os containers, parando, e removendo

~# docker container ls -a -q
1a6150cd3237
rdglinux ~ # docker container stop $(docker container ls -a -q)
1a6150cd3237
rdglinux ~ # docker container rm -f $(docker container ls -a -q)
1a6150cd3237

Listando todos as imagens e removendo

~# docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jenkins             latest              8d383af9763f        7 weeks ago         713MB

~# docker image rm -f $(docker image ls -a)
Untagged: jenkins:latest
Untagged: jenkins@sha256:cb24eaf4968b20bf594147fcd988ec9ffa61fe8993ed0f22532ff3dba99d8bd0
Deleted: sha256:8d383af9763fe19b8494111bbe5304fe65baf09828efc8dffdb245dd19872a4d
Deleted: sha256:44a0643b1a6dbbe70e0336dc393de73882721618d68c3d50a2f3ccd0904cafe0
Deleted: sha256:461efc2527ca5191f6db5a6e7af8449914e12eeb893ebb2ee94ac11145aee9be
Deleted: sha256:d23a3533b4babba7f14e234baa7b614d2c72ec28d62657fbb1121944c05e0b2a
Deleted: sha256:b2d9ab9c05ae9b3f38bab3bc78d12b430615da2e5a058a6312c324c5e4b6e988
Deleted: sha256:94b91df210f2bad1afc4209477910ff4dfce23c26a52906484415a2d0daea19c
Deleted: sha256:10f69df742d54e50c5795229d61667181e9f5edb76fe20c4e4a8aa9c2800bf75
Deleted: sha256:b41d46cb0983293eb7c675d69ea7df138f0bd8c51c617c48131c0923b9f0a545
Deleted: sha256:7738f2b4084ec6a1ccbf48c9642c2984612fb82e3cb8ee8db53bb4a8a9199cff
Deleted: sha256:81e9c39021603f8db2075749909d71709db549fcba51a29874634b88a12362d5
Deleted: sha256:e98e2b3ea6f6daaa6a2769dad0f3441e76ac7d685f24d274fe99c891a679bd9d
Deleted: sha256:4bd2a150592384c62729feeb0844bd049a39acc9957fcc693c8813f035c835ef
Deleted: sha256:3ebb8e8f983a8a0f825fff175c72a51b46eb273209ab68d0aabd4d50c577db8e
Deleted: sha256:69819a3bf51d024ea50db3ff1421c78e8357a48f78484e9d345fa52e57606e9d
Deleted: sha256:4616c6ad44b665886f6d629d6e41ce4b2bc3092d6c6651ab0f577f5ba57413a3
Deleted: sha256:a9a1fc2e0d113f4bfdc0a8a6252a61faef8a3c6abfc58fa3e2f62ff9ec10e62e
Deleted: sha256:f41abdf99ff81bea81635ba1524904d3206050d421ae0703301dbe64189065c0
Deleted: sha256:9a7dbf133ba8f100ae855b6f1f717649c9f0348a31c814a9fe51e378c9706ad1
Deleted: sha256:a749e9b46af88e7bb0882e1ded734eed407eba28a44001bd098af5b002017f6b
Deleted: sha256:d17d48b2382adda1fd94284c51d725f0226bf20b07f4d29ce09596788bed7e8e

Listando todos os volumes, e removendo

~# docker volume ls 
DRIVER              VOLUME NAME
local               jenkins_home

~# docker volume rm -f $(docker volume ls)
DRIVER
VOLUME
NAME
local
jenkins_home

A agora para rede, NÃO recomendo fazer esse procedimento, utilize o prune mesmo, as redes exibidas abaixo são as redes “default” do Docker, nós só queremos remover os recursos que criamos, e não quebrar o funcionamento do docker

~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
62c9d77025a7        bridge              bridge              local
9f975f71542e        host                host                local
c564de61d3e4        none                null                local

>> Conclusão

LEMBRETE: MUITO CUIDADO COM ESSES COMANDOS!!!

Eles são DESTRUTIVOS caso sejam utilizamos sem a devida prudência você pode ser o próximo com o status “Buscando Recolocação”!!! …

Espero que com esse post tenha ajudado a esclarecer o que creio que seja a dúvida de muitos nessa parte de gerenciar o docker host mantendo o sistema sempre limpo.

Dúvidas, críticas e sugestões serão sempre bem vindas, poste seu comentário, curta, compartilhe e nos ajude!!! …hehe…

Valeuuuuu!!!!!

>> Referências

https://docs.docker.com/engine/reference/commandline/system/

Recomendo fortemente o vídeo do Jeferson da LinuxTips falando justamente dessa assunto: