De dev para dev: como liberei 10GB na minha máquina

De dev para dev: como liberei 10GB na minha máquina

Por Débora Fernandes

Desenvolvedores que usam Mac ou máquinas com pouco armazenamento sabem que é comum perceber que, ao usar Docker, você estará com pouco espaço.

Antes de pensar em upgrade de memória, conheça e adote hábitos de limpeza da sua stack que podem te mostrar o que você realmente usa e gerar uma economia de recursos consumidos simultaneamente.

Separei umas dicas dos hábitos que tenho adotado há pelo menos um ano e desde então nunca mais tive problemas por pouca memória.

Docker

O docker funciona sobre containers e estes sobre suas respectivas imagens.
Fazendo um paralelo com orientação à Objetos, você pode ler a frase acima entendendo que:

  • Uma imagem é "como uma Classe"
  • Cada container é "como uma instância da Classe à qual se refere"

Docker x Memória

Quando falamos de Docker x uso de memória, é importante lembrar que do mesmo jeito que os objetos e variáveis ocupam memória, assim é com os containers e imagens do Docker: só que estes, por sua natureza, ocupam muito mais memória.

Todo recurso que não está sendo usado pode e deve ser liberado, já que a orquestração do ambiente está nas instruções escritas no Dockerfile e no docker-compose, e liberando recursos, suas instruções de configuração não serão perdidas. Dentre os principais recursos que usamos do Docker, esta é a ordem de maior consumo de memória:

  • imagens
  • volumes
  • containers

Para limpar esses recursos, você deve começar pelos containers, já que as imagens e volumes só podem ser liberados se não estiverem sendo usados por alguma instância (que é um container). Por costume, eu sempre faço minha limpeza nesta ordem: containers, imagens e depois volumes.

Para gerenciamento de containers, a documentação de containers do Docker nos dá vários insights. Os comandos que mais uso são:

  • Verificar os recursos que estes containers estão consumindo: docker container stats
  • Ver todos os containers: docker container ls -a , o -a te permite ver até os containers parados
  • remover os containers que não estão em uso: docker container prune.Esse comando remove todos os containers que não estão em uso no momento, sempre faço a limpeza após confirmar que todos os containers que uso estão rodando, para não remover algo inesperado. Você pode fazer dessa forma ou aplicar um--filter=OPTIONpara remover apenas o que quiser; para isso, dê uma olhada na documentação.
Consumo de CPU, memória, banda e processos de cada container

Após remover os containers, limpo as imagens que não estão instanciadas e os volumes.

  • docker image prune , que a documentação indica que pode ser personalizado com alguns filtros
Espaço liberado após limpar imagens não utilizadas
  • docker volume prune , que a documentação indica que pode ser personalizado com alguns filtros

Uso de memória antes x depois

Antes da limpeza nos recursos do Docker
Depois da limpeza nos recursos do Docker

PLUS: se é você a pessoa que cria as imagens que seus projetos usam, além de seguir boas práticas para criar imagens pequenas, você pode verificar o tamanho de cada camada usando docker history IMAGE para facilitar a identificação de camadas que podem ter seu tamanho reduzido.

Ruby e suas versões

Quem trabalha com Ruby, em geral utiliza mais de uma versão de Ruby, e a cada versão que você adiciona, são instalados binários, aliases e alguns outros arquivos que consomem espaço local. Sempre que você deixar de usar uma versão do Ruby, é interessante remover toda essa bagagem desnecessária.

Existem alguns gerenciadores de versão do Ruby. Como gosto de usar o RVM, os comandos abaixo fazem referencia à ele, mas explico o princípio da escolha para que você possa replicar com o gerenciador que você use.

É possível desinstalar apenas o executável do Ruby e deixar outras dependências espalhadas na máquina. É isso que o rvm uninstall ruby-x.x.x remove apenas na instalação do Ruby.

Para remover completamente uma versão do Ruby de uma máquina, use um comando que remova a instalação do Ruby e também seus aliases, gemsets e quaisquer binários/demais arquivos associados.
No RVM, esse comando é rvm remove ruby-x.x.x

Após remover 2 versões do Ruby, minha memória foi liberada em mais de 5GB:

Uso de memória antes de remover versões não usadas de Ruby
Uso de memória após remover versões não usadas de Ruby

Ferramentas de análise de armazenamento

Pra quem usa VS Code, instalar a extensão VSCode Docker te ajuda a fazer muito do que fiz na linha de comando dentro do próprio Visual Studio.

Outra dica para não ter que descobrir manualmente o que está consumindo seu armazenamento, é instalar o ndcu, uma ferramenta gratuita que te ajuda a identificar onde no disco você usa mais espaço e liberá-lo.


PLUS: Outros recursos bastante usados em desenvolvimento e que também podem ser limpos de tempos em tempos são versões do Node e versões de extensões do Chrome.

NVM node version manager

No meu caso, além de ruby eu também uso node nos projetos, usando o NVM como gerenciador de versões. Sigo o mesmo principio de limpeza das versões do node, com nvm uninstall vx.x.x.
Para conferir a limpeza, é só dar um ls em ~/.nvm/versions/node

Chrome extensions

Ao atualizar as versões das extensões no browser, as antigas não são removidas. Em ~/Library/Caches/Google/Chrome/Default/Storage/ext acesso cada pasta e removo as versões antigas das extensões que uso. Essas últimas limpezas não são tão impactantes em liberar memória, mas ajudam um pouco e mantém a saúde do sistema em dia.

E você, tem alguma dica para compartilhar comigo e com a galera da comunidade? Conta pra gente nos comentários!