Docker Compose - Limites de mémoire

Docker Compose - Limites de mémoire
Docker Compose est un utilitaire puissant. Il fait gagner du temps et réduit les erreurs lors du déploiement de votre application dockée. Habituellement, ce n'est pas une excellente idée d'exécuter toute la pile, y compris le frontend, le serveur de base de données, etc. à l'intérieur d'un seul conteneur.

Nous tournons 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 autre service. Par exemple, votre serveur HTTP Frontend sera répertorié comme un service de frontend exécutant une image Apache ou Nginx en tant que conteneur.

Tous les services, leurs besoins de réseautage, leurs exigences de stockage, etc. peuvent être spécifiés dans une composition docker.fichier yml. Nous nous concentrerons sur la spécification de l'utilisation de la mémoire ici.

Conditions préalables

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 exécutez Linux, Dockerce pour Linux
  3. Docker Compose Binary (les utilisateurs de Windows et Mac auront déjà ceci installé)

Nous resterons à la version 2.4 pour notre compose docker.Fichiers YML comme cela prend en charge la version 17.12 et plus du moteur Docker et supérieur. Nous aurions pu aller avec la version 3 qui est plus récente, mais elle ne prend pas en charge l'ancienne syntaxe de limitation de mémoire. Si vous essayez d'utiliser la syntaxe la plus récente, il insiste sur l'utilisation de Docker en mode Swarm, plutôt. Donc, pour garder la matière simple 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 service Nginx simple sur le port 80 en utilisant d'abord la CLI puis un simple docker-compose.YML. Dans la section suivante, nous explorerons ses limitations de mémoire et son utilisation et modifierons notre compose docker.yml pour voir comment les limitations personnalisées sont imposées.

Commençons un serveur Nginx simple à l'aide de Docker-Cli:

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

Vous pouvez voir le serveur Nginx travailler en visitant http: // localhost ou remplacer LCOALHOST

Avec l'adresse IP de votre hôte docker. Ce conteneur peut potentiellement utiliser l'intégralité de la mémoire disponible sur votre hôte Docker (dans notre cas, c'est environ 2 Go). Pour vérifier l'utilisation de la mémoire, entre autres, nous pouvons utiliser la commande:

$ docker statistiques my-nginx
Nom de l'identifiant de conteneur CPU% Utilisation MEM / limit MEM% E / S BLOC DE PIDES D'E / S
6EB0091C0CF2 MY-NGINX 0.00% 2.133mib / 1.934gib 0.11% 3.14KB / 2.13KB 0B / 0B 2

L'utilisation / la limite du MEM est à 2.133mib sur le total 1.934gib. Retirons ce conteneur et commençons à écrire des scripts Docker-Compose.

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

Fichier YML équivalent

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

$ mkdir my-compose
$ cd my-compose
$ 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-Composer à partir de ce répertoire, il recherchera ce fichier spécifique (ignorer tout le reste) et créera notre déploiement en conséquence. Ajoutez le contenu suivant à l'intérieur .fichier yml.

Version: '3'
prestations de service:
My-nginx:
Image: Nginx: Dernière
PORTS:
- "80:80"
$ docker-compose up -d

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

$ statistiques docker-tout
Nom de l'identifiant de conteneur CPU% Utilisation MEM / limit MEM% E / S BLOC DE PIDES D'E / S
5f8a1e2c08ac my-compose_my-nginx_1 0.00% 2.25mib / 1.934gib 0.11% 1.65KB / 0B 7.35 Mo / 0b 2

Vous remarquerez qu'un conteneur similaire comme avant a été créé avec des limites de mémoire similaires et même une utilisation. À partir 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 ponts client qui a été créé.

$ docker-compose

Cela renverra Docker à un état propre à l'exception de tous les volumes créés (nous n'en avons pas créé pour que ce ne soit pas une préoccupation.)

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 un fonctionnement fluide de vos applications et l'hôte Docker que vous utilisez au sommet.

D'une manière générale, la limite de mémoire impose une limite supérieure à la quantité de mémoire qui peut 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 l'exception hors mémoire et votre système peut très bien s'écraser. Même si cela n'arrive jamais à cela, il peut encore mourir de faim d'un autre processus (y compris d'autres conteneurs) à partir de ressources précieuses, nuisant à nouveau à la performance. Les limites de mémoire garantissent que les conteneurs affamés des ressources ne dépassent pas une certaine limite. Cela limite le rayon de souffle d'une application mal écrite à quelques conteneurs, pas l'hôte entier.

Les réservations de mémoire, en revanche, sont moins rigides. Lorsque le système est bas sur la mémoire et essaie d'en récupérer une partie. Il essaie d'apporter 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 dure.

Résumer:

  1. Limite de mémoire: une limite supérieure stricte à la quantité de mémoire mise à la disposition d'un conteneur.
  2. Réservation de la mémoire: cela devrait être défini comme la quantité minimale de mémoire dont une application doit exécuter correctement. Il ne se bloque donc pas ou ne se comporte pas 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 a priorité.

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

Version 2

Revenons au docker-compose.yml nous avons écrit plus tôt et y ajouter une limite de mémoire. Changer la version en 2.4 pour les raisons discutées dans la section préalable.

version 2.4 '
prestations de service:
My-nginx:
Image: Nginx: Dernière
PORTS:
- "80:80"
mem_limit: 300m

La dernière ligne définit la limite du service My-nginx à 300mib. Vous pouvez utiliser K pour Kib, et G pour Gib et B pour juste des octets. Cependant, le nombre avant qu'il doit être un entier. Vous ne pouvez pas utiliser des valeurs comme 2.4m, vous devrez utiliser 2400k à la place. Maintenant si vous courez:

$ docker stat - tout
Nom de l'identifiant de conteneur CPU% Utilisation MEM / limit MEM% E / S BLOC DE PIDES D'E / S
44114d785d0a my-compose_my-nginx_1 0.00% 2.141mib / 300mib 0.71% 1.16KB / 0B 0B / 0B 2

Vous remarquerez que la limite de mémoire est définie sur 300 MIB. Le réglage de la réservation de la mémoire est tout aussi facile, il suffit d'ajouter une ligne mem_reservation: xxx à la fin.

version 2.4 '
prestations de service:
My-nginx:
Image: Nginx: Dernière
PORTS:
- "80:80"
mem_limit: 300m
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 Docker Paramètres. Les utilisateurs de Linux devraient aller 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 section est pour les gens déjà Exécution en mode essaim et peut utiliser la nouvelle version.

Version: '3'
prestations de service:
My-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 de ressources. Les limites et la réservation deviennent les clés primaires de leur propre et la mémoire n'est que l'une des nombreuses ressources gérées ici. CPU étant encore un autre paramètre important.

Plus d'informations

Vous pouvez en savoir plus sur Docker-Compose à partir de la documentation officielle liée ici. Une fois que vous avez obtenu l'essentiel de la façon d'écrire un fichier composé, la documentation peut vous aider avec les spécificités divers paramètres.

Vous n'avez pas à tout savoir, recherchez simplement ce que votre application nécessite et la référence vous guiderait dans l'implémentation.