Guide/Docker usa troppa memoria

Docker usa troppa memoria sul Mac? Come trovare il container e limitarlo

Atta 🐬

Fondatore di Vitals

Pubblicata il

In breve

Sul Mac, Docker esegue tutti i container dentro un’unica macchina virtuale Linux, quindi Monitoraggio Attività mostra un solo grande processo, di solito Virtual Machine Service for Docker, e non i container. Per vedere quale container usa la memoria, esegui docker stats. Per limitare il totale, abbassa Memory limit in Settings → Resources → Advanced di Docker Desktop; il valore predefinito è metà della memoria del Mac. Resource Saver, nello stesso punto, spegne la macchina virtuale quando Docker Desktop è inattivo. Vitals, un monitor di sistema per Mac, mostra memoria, CPU, rete e porte di ogni container nel suo pannello Container, e arresta un container dalla barra dei menu.

Come trovare e limitare la memoria di Docker

  1. 01 Apri Monitoraggio Attività, fai clic su Memoria e digita Docker nel campo di ricerca. La riga più grande è la macchina virtuale che esegue i tuoi container; con il framework Virtualization di Apple si chiama Virtual Machine Service for Docker. com.docker.backend è Docker Desktop stesso.
  2. 02 Nel Terminale, esegui docker stats --no-stream. Ogni riga è un container in esecuzione, e MEM USAGE / LIMIT mostra quanto usa e il massimo che può usare.
  3. 03 Arresta ciò che non stai usando: docker stop seguito dal nome del container, o docker compose down nella cartella di un progetto Compose.
  4. 04 Apri Settings → Resources → Advanced di Docker Desktop e abbassa Memory limit a poco più di quanto mostra docker stats nei momenti di massimo utilizzo. Applica la modifica; Docker Desktop riavvia la macchina virtuale.
  5. 05 Attiva Resource Saver nella stessa sezione, così la macchina virtuale si spegne quando non ci sono container in esecuzione.

Anche OrbStack, Colima, Rancher Desktop e Podman eseguono i container in una macchina virtuale, ognuno con la sua impostazione per la memoria. Per Colima, colima start --memory 4 assegna 4 GB alla macchina virtuale.

I container sono una funzione di Linux, quindi sul Mac ogni motore li esegue dentro una piccola macchina virtuale Linux. macOS vede quella macchina come un solo processo e non ha idea di quale container al suo interno stia usando cosa. Per questo Monitoraggio Attività mostra un solo processo con diversi gigabyte e nessun container, e per questo le risposte sono negli strumenti di Docker. La tabella qui sotto collega ciò che vedi a cosa è e a cosa fare.

Dove va la memoria di Docker

Cosa vediCos’èCosa fare
Virtual Machine Service for Docker, diversi GB La macchina virtuale Linux che esegue tutti i container Abbassa Memory limit in Settings → Resources → Advanced
com.docker.backend Il processo di Docker Desktop Di solito piccolo; riavvia Docker Desktop se continua a crescere
La memoria resta alta senza container in esecuzione La macchina virtuale trattiene ancora la memoria che ha usato Attiva Resource Saver, o chiudi Docker Desktop
Un container vicino al suo limite Gli serve di più, o perde memoria docker stats, e un limite per container
La memoria sale durante la build delle immagini Le build girano nella stessa macchina virtuale Normale; scende quando la build finisce

Perché Monitoraggio Attività mostra un solo grande processo Docker

La macchina virtuale riceve la memoria da macOS come qualsiasi app, fino al Memory limit che hai impostato. Al suo interno, Linux divide quella memoria tra i tuoi container e usa il resto per la cache dei file, come fa macOS. Da fuori sembra tutto uguale: un solo processo che occupa molta memoria.

Solo il motore conosce la suddivisione, ed è quello che docker stats gli chiede. La colonna CPU % in quel comando è una quota delle CPU della macchina virtuale, e MEM % è una quota del limite del container, o dell’intera macchina virtuale quando il container non ne ha uno.

Quanta memoria dare a Docker

Per impostazione predefinita Docker Desktop prende metà della memoria del Mac: 8 GB su un Mac da 16 GB. Un tipico ambiente di sviluppo, un server applicativo, un database e una cache, di solito ne richiede molta meno. Fai girare il tuo ambiente come al solito, osserva il totale in docker stats nel momento di massimo utilizzo e imposta Memory limit poco sopra.

Se lo imposti troppo basso, Linux dentro la macchina virtuale arresta i container che esauriscono la memoria. Esegui docker inspect --format '{{.State.OOMKilled}}' seguito dal nome di un container: stampa true se è successo. Alza il limite, o dai a quel container un limite suo, così non può trascinare giù anche gli altri.

Impostare un limite di memoria per container

Un limite su un container impedisce a un servizio che perde memoria di riempire la macchina virtuale. Con docker run, aggiungi --memory 512m. In un file Compose, imposta mem_limit: 512m sul servizio. Il container viene arrestato se lo supera, e docker stats mostra il limite accanto all’utilizzo.

Perché Docker non restituisce la memoria

Arrestare i container libera memoria dentro la macchina virtuale, ma la macchina non sempre la restituisce subito a macOS, quindi il suo valore in Monitoraggio Attività può restare alto. Resource Saver la restituisce tutta spegnendo la macchina quando Docker Desktop è inattivo, e la riavvia in pochi secondi quando un container ne ha bisogno. Chiudere Docker Desktop ha lo stesso effetto.

Docker e lo spazio su disco

Immagini, container arrestati, volumi e cache di build stanno in un’unica immagine disco che cresce mentre lavori, e sul Mac viene conteggiata in Dati di sistema. docker system df mostra quanto occupa ogni tipo. docker system prune rimuove i container arrestati, le reti inutilizzate, le immagini orfane e la cache di build; aggiungi --volumes solo se sei sicuro che nessun volume contenga dati che ti servono. Disk usage limit, accanto a Memory limit nelle impostazioni di Docker Desktop, pone un limite.

Cosa aggiunge Vitals

Vitals mostra ciò che la macchina virtuale non dice a macOS: la memoria di ogni container.

  • Un pannello Container con memoria, CPU, rete, disco e porte pubblicate per ogni container, con i progetti Compose raggruppati
  • Schede per il container più grande e per quello più vicino al suo limite, e un grafico della memoria per container
  • Docker Desktop è una riga nell’elenco delle app con la sua macchina virtuale inclusa; fai clic per vedere i container al suo interno
  • I container anche nel menu della barra dei menu, dove con un clic arresti un container dopo la conferma. Vedi come arrestare i container Docker
  • Docker Desktop, OrbStack, Colima, Rancher Desktop e Podman

Buono a sapersi

  • Vitals legge i dati dei container dal motore e non avvia né rimuove mai container. Arresta è l’unica modifica che fa, e solo quando glielo chiedi.
  • Il pannello compare mentre un motore è in esecuzione.
Acquista Vitals a $9 $9 durante il lancio, poi $29. Rimborso entro 14 giorni.

Domande frequenti

Perché Docker usa così tanta memoria sul Mac?

Docker esegue i container in una macchina virtuale Linux che prende fino al suo Memory limit, per impostazione predefinita metà della memoria del Mac. Abbassa Memory limit in Settings → Resources → Advanced, ed esegui docker stats per vedere quale container usa di più.

Cos’è Virtual Machine Service for Docker?

La macchina virtuale in cui Docker Desktop esegue i tuoi container, quando usa il framework Virtualization di Apple. La sua memoria è tutto ciò che usano i container e Linux al suo interno, fino al Memory limit di Docker Desktop.

Come limito la memoria di Docker sul Mac?

In Docker Desktop, apri Settings → Resources → Advanced e abbassa Memory limit. Per un singolo container, usa docker run --memory 512m, o mem_limit: 512m in un file Compose.

Perché Docker non restituisce la memoria dopo che ho arrestato i container?

La macchina virtuale trattiene parte della memoria usata anche dopo che i container si sono fermati. Attiva Resource Saver, che spegne la macchina quando Docker Desktop è inattivo, o chiudi Docker Desktop.

Perché Virtual Machine Service for Docker usa così tanta CPU?

Di solito un container è impegnato, e docker stats mostra quale. Se la CPU resta alta senza container in esecuzione, chiudi e riapri Docker Desktop e aggiornalo: una CPU alta senza niente in esecuzione è stata segnalata come bug in alcune versioni di Docker Desktop.

Quanta memoria dovrei dare a Docker sul Mac?

Poco più di quanto usano i tuoi container nel momento di massimo utilizzo, che vedi con docker stats. Per un tipico ambiente di sviluppo spesso sono tra 2 e 4 GB, molto meno del valore predefinito di metà della memoria del Mac.

Esiste un’app che mostra la memoria dei container Docker sul Mac?

Vitals ha un pannello Container con memoria, CPU, rete, disco e porte di ogni container, per Docker Desktop, OrbStack, Colima, Rancher Desktop e Podman. Arresta anche un container dalla barra dei menu, dopo averti chiesto conferma.

Nel glossario

Altre guide