Comment exécuter plusieurs services dans un conteneur Docker

0
153

Docker est une technologie permettant d'emballer les composants de votre pile sous forme de conteneurs isolés. Il est courant d'exécuter chacun de vos processus dans son propre conteneur, créant ainsi une séparation nette entre les composants. Cela améliore la modularité et vous permet d'accéder aux avantages d'évolutivité de la conteneurisation.

Il peut toujours y avoir des situations où vous souhaitez exécuter plusieurs services dans un même conteneur. Bien que cela ne soit pas naturel dans l'écosystème Docker, nous allons montrer quelques approches différentes que vous pouvez utiliser pour créer des conteneurs avec plusieurs processus de longue durée.

Identification du problème

Les conteneurs Docker exécutent un seul processus de premier plan. Ceci est défini par les instructions ENTRYPOINT et CMD de l'image. ENTRYPOINT est défini dans le Dockerfile d'une image, tandis que CMD peut être remplacé lors de la création de conteneurs. Les conteneurs s'arrêtent automatiquement lorsque leur processus de premier plan se termine.

Vous pouvez lancer d'autres processus à partir du CMD, mais le conteneur ne restera en cours d'exécution que tant que le processus de premier plan d'origine est actif. Maintenir le conteneur opérationnel pendant la durée de vie combinée de deux services indépendants n'est pas directement possible à l'aide du mécanisme ENTRYPOINT/CMD.

Wrapping Multiple Processus dans un seul point d'entrée

Les scripts wrapper sont la solution la plus simple au problème. Vous pouvez écrire un script qui démarre tous vos processus et attend qu'ils se terminent. Définir le script comme votre Docker ENTRYPOINT l'exécutera en tant que processus de premier plan du conteneur, en gardant le conteneur en cours d'exécution jusqu'à ce que l'un des scripts encapsulés se termine.

#!/bin/bash /opt/first-process & /opt/second-process & attendre -n quitter $?

Ce script démarre les binaires /opt/first-process et /opt/second-process à l'intérieur du conteneur. L'utilisation de & permet au script de continuer sans attendre la fin de chaque processus. wait est utilisé pour suspendre le script jusqu'à ce que l'un des processus se termine. Le script se termine ensuite avec le code d'état émis par le script terminé.

Ce modèle fait que le conteneur exécute à la fois le premier processus et le second processus jusqu'à ce que l'un d'eux se termine. À ce stade, le conteneur s'arrêtera, même si l'autre processus est peut-être encore en cours d'exécution.

Pour utiliser ce script, modifiez l'ENTRYPOINT et le CMD de votre image Docker pour en faire le conteneur’ processus de premier plan :

ENTRYPOINT [“/bin/sh”] CMD [“./path/to/script.sh”]

Le — Option de conteneur d'initialisation

L'un des défis liés à la gestion des processus de conteneurs consiste à nettoyer efficacement à leur sortie. Docker exécute votre CMD en tant qu'ID de processus 1, ce qui le rend responsable de la gestion des signaux et de l'élimination des zombies. Si votre script n'a pas ces capacités, vous pourriez vous retrouver avec des processus enfants orphelins persistant à l'intérieur de votre conteneur.

La commande docker run a un indicateur –init qui modifie le point d'entrée pour utiliser tini comme PID 1. Il s'agit d'une implémentation minimale du processus d'initialisation qui exécute votre CMD, gère la transmission du signal et récolte continuellement des zombies.

It& #8217;il vaut la peine d'utiliser –init si vous vous attendez à générer de nombreux processus et que vous ne souhaitez pas gérer manuellement le nettoyage. Tini est une saveur init légère conçue pour les conteneurs. C'est beaucoup plus petit que des alternatives à part entière comme systemd et upstart.

Utiliser un gestionnaire de processus dédié

Les scripts manuels deviennent rapidement sous-optimaux lorsque vous avez de nombreux processus à gérer. Adopter un gestionnaire de processus est une autre façon d'exécuter plusieurs services dans vos conteneurs Docker. Le gestionnaire de processus devient votre POINT D'ENTRÉE et est responsable du démarrage, de la maintenance et du nettoyage après vos processus de travail.

Plusieurs options sont disponibles lors de la mise en œuvre de cette approche. superviseurd est un choix populaire qui se configure facilement via un fichier /etc/supervisor/conf.d/supervisord.conf :

[program:apache2] command=/usr/sbin/apache2 -DFOREGROUND [program:mysqld] command=/usr/sbin/mysqld_safe

Ce fichier de configuration configure superviseurd pour démarrer Apache et MySQL. Pour l'utiliser dans un conteneur Docker, ajoutez tous les packages requis à votre image, puis copiez votre fichier de configuration de superviseur au bon emplacement. Définissez superviseurd comme CMD de l'image pour l'exécuter automatiquement au démarrage des conteneurs.

FROM ubuntu:latest RUN apt-get install -y apache2 superviseur mysql-server COPIER superviseurd.conf /etc/supervisor/conf.d/supervisord.conf ENTRYPOINT [“/bin/sh”] CMD [“/usr/bin/supervisord “]

Parce que superviseurd s'exécute en continu, il n'est pas possible d'arrêter le conteneur lorsque l'un de vos processus surveillés se termine. Une option alternative est s6-overlay qui a cette capacité. Il utilise un modèle de service déclaratif dans lequel vous placez les scripts de service directement dans /etc/services.d :

# Ajoutez s6-overlay à votre image AJOUTER https://github.com/just-containers/s6-overlay/releases/download/v3.1.0.0/s6-overlay-noarch.tar.xz /tmp RUN tar -C/-Jxpf /tmp/s6-overlay-noarch.tar.xz RUN printf “#!/bin/shn/usr/sbin/apache2 -DFOREGROUND” > /etc/services.d/first-service/run RUN chmod +x /etc/services.d/first-service/run # Utilisez s6-overlay comme point d'entrée de votre image ENTRYPOINT [“/init”]

Vous pouvez ajouter un script de finition exécutable dans vos répertoires de service pour gérer l'arrêt du conteneur avec docker stop. s6-overlay exécutera automatiquement ces scripts lorsque son processus recevra un signal TERM en raison de la commande stop.

Les scripts de finition reçoivent le code de sortie de leur service comme premier argument. Le code est défini sur 256 lorsque le service est interrompu en raison d'un signal non capté. Le script doit écrire le code de sortie final dans /run/s6-linux-init-container-results/exitcode ; s6-overlay lit ce fichier et se termine avec la valeur qu'il contient, ce qui fait que ce code est utilisé comme code d'arrêt de votre conteneur.

#!/bin/sh echo “$1” > /run/s6-linux-init-container-results/exitcode

Quand devez-vous exécuter plusieurs processus dans un conteneur ?

Cette technique est mieux utilisée avec des processus étroitement couplés que vous ne pouvez pas séparer pour les exécuter en tant que conteneurs indépendants. Vous pouvez avoir un programme qui s'appuie sur un utilitaire d'assistance en arrière-plan ou une application monolithique qui effectue sa propre gestion des processus individuels. Les techniques présentées ci-dessus peuvent vous aider à conteneuriser ces types de logiciels.

L'exécution de plusieurs processus dans un conteneur doit toujours être évitée dans la mesure du possible. S'en tenir à un seul processus de premier plan maximise l'isolation, empêche les composants d'interférer les uns avec les autres et améliore votre capacité à déboguer et tester des éléments spécifiques. Vous pouvez faire évoluer les composants individuellement à l'aide d'orchestrateurs de conteneurs, ce qui vous donne la possibilité d'exécuter davantage d'instances de vos processus les plus gourmands en ressources.

Conclusion

Les conteneurs ont généralement un processus de premier plan et s'exécutent tant qu'il est actif. Ce modèle s'aligne sur les meilleures pratiques de conteneurisation et vous permet de tirer le meilleur parti de la technologie.

Dans certaines situations, vous pourriez avoir besoin de plusieurs processus pour s'exécuter dans un conteneur. Comme toutes les images ont finalement un seul point d'entrée, vous devez écrire un script wrapper ou ajouter un gestionnaire de processus qui se charge de démarrer vos binaires cibles.

Les gestionnaires de processus vous donnent tout ce dont vous avez besoin mais gonflent vos images avec des packages supplémentaires et configuration. Les scripts wrapper sont plus simples mais peuvent devoir être associés à l'indicateur –init de Docker pour empêcher la prolifération des processus zombies.

LIRE LA SUITE

  • › 4 façons dont vous endommagez la batterie de votre ordinateur portable
  • › 10 fonctionnalités Samsung Galaxy que vous devriez utiliser
  • › Combien coûte la recharge d'une batterie ?
  • &rsaquo ; Jusqu'où peut aller une voiture électrique avec une seule charge ?
  • › Examen de PrivadoVPN : perturber le marché ?
  • &rsaquo ; Ces gadgets bannissent les moustiques