Docker Compose — Limites de mémoire

Docker Compose Memory Limits



Docker compose est un utilitaire puissant. Il permet de gagner du temps et de réduire les erreurs lors du déploiement de votre application Dockerisée. Habituellement, ce n'est pas une bonne idée d'exécuter la pile entière, y compris le frontend, le serveur de base de données, etc. depuis l'intérieur d'un seul et même conteneur.

Nous créons différents conteneurs pour gérer différentes charges de travail d'une application et nous utilisons Docker Compose pour le faire facilement. Chaque charge de travail logiquement différente est répertoriée comme un service . Par exemple, votre serveur http frontal sera répertorié en tant que service frontal exécutant une image Apache ou Nginx en tant que conteneur.







Tous les services, leurs besoins en réseau, leurs besoins en stockage, etc. peuvent être spécifiés dans un fichier docker-compose.yml. Nous nous concentrerons ici sur la spécification de l'utilisation de la mémoire.



Vous auriez besoin des outils suivants dans votre arsenal pour suivre :



  1. Compréhension de base de Docker
  2. Docker pour Windows ou Mac ou si vous utilisez Linux, DockerCE pour Linux
  3. Docker Compose binaire y (les utilisateurs Windows et Mac l'auront déjà installé)

Nous nous en tiendrons à la version 2.4 pour nos fichiers docker-compose.yml car elle prend en charge la version 17.12 et supérieure de Docker Engine et supérieure. Nous aurions pu choisir la version 3 qui est plus récente mais elle ne supporte pas l'ancienne syntaxe de limitation de mémoire. Si vous essayez d'utiliser la nouvelle syntaxe, il insiste plutôt sur l'utilisation de Docker en mode Swarm. Donc, pour garder les choses simples pour les utilisateurs réguliers de Docker, je m'en tiendrai à la version 2.4





La plupart du code fonctionnerait de la même manière pour la version 3, et là où il y aura une différence, je mentionnerai la nouvelle syntaxe pour les utilisateurs de Docker Swarm.

Exemple d'application

Essayons d'exécuter un simple service Nginx sur le port 80 en utilisant d'abord l'interface de ligne de commande, puis un simple docker-compose.yml. Dans la section suivante, nous explorerons ses limitations et son utilisation de la mémoire et modifierons notre docker-compose.yml pour voir comment les limitations personnalisées sont imposées.



Commençons un simple serveur nginx en utilisant Docker-CLI :

$ docker run -d --name my-nginx -p80:80nginx:dernier

Vous pouvez voir le serveur nginx fonctionner en visitant http://localhost ou remplacer lcoalhost

Avec l'adresse IP de votre hébergeur Docker. Ce conteneur peut potentiellement utiliser toute la mémoire disponible sur votre hôte Docker (dans notre cas, il s'agit d'environ 2 Go). Pour vérifier l'utilisation de la mémoire, entre autres, nous pouvons utiliser la commande :

$ docker stats my-nginx

ID CONTENEUR NOM CPU % UTILISATION MEM / LIMITE MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 mon-nginx0,00% 2,133 Mio / 1,934 Gio0,11% 3,14 Ko / 2,13 Ko 0B / 0B2

L'UTILISATION/LIMITE MEM est de 2,133 Mio sur le total de 1 934 Gio. Supprimons ce conteneur et commençons à écrire des scripts docker-compose.

$ docker stop my-nginx
$ docker rm mon-nginx

Fichier ym équivalent

Le conteneur exact comme ci-dessus peut être créé si nous suivons ces étapes :

$ mkdir ma-compose
$ cd ma-composer
$ vim docker-compose.yml

Nous créons un nouveau répertoire vide et créons un fichier docker-compose.yml dedans. Lorsque nous exécuterons docker-compose à partir de ce répertoire, il recherchera ce fichier spécifique (en ignorant tout le reste) et créera notre déploiement en conséquence. Ajoutez le contenu suivant dans ce fichier .yml.

version:'3'
prestations de service:
mon-nginx :
image: nginx:dernière
ports :
-'80 : 80'

$ docker-compose up -d

L'indicateur -d est ajouté pour que les conteneurs nouvellement créés s'exécutent en arrière-plan. Sinon, le terminal s'attachera aux conteneurs et commencera à imprimer des rapports à partir de celui-ci. Maintenant, nous pouvons voir les statistiques du ou des conteneurs nouvellement créés :

$ docker stats -all

ID CONTENEUR NOM CPU% MEM USAGE/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac ma-compose_mon-nginx_10,00% 2,25 Mio/1,934 Gio0,11% 1,65 Ko/0B 7,35 Mo/0B2

Vous remarquerez qu'un conteneur similaire à celui d'avant a été créé avec des limites de mémoire et même une utilisation similaires. Du même répertoire qui contient le fichier yml. Exécutez la commande suivante pour supprimer le conteneur nouvellement créé, ainsi que le réseau de pont client qui a été créé.

$docker-composer vers le bas

Cela ramènera docker à un état propre à l'exception de tous les volumes qui ont été créés (nous n'en avons créé aucun, ce n'est donc pas un problème.)

Limites de mémoire et réservations de mémoire

Les limites de mémoire et les réservations de mémoire sont deux aspects différents pour assurer le bon fonctionnement de vos applications et de l'hôte Docker sur lequel vous exécutez.

D'une manière générale, Memory Limit impose une limite supérieure à la quantité de mémoire pouvant potentiellement être utilisée par un conteneur Docker. Par défaut, un conteneur Docker, comme tout autre processus système, peut utiliser toute la mémoire disponible de l'hôte Docker. Cela peut provoquer une exception de mémoire insuffisante et votre système peut très bien tomber en panne. Même si cela n'arrive jamais, cela peut toujours priver d'autres processus (y compris d'autres conteneurs) de ressources précieuses, ce qui nuit encore aux performances. Les limites de mémoire garantissent que les conteneurs gourmands en ressources ne dépassent pas une certaine limite. Cela limite le rayon d'explosion d'une application mal écrite à quelques conteneurs, et non à l'ensemble de l'hôte.

Les réservations de mémoire, en revanche, sont moins rigides. Lorsque le système manque de mémoire et essaie d'en récupérer une partie. Il essaie d'amener la consommation de mémoire du conteneur à ou en dessous de la limite de réservation. S'il y a une abondance de mémoire, cependant, l'application peut s'étendre jusqu'à la limite de mémoire définie.

Résumer:

  1. Limite de mémoire : limite supérieure stricte à la quantité de mémoire mise à la disposition d'un conteneur.
  2. Réservation de mémoire : cela doit être défini comme la quantité minimale de mémoire dont une application a besoin pour s'exécuter correctement. Ainsi, il ne se bloque pas ou ne se comporte pas mal lorsque le système essaie de récupérer une partie de la mémoire.

Si la réservation de mémoire est supérieure à la limite de mémoire, la limite de mémoire est prioritaire.

Spécification des limites de mémoire et de la réservation

Version 2

Revenons au docker-compose.yml que nous avons écrit plus tôt et ajoutons-lui une limite de mémoire. Changez la version en 2.4 pour les raisons décrites dans la section des prérequis.

version:'2.4'
prestations de service:
mon-nginx :
image: nginx:dernière
ports :
-'80 : 80'
mem_limit : 300 m

La dernière ligne définit la limite du service my-nginx à 300 Mio. Vous pouvez utiliser k pour KiB, et g pour GiB et b pour seulement des octets. Cependant, le nombre qui le précède doit être un entier. Vous ne pouvez pas utiliser des valeurs telles que 2,4 m, vous devrez plutôt utiliser 2400k. Maintenant, si vous exécutez :

$ docker stat --all

ID CONTENEUR NOM CPU% MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a ma-compose_mon-nginx_10,00% 2.141 Mio/300 Mio0,71% 1,16 kB/0B 0B/0B2

Vous remarquerez que la limite de mémoire est fixée à 300 Mio. La configuration de la réservation de mémoire est tout aussi simple, il suffit d'ajouter une ligne mem_reservation : xxx à la fin.

version:'2.4'
prestations de service:
mon-nginx :
image: nginx:dernière
ports :
-'80 : 80'
mem_limit : 300 m
mem_reservation: 100m

Version 3 (facultatif)

Pour utiliser la version trois, vous devez exécuter Docker en mode essaim. Pour Windows et Mac, vous pouvez l'activer à l'aide du menu des paramètres de Docker. Les utilisateurs de Linux devraient exécuter docker swarm init. Plus d'informations à ce sujet peuvent être trouvées ici . Ce n'est pas une étape nécessaire cependant, et si vous ne l'avez pas activé, c'est bien aussi. Cette rubrique s'adresse aux personnes déjà fonctionnant en mode essaim et peut utiliser la nouvelle version.

version:'3'
prestations de service:
mon-nginx :
image: nginx:dernière
ports :
-'80 : 80'
déployer:
Ressources:
limites:
mémoire : 300m
Réservations:
mémoire : 100m

Nous définissons tout cela sous l'option ressources. Les limites et la réservation deviennent leurs propres clés primaires et la mémoire n'est qu'une des nombreuses ressources gérées ici. CPU étant encore un autre paramètre important.

Informations complémentaires

Vous pouvez en savoir plus sur docker-compose à partir de la documentation officielle lié ici . Une fois que vous avez compris l'essentiel de la façon d'écrire un fichier de composition, la documentation peut vous aider avec les différents paramètres spécifiques.

Vous n'avez pas besoin de tout savoir, recherchez simplement ce dont votre application a besoin et la référence vous guidera dans sa mise en œuvre.