Docker Commy - Limiti di memoria

Docker Commy - Limiti di memoria
Docker Compose è una potente utilità. Risparmia il tempo e riduce gli errori durante la distribuzione dell'applicazione dociked. Di solito, non è un'ottima idea eseguire l'intero stack tra cui il frontend, il server di database, ecc. Da un singolo contenitore.

Giramo diversi contenitori per gestire carichi di lavoro diversi di un'applicazione e utilizziamo Docker Compose per farlo facilmente. Ogni carico di lavoro logicamente diverso è elencato come diverso servizio. Ad esempio, il server HTTP frontend verrà elencato come servizio frontend che esegue un'immagine Apache o un'immagine NGINX come contenitore.

Tutti i servizi, le loro esigenze di networking, i requisiti di archiviazione, ecc.File YML. Ci concentreremo sulla specifica dell'utilizzo della memoria qui.

Prerequisiti

Avresti bisogno dei seguenti strumenti nell'Arsenal per seguire:

  1. Comprensione di base di Docker
  2. Docker per Windows o Mac o se stai eseguendo Linux, Dockerce per Linux
  3. Docker compose binario (gli utenti di Windows e Mac avranno già questo installato)

Resteremo alla versione 2.4 per il nostro documento di composizione.File YML come supporta la versione 17.12 e più in alto del motore Docker e superiore. Avremmo potuto andare con la versione 3 che è più recente ma non supporta la vecchia sintassi di limitazione della memoria. Se si tenta di utilizzare la sintassi più recente, insiste invece sull'uso di Docker in modalità Swarm. Quindi, per mantenere la materia semplice per gli utenti Docker regolari, mi atterrò alla versione 2.4

La maggior parte del codice funzionerebbe allo stesso modo per la versione 3 e dove ci sarà una differenza, menzionerò la più recente sintassi per gli utenti Docker Swarm.

Applicazione di esempio

Proviamo a eseguire un semplice servizio NGINX sulla porta 80 utilizzando prima la CLI e poi un semplice documento.YML. Nella sezione successiva, esploreremo le sue limitazioni di memoria e l'utilizzo e modificheremo la nostra composizione Docker.YML per vedere come vengono imposte le limitazioni personalizzate.

Iniziamo un semplice server Nginx utilizzando Docker-Cli:

$ Docker run -d --name my -nginx -p 80:80 nginx: ultimo

È possibile vedere il server Nginx funzionare visitando http: // localhost o sostituire lcoalhost

Con l'indirizzo IP del tuo host Docker. Questo contenitore può potenzialmente utilizzare l'intera memoria disponibile sul tuo host Docker (nel nostro caso è di circa 2 GB). Per controllare l'utilizzo della memoria, tra le altre cose, possiamo usare il comando:

$ Docker Statists My-Ninx
Nome ID contenitore CPU % Utilizzo MEM/limite MEM % Net I/O Blocco I/O PIDS
6EB0091C0CF2 MY-NGINX 0.00% 2.133mib / 1.934GIB 0.11% 3.14kb / 2.13kb 0b / 0b 2

L'utilizzo/limite di MEM è a 2.133mib su totale 1.934gib. Rimuoviamo questo contenitore e iniziamo a scrivere script docker.

$ Docker Stop my-nginx
$ Docker rm my-nginx

File YML equivalente

Il contenitore esatto come sopra può essere creato se seguiamo questi passaggi:

$ mkdir my-compone
$ cd my-compone
$ vim docker-compose.YML

Creiamo una nuova directory vuota e creiamo un file Docker.YML in esso. Quando eseguiremo Docker-Opse da questa directory, cercherà questo file specifico (ignorando tutto il resto) e creerà di conseguenza la nostra distribuzione. Aggiungi i seguenti contenuti all'interno di questo .File YML.

Versione: '3'
Servizi:
mio-nginx:
Immagine: nginx: ultimo
Porte:
- "80:80"
$ Docker -Opse Up -D

Il flag -d viene aggiunto in modo che i contenitori appena creati siano in background. Altrimenti, il terminale si collegherà ai contenitori e inizierà i rapporti di stampa da esso. Ora possiamo vedere le statistiche dei contenitori appena creati:

$ Docker Statists -ally
Nome ID contenitore CPU% Utilizzo MEM/limite MEM% Net I/O Blocco I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_1 0.00% 2.25mib/1.934GIB 0.11% 1.65kb/0b 7.35 MB/0B 2

Noterai che un contenitore simile come prima è stato creato con limiti di memoria simili e persino utilizzo. Dalla stessa directory che contiene il file YML. Esegui il seguente comando per eliminare il contenitore appena creato, insieme alla rete di bridge clienti creata.

$ Docker-compone

Ciò riporterà Docker a uno stato pulito, ad eccezione di eventuali volumi creati (non abbiamo creato nessuno, quindi non è una preoccupazione.)

Limiti di memoria e prenotazioni di memoria

I limiti di memoria e le prenotazioni di memoria sono due diversi aspetti per garantire un funzionamento regolare delle tue applicazioni e l'host Docker che stai eseguendo in cima.

In generale, il limite di memoria impone un limite superiore alla quantità di memoria che può potenzialmente essere utilizzata da un contenitore Docker. Per impostazione predefinita un contenitore Docker, come qualsiasi altro processo di sistema, può utilizzare l'intera memoria disponibile dell'host Docker. Questo può causare un'eccezione fuori memoria e il tuo sistema potrebbe benissimo crash. Anche se non arriva mai a questo, può comunque morire di fame altri processi (compresi altri contenitori) da risorse preziose, danneggiando nuovamente le prestazioni. I limiti di memoria assicurano che i contenitori affamati di risorse non superano un certo limite. Ciò limita il raggio di esplosione di un'applicazione scarsamente scritta a pochi contenitori, non all'intero host.

Le prenotazioni di memoria, d'altra parte, sono meno rigide. Quando il sistema è a corto di memoria e cerca di reclamarne parte. Cerca di portare il consumo di memoria del contenitore al limite di prenotazione o al di sotto. Se c'è abbondanza di memoria, tuttavia, l'applicazione può espandersi fino al limite di memoria set hard.

Riassumere:

  1. Limite di memoria: un rigoroso limite superiore alla quantità di memoria resa disponibile a un contenitore.
  2. Prenotazione della memoria: questo dovrebbe essere impostato come quantità minima di memoria indicata che un'applicazione deve essere eseguita correttamente. Quindi non si schianta né si comporta male quando il sistema sta cercando di rivendicare parte della memoria.

Se la prenotazione della memoria è maggiore del limite di memoria, il limite di memoria ha la precedenza.

Specificare i limiti di memoria e la prenotazione

Versione 2

Torniamo al Docker-Opse.YML abbiamo scritto in precedenza e abbiamo aggiunto un limite di memoria ad esso. Cambia la versione in 2.4 per motivi discussi nella sezione Prerequisiti.

Versione: '2.4 '
Servizi:
mio-nginx:
Immagine: nginx: ultimo
Porte:
- "80:80"
mem_limit: 300m

L'ultima riga imposta il limite per il servizio MY-NINX a 300MIB. Puoi usare K per Kib e G per Gib e B per solo byte. Tuttavia, il numero prima deve essere un numero intero. Non puoi usare valori come 2.4m, dovresti invece usare 2400k. Ora se corri:

$ Docker Stat -Tutti
Nome ID contenitore CPU % Utilizzo MEM/limite MEM % Net I/O Blocco I/O PIDS
44114d785d0a my-compose_my-nginx_1 0.00% 2.141Mib/300Mib 0.71% 1.16KB/0B 0B/0B 2

Noterai che il limite di memoria è impostato su 300 MIB. L'impostazione della prenotazione di memoria è altrettanto semplice, basta aggiungere una riga Mem_Reservation: xxx alla fine.

Versione: '2.4 '
Servizi:
mio-nginx:
Immagine: nginx: ultimo
Porte:
- "80:80"
mem_limit: 300m
mem_reservation: 100m

Versione 3 (opzionale)

Per utilizzare la versione tre è necessario eseguire Docker in modalità Swarm. Per Windows e Mac puoi abilitarlo utilizzando il menu Impostazioni Docker. Gli utenti di Linux dovrebbero andare a eseguire Docker Swarm init. Maggiori informazioni su questo possono essere trovate qui. Tuttavia, non è un passo necessario, e se non l'hai abilitato, va bene. Questa sezione è per le persone Già in esecuzione in modalità sciame e può utilizzare la versione più recente.

Versione: '3'
Servizi:
mio-nginx:
Immagine: nginx: ultimo
Porte:
- "80:80"
Distribuisci:
Risorse:
Limiti:
Memoria: 300m
Prenotazioni:
Memoria: 100m

Definiamo tutto questo in Opzione Risorse. I limiti e la prenotazione diventano le chiavi primarie e la memoria non è che una delle tante risorse gestite qui. La CPU è ancora un altro parametro importante.

Ulteriori informazioni

Puoi saperne di più su Docker-Opse dalla documentazione ufficiale collegata qui. Una volta ottenuto l'essenza di come scrivere un file di composizione, la documentazione può aiutarti con i dettagli vari parametri.

Non devi sapere tutto, basta cercare ciò che la tua applicazione richiede e il riferimento ti guiderebbe nell'implementarlo.