Gidsen/Docker gebruikt te veel geheugen

Docker gebruikt te veel geheugen op je Mac? Zo vind je de container, en begrens je hem

Atta 🐬

Oprichter van Vitals

Gepubliceerd

Kort antwoord

Op een Mac draait Docker elke container in één virtuele Linux-machine, dus Activiteitenweergave toont één groot proces, meestal Virtual Machine Service for Docker, en niet de containers. Om te zien welke container het geheugen gebruikt, voer je docker stats uit. Om het totaal te begrenzen, verlaag je Memory limit in Settings → Resources → Advanced van Docker Desktop; standaard is dat de helft van het geheugen van je Mac. Resource Saver, op dezelfde plek, zet de virtuele machine uit als Docker Desktop niets doet. Vitals, een systeemmonitor voor de Mac, toont het geheugen, de CPU, het netwerk en de poorten van elke container op zijn tabblad Containers, en stopt een container vanuit de menubalk.

Zo vind en begrens je het geheugen van Docker

  1. 01 Open Activiteitenweergave, klik op Geheugen en typ Docker in het zoekveld. De grootste regel is de virtuele machine die je containers draait; met het Virtualization-framework van Apple heet die Virtual Machine Service for Docker. com.docker.backend is Docker Desktop zelf.
  2. 02 Voer in Terminal docker stats --no-stream uit. Elke regel is een draaiende container, en MEM USAGE / LIMIT toont wat hij gebruikt en het meeste dat hij mag gebruiken.
  3. 03 Stop wat je niet gebruikt: docker stop gevolgd door de naam van de container, of docker compose down in de map van een Compose-project.
  4. 04 Open Settings → Resources → Advanced in Docker Desktop en verlaag Memory limit tot iets boven wat docker stats op je drukste moment toont. Pas de wijziging toe; Docker Desktop herstart de virtuele machine.
  5. 05 Zet in hetzelfde gedeelte Resource Saver aan, zodat de virtuele machine uitgaat zolang er geen containers draaien.

OrbStack, Colima, Rancher Desktop en Podman draaien containers ook in een virtuele machine, elk met een eigen geheugeninstelling. Voor Colima geeft colima start --memory 4 de virtuele machine 4 GB.

Containers zijn een Linux-functie, dus op een Mac draait elke engine ze in een kleine virtuele Linux-machine. macOS ziet die machine als één proces en heeft geen idee welke container erin wat gebruikt. Daarom toont Activiteitenweergave één proces met een paar gigabyte en helemaal geen containers, en daarom staan de antwoorden in de eigen tools van Docker. De tabel hieronder koppelt wat je ziet aan wat het is en wat je doet.

Waar het geheugen van Docker heen gaat

Wat je zietWat het isWat je doet
Virtual Machine Service for Docker, een paar GB De virtuele Linux-machine die elke container draait Verlaag Memory limit in Settings → Resources → Advanced
com.docker.backend Het eigen proces van Docker Desktop Meestal klein; herstart Docker Desktop als het blijft groeien
Het geheugen blijft hoog terwijl er geen containers draaien De virtuele machine houdt geheugen vast dat hij gebruikte Zet Resource Saver aan, of stop Docker Desktop
Eén container dicht bij zijn limiet Hij heeft meer nodig, of hij lekt docker stats, en een limiet per container
Het geheugen stijgt tijdens het bouwen van images Builds draaien in dezelfde virtuele machine Normaal; het daalt als de build klaar is

Waarom Activiteitenweergave één groot Docker-proces toont

De virtuele machine krijgt zijn geheugen van macOS zoals elke app, tot de Memory limit die je instelt. Daarbinnen verdeelt Linux dat geheugen over je containers en gebruikt het wat overblijft om bestanden te cachen, net als macOS. Van buitenaf ziet het er allemaal hetzelfde uit: één proces dat veel geheugen vasthoudt.

Alleen de engine kent de verdeling, en daar vraagt docker stats naar. De kolom CPU % daar is een deel van de CPU’s van de virtuele machine, en MEM % is een deel van de limiet van de container, of van de hele virtuele machine als de container geen limiet heeft.

Hoeveel geheugen je Docker geeft

Docker Desktop neemt standaard de helft van het geheugen van je Mac: 8 GB op een Mac met 16 GB. Een gewone ontwikkelstack, een appserver, een database en een cache, heeft meestal veel minder nodig. Draai je stack zoals je dat normaal doet, kijk naar het totaal in docker stats op het drukste moment, en zet Memory limit er iets boven.

Zet je hem te laag, dan stopt Linux in de virtuele machine containers die zonder geheugen komen te zitten. Voer docker inspect --format '{{.State.OOMKilled}}' uit gevolgd door de naam van een container: het geeft true als dat is gebeurd. Verhoog de limiet, of geef die container een eigen limiet zodat hij de andere niet meesleurt.

Stel een geheugenlimiet per container in

Een limiet op één container voorkomt dat een lekkende dienst de virtuele machine vult. Voeg bij docker run de optie --memory 512m toe. Zet in een Compose-bestand mem_limit: 512m op de dienst. De container wordt gestopt als hij erover gaat, en docker stats toont de limiet naast het gebruik.

Waarom Docker geen geheugen teruggeeft

Containers stoppen maakt geheugen vrij binnen de virtuele machine, maar de machine geeft het niet altijd meteen terug aan macOS, dus zijn getal in Activiteitenweergave kan hoog blijven. Resource Saver geeft alles terug door de machine uit te zetten als Docker Desktop niets doet, en hij start in een paar seconden weer op als een container hem nodig heeft. Docker Desktop stoppen doet hetzelfde.

Docker en schijfruimte

Images, gestopte containers, volumes en de buildcache staan in één schijfkopie die groeit terwijl je werkt, en op een Mac telt die mee bij Systeemgegevens. docker system df toont hoeveel elk soort inneemt. docker system prune verwijdert gestopte containers, ongebruikte netwerken, losse images en de buildcache; voeg --volumes alleen toe als je zeker weet dat geen enkel volume gegevens bevat die je nodig hebt. Disk usage limit, naast Memory limit in de instellingen van Docker Desktop, begrenst hem.

Wat Vitals toevoegt

Vitals toont wat de virtuele machine macOS niet vertelt: het geheugen van elke container.

  • Een tabblad Containers met geheugen, CPU, netwerk, schijf en gepubliceerde poorten voor elke container, met Compose-projecten gegroepeerd
  • Kaarten voor de grootste container en de container die het dichtst bij zijn limiet zit, en een grafiek van het geheugen per container
  • Docker Desktop is één regel in de lijst met apps, met zijn virtuele machine meegeteld; klik erop om de containers erin te zien
  • De containers ook in het uitklapmenu van de menubalk, waar je met één klik een container stopt nadat Vitals het je heeft gevraagd. Zie zo stop je Docker-containers
  • Docker Desktop, OrbStack, Colima, Rancher Desktop en Podman

Goed om te weten

  • Vitals vraagt de cijfers van containers op bij de engine en start of verwijdert nooit containers. Stoppen is de enige wijziging die het maakt, en alleen als jij erom vraagt.
  • Het tabblad verschijnt zolang er een engine draait.
Koop Vitals voor $9 $9 tijdens de lancering, daarna $29. 14 dagen geld terug.

Vragen die mensen stellen

Waarom gebruikt Docker zoveel geheugen op mijn Mac?

Docker draait containers in een virtuele Linux-machine die tot zijn Memory limit inneemt, standaard de helft van het geheugen van je Mac. Verlaag Memory limit in Settings → Resources → Advanced, en voer docker stats uit om te zien welke container het meest gebruikt.

Wat is Virtual Machine Service for Docker?

De virtuele machine waarin Docker Desktop je containers draait als het Apples Virtualization-framework gebruikt. Zijn geheugen is alles wat de containers en Linux daarin gebruiken, tot de Memory limit van Docker Desktop.

Hoe begrens ik het geheugen van Docker op een Mac?

Open in Docker Desktop Settings → Resources → Advanced en verlaag Memory limit. Voor één container gebruik je docker run --memory 512m, of mem_limit: 512m in een Compose-bestand.

Waarom geeft Docker geen geheugen terug nadat ik containers stop?

De virtuele machine houdt een deel van het geheugen dat hij gebruikte vast, ook nadat containers zijn gestopt. Zet Resource Saver aan, dat de machine uitzet als Docker Desktop niets doet, of stop Docker Desktop.

Waarom gebruikt Virtual Machine Service for Docker zoveel CPU?

Meestal is er een container bezig, en docker stats laat zien welke. Blijft de CPU hoog terwijl er geen containers draaien, stop Docker Desktop dan, open hem opnieuw en update hem: hoge CPU terwijl er niets draait, is in sommige versies van Docker Desktop als bug gemeld.

Hoeveel geheugen moet ik Docker geven op een Mac?

Iets meer dan je containers op hun drukst gebruiken, wat docker stats laat zien. Voor een gewone ontwikkelstack is dat vaak 2 tot 4 GB, ruim onder de standaard van de helft van het geheugen van de Mac.

Is er een app die het geheugen van Docker-containers toont op een Mac?

Vitals heeft een tabblad Containers met het geheugen, de CPU, het netwerk, de schijf en de poorten van elke container, voor Docker Desktop, OrbStack, Colima, Rancher Desktop en Podman. Het stopt ook een container vanuit de menubalk, nadat het je heeft gevraagd.

In de woordenlijst

Meer gidsen