Docker Compose — Limiti di memoria

Docker Compose Memory Limits



Docker compose è una potente utility. Risparmia tempo e riduce gli errori durante la distribuzione dell'applicazione Dockerized. Di solito, non è una buona idea eseguire l'intero stack incluso il frontend, il server di database, ecc. Da un singolo contenitore.

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







Tutti i servizi, le loro esigenze di rete, i requisiti di archiviazione, ecc. possono essere specificati in un file docker-compose.yml. Ci concentreremo qui sulla specifica dell'utilizzo della memoria.



Avresti bisogno dei seguenti strumenti nel tuo arsenale per seguire:



  1. Comprensione di base di Docker
  2. Docker per Windows o Mac o se stai usando Linux, DockerCE per Linux
  3. Docker Compose binario y (gli utenti Windows e Mac lo avranno già installato)

Ci atterremo alla versione 2.4 per i nostri file docker-compose.yml poiché supporta la versione 17.12 e successive di Docker Engine e successive. Avremmo potuto optare per la versione 3 che è più recente ma non supporta la vecchia sintassi di limitazione della memoria. Se provi a utilizzare la sintassi più recente, insiste invece sull'utilizzo di Docker in modalità Swarm. Quindi, per semplificare le cose per gli utenti regolari di Docker, 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 sintassi più recente per gli utenti di Docker Swarm.

Applicazione di esempio

Proviamo ad eseguire un semplice servizio Nginx sulla porta 80 utilizzando prima la CLI e poi un semplice docker-compose.yml. Nella prossima sezione, esploreremo le sue limitazioni e l'utilizzo della memoria e modificheremo il nostro docker-compose.yml per vedere come vengono imposte le limitazioni personalizzate.



Avviamo un semplice server nginx utilizzando Docker-CLI:

$ docker run -d --name my-nginx -p80:80nginx: più recente

Puoi vedere il server nginx funzionante 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 verificare l'utilizzo della memoria, tra l'altro, possiamo utilizzare il comando:

$ statistiche docker my-nginx

NOME ID CONTAINER CPU % UTILIZZO MEM/LIMITE MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 mio-nginx0.00%2.133MiB / 1.934GiB0.11% 3,14 kB / 2,13 kB 0B / 0B2

Il MEM USAGE/LIMIT è a 2,133 MiB su un totale di 1,934 GiB. Rimuoviamo questo contenitore e iniziamo a scrivere script docker-compose.

$ docker ferma il mio-nginx
$ docker rm my-nginx

File ym equivalente

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

$ mkdir my-compose
$ cd my-compose
$ vim docker-compose.yml

Creiamo una nuova directory vuota e al suo interno creiamo un file docker-compose.yml. Quando eseguiremo docker-compose da questa directory, cercherà questo file specifico (ignorando tutto il resto) e creerà la nostra distribuzione di conseguenza. Aggiungi i seguenti contenuti all'interno di questo file .yml.

versione:'3'
Servizi:
mio-nginx:
immagine: nginx:latest
porti:
-'80: 80'

$ docker-compose up -d

Il flag -d viene aggiunto in modo che i contenitori appena creati vengano eseguiti in background. In caso contrario, il terminale si collegherà ai contenitori e inizierà a stampare i report da esso. Ora possiamo vedere le statistiche dei container appena creati:

$ docker stats -all

NOME ID CONTAINER CPU% MEM USAGE/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10.00% 2,25 MiB/1.934 GiB0.11% 1,65 kB/0B 7,35 MB/0B2

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

$docker-componi giù

Ciò riporterà la finestra mobile a uno stato pulito ad eccezione di tutti i volumi che sono stati creati (non ne abbiamo creati, quindi non è un problema).

Limiti di memoria e prenotazioni di memoria

I limiti di memoria e le prenotazioni di memoria sono due aspetti diversi per garantire un buon funzionamento delle tue applicazioni e dell'host Docker su cui stai eseguendo.

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

Prenotazioni di memoria, d'altra parte, è meno rigido. Quando il sistema sta esaurendo la memoria e tenta di recuperarne una parte. Tenta di portare il consumo di memoria del contenitore al o al di sotto del limite di prenotazione. Se c'è abbondanza di memoria, tuttavia, l'applicazione può espandersi fino al limite di memoria impostato.

Riassumere:

  1. Limite di memoria: un limite superiore rigoroso alla quantità di memoria messa a disposizione di un contenitore.
  2. Prenotazione della memoria: dovrebbe essere impostata come la quantità minima di memoria necessaria per un'esecuzione corretta di un'applicazione. Quindi non si blocca o si comporta male quando il sistema sta cercando di recuperare parte della memoria.

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

Specificare limiti di memoria e prenotazione

Versione 2

Torniamo al docker-compose.yml che abbiamo scritto in precedenza e aggiungiamo un limite di memoria. Modificare la versione in 2.4 per motivi discussi nella sezione dei prerequisiti.

versione:'2.4'
Servizi:
mio-nginx:
immagine: nginx:latest
porti:
-'80: 80'
mem_limit: 300 m

L'ultima riga imposta il limite per il servizio my-nginx a 300 MiB. Puoi usare k per KiB e g per GiB eb solo per byte. Tuttavia, il numero prima di esso deve essere un numero intero. Non puoi usare valori come 2.4m, dovresti invece usare 2400k. Ora se corri:

$ docker stat --all

NOME ID CONTAINER CPU% MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10.00% 2.141MiB/300MiB0,71% 1.16kB/0B 0B/0B2

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

versione:'2.4'
Servizi:
mio-nginx:
immagine: nginx:latest
porti:
-'80: 80'
mem_limit: 300 m
mem_reservation: 100 m

Versione 3 (opzionale)

Per utilizzare la versione tre devi eseguire Docker in modalità sciame. Per Windows e Mac puoi abilitarlo utilizzando il menu delle impostazioni di Docker. Gli utenti Linux dovrebbero eseguire docker swarm init. Maggiori informazioni a riguardo possono essere trovate qui . Tuttavia, non è un passaggio necessario e, se non l'hai abilitato, va bene lo stesso. 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:latest
porti:
-'80: 80'
distribuire:
risorse:
limiti:
memoria: 300 m
prenotazioni:
memoria: 100 m

Definiamo tutto questo sotto l'opzione delle risorse. I limiti e la prenotazione diventano chiavi primarie proprie e la memoria è solo una delle tante risorse gestite qui. La CPU è un altro parametro importante.

Ulteriori informazioni

Puoi saperne di più su docker-compose dalla documentazione ufficiale linkato qui . Una volta capito come scrivere un file di composizione, la documentazione può aiutarti con i vari parametri specifici.

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