10 votes

Plusieurs threads à l'intérieur d'un conteneur Docker

J'ai besoin de créer N threads à l'intérieur d'un conteneur docker. Je vais recevoir une liste d'éléments, puis la diviser en morceaux et chaque thread traitera chaque morceau.

J'utilise donc un conteneur docker avec un processus et N threads. S'agit-il d'une bonne pratique dans Docker ? Je pense que oui, parce que nous avons, par exemple, un serveur web apacha qui gère les connexions en éparpillant les threads.

Ou est-il préférable de créer N conteneurs, chacun pour chaque morceau ? Si c'est le cas, quelle est la bonne façon de procéder ?

7voto

Sachin Malhotra Points 787

Un conteneur en tant que tel n'a rien à voir avec le calcul que vous devez effectuer. La question que vous posez est la suivante Dois-je avoir plusieurs processus qui effectuent mon traitement ou plusieurs threads engendrés par le même processus qui effectuent le traitement ?

Un conteneur est juste une plateforme pour faire fonctionner votre application dans l'environnement souhaité. Point final. Cela signifie que vous feriez tourner un processus à l'intérieur d'un conteneur pour exécuter votre logique d'entreprise. Plusieurs conteneurs signifient simplement plusieurs processus et c'est ce qui est conseillé, vous devriez opter pour des threads multiples plutôt que pour des processus multiples, car le lancement d'un nouveau processus (dans votre cas, en tant que conteneur) consommerait davantage de ressources. et nécessiterait également plus de mémoire, etc. Il est donc préférable d'avoir un seul conteneur qui génère plusieurs threads pour faire le travail à votre place.

Toutefois, il dépend également de la configuration de la machine sous-jacente sur lequel le conteneur est démarré. S'il est judicieux de créer plusieurs conteneurs avec plusieurs threads en raison des capacités multicœurs du matériel sous-jacent, vous devez également le faire.

4voto

Angelos Points 993

Réponse courte :

Exécutez votre programme en tant que conteneur docker unique. Considérez un conteneur Docker comme un environnement léger et isolé, semblable à un environnement virtuel, dans lequel vous pouvez exécuter un programme/service. Ce service peut exécuter plusieurs threads, tous lancés à partir du programme parent - il s'agit toujours d'un seul service s'exécutant sur un seul conteneur Docker.

Explication :

Supposons que vous ayez un programme qui génère des threads pour effectuer un travail - ce programme peut être un pool de threads pour effectuer un calcul sur un ensemble de morceaux ou un serveur web comme Apache. Il pourrait même s'agir d'un code python qui instancie un pool de processus pour effectuer le calcul sur les chunks. Dans tous ces cas, tous les threads et processus appartiennent à un processus principal qui peut être considéré comme un programme ou un service unique. Ce programme unique est déclenché par une seule commande de l'utilisateur, la commande que vous trouverez dans le fichier Docker ENTRYPOINT.

Par exemple, vous pouvez exécuter un conteneur de serveur apache en utilisant l'image officielle d'apache sur docker hub docker hub ref ):

docker run -dit --name my-apache-app -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

Et cela fera tourner le serveur web Apache comme un seul conteneur, indépendamment du nombre de threads qu'il exécute, auquel on peut facilement se référer lorsque l'opérateur veut l'arrêter, le redémarrer, le supprimer, etc, en utilisant les commandes de docker. Et c'est plus pratique, car nous n'avons pas à nous soucier d'attacher des volumes de montage, d'ouvrir des ports, et de relier des multitudes de conteneurs, afin qu'ils communiquent entre eux.

L'essentiel est donc de créer un conteneur pour chaque instance de service. Si vous voulez lancer des instances dupliquées du processus parent, par exemple, exécuter apache sur deux machines dans le cadre d'une configuration à charge équilibrée, alors vous devrez lancer deux conteneurs, un sur chaque hôte.

Par ailleurs, si vous avez besoin d'exécuter divers travaux dans un système de traitement par lots, où chaque travail nécessite l'installation d'une bibliothèque spécifique, ce type d'utilisation bénéficierait de l'isolation de l'environnement que l'on obtiendrait en exécutant différents conteneurs. Mais ce n'est pas ce que vous avez demandé, votre question mentionnait spécifiquement un serveur web qui génère des threads et des processus qui utilisent des threads pour effectuer des travaux sur des morceaux, et pour ces cas, vous générez un seul conteneur pour le service/programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X