web-dev-qa-db-fra.com

Plusieurs images dans un conteneur

Donc, voici le problème, je besoin de le faire un certain développement et pour cela il me faut les paquets suivants:

  1. MongoDb
  2. NodeJs
  3. Nginx
  4. RabbitMq
  5. Redis

Une option est que je prends une image Ubunt, créez un conteneur et commencez à les installer un par un et c'est fait, démarrez mon serveur et exposez les ports.

Mais cela peut facilement être fait dans une boîte virtuelle également, et cela n'utilisera pas la puissance de Docker. Donc pour cela je dois commencer à construire ma propre image avec ces paquets. Maintenant, voici la question de savoir si je commence à écrire mon fichier Dockerfile et si vous placez les commandes pour télécharger le Node js (et d’autres) à l’intérieur de celui-ci, cela redevient la même chose que la virtualisation.

Ce dont j'ai besoin c'est que je commence par Ubunt et continue à ajouter le références de MongoDb, NodeJs, RabbitMq, Nginx et Redis à l'intérieur du Dockerfile et enfin exposer les ports correspondants.

Voici les questions que j'ai:

  1. Est-ce possible? C'est comme ajouter les références d'autres images à l'intérieur du fichier Dockerfile lorsque vous commencez à partir d'une image de base.
  2. Si oui alors comment?
  3. Aussi est-ce la bonne pratique ou non?
  4. Comment faire ce genre de choses dans Docker?

Merci d'avance.

22
Ankur Verma

Gardez les images claires. Exécuter un service par conteneur. Utilisez les images officielles sur le docker hub pour mongodb, nodejs, rabbitmq, nginx, etc. Etendez-les si nécessaire. Si vous voulez tout exécuter dans un gros conteneur, vous pouvez aussi bien utiliser une VM.

Vous pouvez bien sûr faire des choses folles dans une configuration de développement, mais pourquoi passer du temps à configurer quelque chose qui a une valeur zéro dans un environnement de production? Et si vous avez besoin de mettre à l'échelle l'un des services? Comment définir les contraintes de mémoire et de processeur sur chaque service? .. Et la liste continue.

Ne faites pas de contenants monolithiques.

Un bon début consiste à utiliser Docker-Composer pour configurer un ensemble de services pouvant communiquer entre eux. Vous pouvez faire une version prod et dev de votre docker-compose.yml fichier.

Entrer dans le bon état d'esprit

Dans un monde parfait, vous exécuteriez vos conteneurs dans un environnement en cluster en production pour pouvoir faire évoluer votre système et disposer de la simultanéité, mais cela pourrait être excessif en fonction de ce que vous exécutez. C'est au moins une bonne chose d'avoir cela à l'arrière de la tête, car cela peut vous aider à prendre les bonnes décisions.

Quelques points à considérer si vous voulez être un puriste:

  • Comment disposez-vous d'un stockage de volume persistant sur plusieurs hôtes?
  • Le proxy inverse/équilibreur de charge devrait probablement être le point d'entrée dans le système qui communique avec les conteneurs utilisant le réseau interne.
  • Mon service est-il même capable de fonctionner dans un environnement en cluster (plusieurs instances du conteneur)?

Vous pouvez bien sûr faire des choses sales dans dev, telles que le mappage dans les volumes hôtes pour le stockage persistant (et de nombreuses personnes qui utilisent docker standalone dans prod le font aussi).

Idéalement, nous devrions séparer docker en dev et docker i prod. Docker est un outil fantastique au cours du développement, car vous pouvez avoir redis, memcached, postgres, mongodb, rabbitmq, node ou autre, opérationnel en quelques minutes, partageant cette configuration avec le reste de l'équipe. Docker in prod peut être une bête complètement différente.

Je voudrais aussi ajouter que je suis généralement contre le fanatisme selon lequel "tout devrait fonctionner en docker" dans prod. Exécutez les services dans docker quand cela a du sens. Il n’est pas rare non plus que les grandes entreprises créent leurs propres images de base. Cela peut prendre beaucoup de travail et nécessitera de la maintenance pour suivre les correctifs de sécurité, etc. Ce n'est pas nécessairement la première chose à laquelle vous sautez lorsque vous démarrez avec docker.

37
Grimmy