web-dev-qa-db-fra.com

Exécuter plusieurs compositions de docker

J'utilise une application qui fonctionne sur 3 dockers différents:

  • Le premier est le serveur HTTP appelable avec une API REST
  • Le deuxième est rabbitmq
  • Le troisième est un travailleur

L'application entière est lancée avec docker-compose up

Vraiment simple :)

Je voudrais le rendre évolutif et exécuter plusieurs instances de cette application entière (les 3 images de docker) indépendamment des autres, puis mettre un équilibreur de charge comme haproxy qui redirigera vers l'une des applications.

J'ai vu que je peux utiliser docker-compose up --scale blablabla cependant le problème est que je peux faire évoluer les conteneurs, mais je veux vraiment garder les différentes "applications" indépendantes.

Par exemple, si je veux une version 3 de l'application, j'aurai 9 images dockers, etc.

J'ai vu que nous pouvons exécuter docker dans docker avec --privilege (me permettant de créer un docker avec les 3 dockers à l'intérieur) mais j'ai lu sur Stack Overflow que ce n'était pas une solution appropriée.

Avez-vous une solution? Ou au moins quelques documents à lire.

J'ai entendu dire que Kubernetes pouvait être une solution mais je n'en suis pas sûr. Je lis (sur pile)

Si vous avez besoin de plusieurs conteneurs étroitement liés, vous voudrez peut-être regarder Kubernetes qui exécute docker à l'intérieur de leurs "pods"

15
Geoffrey

Il semble que vous souhaitiez simplement que 3 environnements différents ou "piles" de votre application Compose s'exécutent indépendamment les uns des autres. Si tel est le cas, vous pouvez gérer cela avec le --project-name ou -p option pour docker-compose. Un exemple serait quelque chose comme ceci:

  • Lancer la version 1 de l'application: docker-compose -p appv1 up -d
  • Lancer la version 2 de l'application: docker-compose -p appv2 up -d
  • Lancer l'application version 3: docker-compose -p appv3 up -d

À ce stade, vous disposez de 3 ensembles de conteneurs différents qui peuvent évoluer indépendamment les uns des autres. Docker Compose ajoutera le nom du projet (qui est généralement déduit du nom du dossier) aux noms des conteneurs. Vous vous retrouverez avec des noms de conteneurs tels que appv1_worker_1, appv2_worker_1, appv3_worker1. Si vous deviez mettre à l'échelle uniquement appv2 service aux travailleurs (docker-compose -p appv2 scale worker=2) vous obtiendrez alors appv2_worker_2.

Par défaut, compose crée toujours un réseau par défaut dans lequel les conteneurs peuvent parler. Dans ce cas, vous auriez 3 réseaux indépendants (appv1_default, appv2_default, et appv3_default).

Si vous souhaitez ensuite exécuter différentes images pour chaque nom de projet, vous pouvez utiliser l'interpolation de variable d'environnement dans le docker-compose.yml. Par exemple, vous pouvez spécifier image: ${MYIMAGE} pour un service, puis faites quelque chose comme:

  • MYIMAGE=myorg/myapp:v1 docker-compose -p appv1 up -d
  • MYIMAGE=myorg/myapp:v2 docker-compose -p appv2 up -d

J'espère que cela vous sera utile comme idée de le faire à l'intérieur de Docker Compose.

30
Andy Shinn

Si vous souhaitez exécuter plusieurs fichiers Docker-compose à la fois à partir d'une seule commande, utilisez cette méthode. Si les fichiers de composition sont docker-compose1.yml et docker-compose2.yml, vous pouvez exécuter les deux fichiers docker à l'aide de,

docker-compose -f docker-compose1.yml -f docker-compose2.yml up

4
Tharindu Pradeep