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.
Vous auriez besoin des outils suivants dans votre arsenal pour suivre:
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: dernierVous 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-nginxL'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-nginxFichier YML équivalent
Le conteneur exact comme ci-dessus peut être créé si nous suivons ces étapes:
$ mkdir my-composeNous 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'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-toutVous 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:
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 '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 - toutVous 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 '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'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.
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.