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=OPTION
para remover apenas o que quiser; para isso, dê uma olhada na documentação.
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
docker volume prune
, que a documentação indica que pode ser personalizado com alguns filtros
Uso de memória antes x depois
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:
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!