Guias/Docker usando memória demais
Docker usando memória demais no Mac? Como encontrar o contêiner e limitar o uso
Resposta rápida
No Mac, o Docker roda todos os contêineres dentro de uma única máquina virtual Linux, então o Monitor de Atividade mostra um único processo grande, geralmente Virtual Machine Service for Docker, e não os contêineres. Para ver qual contêiner está usando a memória, execute docker stats. Para limitar o total, diminua o Memory limit em Settings → Resources → Advanced, no Docker Desktop; o padrão é metade da memória do seu Mac. O Resource Saver, no mesmo lugar, desliga a máquina virtual quando o Docker Desktop está ocioso. O Vitals, um monitor de sistema para Mac, mostra a memória, a CPU, a rede e as portas de cada contêiner na aba Contêineres e pode parar um contêiner pela barra de menus.
Como encontrar e limitar a memória do Docker
- 01 Abra o Monitor de Atividade, clique em Memória e digite Docker no campo de busca. A maior linha é a máquina virtual que roda seus contêineres; com o Virtualization framework da Apple, ela se chama Virtual Machine Service for Docker. O com.docker.backend é o próprio Docker Desktop.
- 02 No Terminal, execute
docker stats --no-stream. Cada linha é um contêiner em execução, e MEM USAGE / LIMIT mostra quanto ele usa e o máximo que pode usar. - 03 Pare o que você não está usando:
docker stopseguido do nome do contêiner, oudocker compose downna pasta de um projeto Compose. - 04 Abra Settings → Resources → Advanced no Docker Desktop e diminua o Memory limit para um pouco acima do que o
docker statsmostra no seu pico. Aplique a mudança; o Docker Desktop reinicia a máquina virtual. - 05 Ative o Resource Saver na mesma seção, para que a máquina virtual desligue enquanto não houver contêineres rodando.
OrbStack, Colima, Rancher Desktop e Podman também rodam contêineres em uma máquina virtual, cada um com seu próprio ajuste de memória. No Colima, colima start --memory 4 dá 4 GB à máquina virtual.
Contêineres são um recurso do Linux, então no Mac todo motor os roda dentro de uma pequena máquina virtual Linux. O macOS vê essa máquina como um único processo e não faz ideia de qual contêiner lá dentro está usando o quê. É por isso que o Monitor de Atividade mostra um processo com vários gigabytes e nenhum contêiner, e por isso as respostas estão nas ferramentas do próprio Docker. A tabela abaixo relaciona o que você vê ao que é e ao que fazer.
Para onde vai a memória do Docker
| O que você vê | O que é | O que fazer |
|---|---|---|
| Virtual Machine Service for Docker, vários GB | A máquina virtual Linux que roda todos os contêineres | Diminua o Memory limit em Settings → Resources → Advanced |
| com.docker.backend | O processo do próprio Docker Desktop | Geralmente pequeno; reinicie o Docker Desktop se ele não parar de crescer |
| A memória continua alta sem nenhum contêiner rodando | A máquina virtual ainda segura a memória que usou | Ative o Resource Saver ou encerre o Docker Desktop |
| Um contêiner perto do limite | Ele precisa de mais, ou está vazando memória | docker stats, e um limite por contêiner |
| A memória sobe durante o build de imagens | Os builds rodam na mesma máquina virtual | Normal; ela cai quando o build termina |
Por que o Monitor de Atividade mostra um único processo grande do Docker
A máquina virtual recebe memória do macOS como qualquer app, até o Memory limit que você definiu. Lá dentro, o Linux divide essa memória entre os contêineres e usa o que sobra para cache de arquivos, como o macOS faz. Visto de fora, tudo parece igual: um processo ocupando muita memória.
Só o motor sabe como ela está dividida, e é isso que o docker stats pergunta a ele. A coluna CPU % ali é uma fração das CPUs da máquina virtual, e MEM % é uma fração do limite do contêiner, ou da máquina virtual inteira quando o contêiner não tem limite.
Quanta memória dar ao Docker
O Docker Desktop fica com metade da memória do seu Mac por padrão: 8 GB em um Mac de 16 GB. Uma stack de desenvolvimento típica, com um servidor de app, um banco de dados e um cache, geralmente precisa de bem menos. Rode sua stack como de costume, acompanhe o total no docker stats no pico e defina o Memory limit um pouco acima disso.
Se o limite ficar baixo demais, o Linux dentro da máquina virtual para os contêineres que ficam sem memória. Execute docker inspect --format '{{.State.OOMKilled}}' seguido do nome de um contêiner: ele mostra true quando isso aconteceu. Aumente o limite ou dê a esse contêiner um limite próprio, para que ele não derrube os outros junto.
Defina um limite de memória por contêiner
Um limite em um contêiner impede que um serviço com vazamento encha a máquina virtual. Com docker run, adicione --memory 512m. Em um arquivo Compose, defina mem_limit: 512m no serviço. O contêiner é parado se passar do limite, e docker stats mostra o limite ao lado do uso.
Por que o Docker não devolve a memória
Parar contêineres libera memória dentro da máquina virtual, mas a máquina nem sempre a devolve ao macOS na mesma hora, então o valor dela no Monitor de Atividade pode continuar alto. O Resource Saver devolve tudo desligando a máquina quando o Docker Desktop está ocioso, e ela volta em poucos segundos quando um contêiner precisa. Encerrar o Docker Desktop tem o mesmo efeito.
Docker e espaço em disco
Imagens, contêineres parados, volumes e o cache de build ficam em uma única imagem de disco que cresce conforme você trabalha, e no Mac ela entra em Dados do Sistema. docker system df mostra quanto cada tipo ocupa. docker system prune remove contêineres parados, redes sem uso, imagens pendentes e o cache de build; adicione --volumes só se tiver certeza de que nenhum volume guarda dados de que você precisa. O Disk usage limit, ao lado do Memory limit nos ajustes do Docker Desktop, limita esse tamanho.
O que o Vitals acrescenta
O Vitals mostra o que a máquina virtual não conta ao macOS: a memória de cada contêiner.
- Uma aba Contêineres com memória, CPU, rede, disco e portas publicadas de cada contêiner, com os projetos Compose agrupados
- Cartões para o maior contêiner e para o que está mais perto do limite, e um gráfico da memória por contêiner
- O Docker Desktop é uma única linha na lista de apps, com a máquina virtual incluída; clique nele para ver os contêineres lá dentro
- Os contêineres também no menu suspenso da barra de menus, onde basta um clique para parar um contêiner, depois de perguntar. Veja como parar contêineres do Docker
- Docker Desktop, OrbStack, Colima, Rancher Desktop e Podman
Bom saber
- O Vitals lê os números dos contêineres no motor e nunca inicia nem remove contêineres. Parar é a única mudança que ele faz, e só quando você pede.
- A aba aparece enquanto um motor estiver em execução.
Perguntas frequentes
Por que o Docker está usando tanta memória no meu Mac?
O Docker roda os contêineres em uma máquina virtual Linux que ocupa até o Memory limit dela, metade da memória do seu Mac por padrão. Diminua o Memory limit em Settings → Resources → Advanced e execute docker stats para ver qual contêiner está usando mais.
O que é o Virtual Machine Service for Docker?
A máquina virtual em que o Docker Desktop roda seus contêineres, quando usa o Virtualization framework da Apple. A memória dela é tudo o que os contêineres e o Linux lá dentro usam, até o Memory limit do Docker Desktop.
Como limitar a memória do Docker no Mac?
No Docker Desktop, abra Settings → Resources → Advanced e diminua o Memory limit. Para um único contêiner, use docker run --memory 512m, ou mem_limit: 512m em um arquivo Compose.
Por que o Docker não devolve a memória depois que paro os contêineres?
A máquina virtual guarda parte da memória que usou mesmo depois que os contêineres param. Ative o Resource Saver, que desliga a máquina quando o Docker Desktop está ocioso, ou encerre o Docker Desktop.
Por que o Virtual Machine Service for Docker está usando tanta CPU?
Geralmente um contêiner está ocupado, e o docker stats mostra qual. Se a CPU continuar alta sem nenhum contêiner rodando, encerre e abra de novo o Docker Desktop e atualize-o: CPU alta sem nada rodando já foi relatada como bug em algumas versões do Docker Desktop.
Quanta memória devo dar ao Docker no Mac?
Um pouco mais do que seus contêineres usam no pico, o que o docker stats mostra. Para uma stack de desenvolvimento típica, isso costuma ser de 2 a 4 GB, bem abaixo do padrão de metade da memória do Mac.
Existe um app que mostra a memória dos contêineres do Docker no Mac?
O Vitals tem uma aba Contêineres com a memória, a CPU, a rede, o disco e as portas de cada contêiner, para Docker Desktop, OrbStack, Colima, Rancher Desktop e Podman. Ele também pode parar um contêiner pela barra de menus, depois de perguntar.
No glossário
Mais guias
- Por que meu Mac está tão lento
- O que está gastando a bateria do meu Mac
- Qual app está usando minha CPU ou memória
- Por que meu Mac não entra em repouso
- Chrome usando memória demais
- Por que as ventoinhas do meu Mac fazem tanto barulho
- Como controlar a velocidade da ventoinha no Mac
- Como liberar memória RAM no Mac
- Como parar contêineres do Docker
- Mixer de volume para Mac
- Alternativas ao Monitor de Atividade
- Alternativas ao iStat Menus
- Alternativas ao Stats
- Gerenciador de Tarefas para Mac
- Melhores monitores de sistema para Mac
- Melhores monitores para a barra de menus do Mac
- Melhores mixers de volume para Mac