web-dev-qa-db-fra.com

Conteneur Docker et consommation de mémoire

Supposons que je commence un grand nombre de conteneurs Docker basés sur la même image Docker. Cela signifie que chaque conteneur Docker exécute la même application. Il se peut que l’application soit suffisamment volumineuse et nécessite beaucoup de mémoire sur le disque dur.

Comment docker s'en occupe-t-il?

Tous les conteneurs de menu fixe partagent-ils la partie statique définie dans l'image de menu fixe?

Sinon, est-il judicieux de copier l'application dans un répertoire de la machine utilisé pour exécuter des conteneurs de menu fixe et de monter ce répertoire d'application pour chaque conteneur de menu fixe?

53
Michael Belenki

Docker partage les ressources au niveau du noyau. Cela signifie que la logique de l'application n'est jamais répliquée lors de son exécution. Si vous démarrez le Bloc-notes 1 000 fois, il est toujours stocké une seule fois sur votre disque dur, ce qui est identique aux instances de Docker.

Si vous exécutez 100 instances de la même image de menu fixe, tout ce que vous faites réellement est de conserver l’état du même logiciel dans votre RAM dans 100 timelines différentes. Le ou les processeurs hôtes l'état en mémoire de chacune de ces instances de conteneur par rapport au logiciel qui la contrôle, vous consommez donc 100 fois la mémoire RAM requise pour exécuter l'application. Il est inutile de stocker physiquement la mémoire exacte. Même code octet pour le logiciel 100 fois, car cette partie de l'application est toujours statique et ne changera jamais (sauf si vous écrivez un logiciel complètement fou, ou si vous choisissez de reconstruire et de redéployer l'image de votre conteneur).

C'est la raison pour laquelle les conteneurs n'autorisent pas la persistance immédiate, et en quoi le menu fixe est différent des machines virtuelles classiques qui utilisent des disques durs virtuels. Cependant, cela n'est vrai que pour la persistance à l'intérieur du conteneur. Les fichiers qui sont modifiés par le logiciel Docker sur le disque dur sont "montés" dans des conteneurs utilisant les volumes du menu fixe et ne font donc pas vraiment partie des environnements du menu fixe, mais simplement montés dans ceux-ci. (Pour plus d'informations à ce sujet, rendez-vous à l'adresse suivante: https://docs.docker.com/userguide/dockervolumes/ )

Une autre question que vous voudrez peut-être poser à ce propos est la suivante: comment docker stocke-t-il les modifications apportées à son disque lors de l'exécution? Ce qui est vraiment sympa à vérifier, c’est comment docker parvient à faire fonctionner cela. L'état d'origine du disque dur du conteneur correspond à ce qui lui est donné à partir de l'image. Cela peut [~ # ~] pas [~ # ~] écrire sur cette image. Au lieu d’écrire dans l’image, un différentiel est constitué de ce qui est modifié dans l’état interne des conteneurs par rapport à ce qui se trouve dans l’image du menu fixe. Docker utilise une technologie appelée " nion Filesystem ", qui crée une couche diff par-dessus l'état initial de l'image du menu fixe.

Ce "diff" (référencé en tant que conteneur inscriptible dans l'image ci-dessous) est stocké en mémoire et disparaît lorsque vous supprimez votre conteneur. (Sauf si vous utilisez la commande "docker commit", cependant: je ne le recommande pas. L'état de votre nouvelle image de docker n'est pas représenté dans un fichier docker et ne peut pas être régénéré facilement à partir d'une reconstruction.)

Union Filesystem

100
RoyB