2017-08-21 5 views
0

J'ai un serveur de RAM de 96G, je voudrais lancer quelques applications de démarrage de printemps là-dessus. Ils ont tous besoin de MySQL DB.Exécution de l'application de démarrage Spring dans un conteneur? ou une VM? ou un conteneur à l'intérieur d'une machine virtuelle?

J'ai du mal à décider quelle est la meilleure façon d'utiliser le serveur pour obtenir la meilleure isolation et les meilleures performances.

Je pense ce qui suit:

  1. Créer une machine virtuelle juste pour le serveur MySql
  2. Une machine virtuelle pour chaque application de démarrage ressort

Maintenant, dois-je amorcer le système mysql/printemps directement dans la VM, ou les exécuter dans docker? Je ne vois aucun avantage immédiat en faisant cela. Mais si plus tard si j'ai besoin de créer un cluster pour mes applications, alors avoir des images docker serait mieux?

Ou, si vous étiez moi, que feriez-vous?

Merci

Répondre

1

Vous voulez une meilleure isolation et performance?

Faites confiance à l'isolation fournie par votre conteneur Docker. C'est un objectif de conception primaire.
N'ajoutez pas de couches inutiles (c'est-à-dire une machine virtuelle à l'intérieur de laquelle héberger votre conteneur Docker) - l'ajout d'une couche VM entraînerait un impact sur les performances, et vous n'avez pas à le faire. Containerizing MySQL nécessite une réflexion, car il est intrinsèquement dynamique.
Si vous vouliez faire ceci: Je stockerais au moins l'état (données et peut-être config) en dehors du conteneur.

Vous pourriez sortir avec pas conteneuriser MySQL.Je ne pense pas que les bases de données sont un bon moyen pour l'utilisation cas de conteneurisation, parce que:

  • ils sont stateful
  • mise à l'échelle est pas aussi trivial que « spin une autre instance » (parce que vous devez établir asservissant et synchroniser et stocker beaucoup d'état)
  • qu'ils ne subissent pas de mises à jour souvent
  • mises à jour ne sont pas aussi trivial que « échange à la nouvelle version du conteneur »
  • il y a moins besoin de « l'utilisation la même version dans tous les environnements "(ie les développeurs utilisent localement MariaDB 5.7, malgré la production en utilisant MySQL 5.6 ... c'est plus ou moins bien)

Vous devriez également envisager d'utiliser une base de données gérée telle que Amazon RDS. Je reconnais que vous utilisez un ordinateur haute performance, mais cela vaut la peine de comparer les coûts opérationnels de maintenance et de mise à l'échelle de l'infrastructure. Et oui: Je ferais un conteneur par application Spring Boot, et j'exécuterais directement ces conteneurs. Comme je l'ai dit: faites confiance à l'isolement de Docker - ou au moins vérifiez si elle a été violée, et si c'est un risque acceptable selon votre modèle de menace (et si une VM vous aurait sauvé dans les cas de vulnérabilité signalés).

Quant à pour déployer ces conteneurs Docker (c.-à-localement sur votre ordinateur rapide, contre le déploiement vers le cloud): dépend si vous souhaitez optimiser les coûts de fonctionnement (il est plus facile de gérer tout sur le nuage et non avoir à interagir avec des machines physiques) ou essayer de tirer le meilleur parti de votre ordinateur rapide (et tout déployer directement sur cet ordinateur).

On peut supposer qu'il existe un moyen de gérer à distance l'orchestration des conteneurs Docker sur votre ordinateur rapide. Cela pourrait vous donner beaucoup d'avantages du déploiement dans le cloud.

+0

Merci pour votre suggestion. Après avoir lu votre réponse et d'autres réponses, j'ai réalisé que je n'ai pas besoin de beaucoup d'isolement. L'ajout d'une VM entre les deux introduit une complexité inutile, et aura également un coût de performance! Sans parler d'une adresse IPv4 :-) Une chose n'est pas sûre, MySql, si j'exécute tout ça sur mon serveur (16 cœurs, 32 threads), comment limiter les core/threads qu'il utilise? –

+0

sonne comme vous pouvez [définir 'max_connections' dans' my.ini'] (https://stackoverflow.com/a/621527/5257399) – Birchlabs

+0

@Brichlabs Merci! –

0

Vous pouvez créer des images Docker d'applications Spring Boot, ils sont si faciles à construire et à l'échelle de haut en bas. Pourquoi ne pas même déplacer MySQL comme une image Docker et mapper le volume sur votre disque. Si vous avez toutes les applications à l'intérieur du docker, elles seront faciles à gérer (via un docker-composer).

Cependant, l'inconvénient est que si vous avez plus d'un conteneur de MySQL DB alors vous avez à vous soucier de la réplication de données et de maintenir le même état de DB dans plusieurs conteneurs DB

Si je vous avais je le ferais juste dockerize les applications de démarrage de printemps!

+0

Merci de m'avoir donné votre point de vue! Je suis d'accord pour exécuter mysql dans un docker peut-être pas une bonne idée en ce moment. –

1

Ce que vous cherchez est Docker Swarm. Il vous permet de déployer des dockers (conteneurs virtuels efficaces) et de les mettre à l'échelle avec n'importe quel effort.

Pour "dockerize" vos applications de démarrage de printemps, il vous suffit de construire une image avec un Dockerfile, comme ceci:

FROM java:8 

VOLUME /tmp 

ADD spring-boot-0.0.1-SNAPSHOT.jar springboot-appname.jar 

RUN bash -c 'touch /springboot-appname.jar' 

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/springboot-appname.jar"] 

Pour construire cette image, exécutez:

docker build -t name-application-img . 

Pour déployer l'image en tant que service à l'intérieur du Docker Swarm, utilisez:

docker service create -p {exposed-port}:{private-port} --name {service-name} --replicas 1 name-application-img 
+0

Merci pour votre contribution. –