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.