在容器中运行Spring启动应用程序? 还是VM? 或虚拟机内的容器?

我有一个96G的RAM服务器,我想运行几个春季启动应用程序。 他们都需要MySql DB。

我很难决定利用服务器获得最佳隔离和性能的最佳方式。

我在想以下几点:

  1. 只为MySql服务器创build一个虚拟机
  2. 每个弹簧引导应用程序的VM

现在我应该直接在VM中运行mysql / spring启动,还是在docker中运行它们? 我看不到这样做的直接好处。 但如果以后如果我需要为我的应用程序创build一个集群,那么有一个docker的图像会更好?

或者,如果你是我,你会怎么做?

谢谢

你想要最好的隔离和性能?

信任您的Docker容器提供的隔离。 这是一个主要的devise目标。
不要添加不必要的层(例如,托pipeDocker容器的VM) – 添加VM层会产生性能影响,听起来像您不需要。

容纳MySQL需要思考,因为它本质上是有状态的。
如果你想这样做:我至less将状态(数据和可能的configuration)存储在容器外。

你可以逃避不使用集装箱MySQL。 我不觉得数据库适合集装箱使用的情况,因为:

  • 他们是有状态的
  • 缩放并不像“旋转另一个实例”那样微不足道(因为你必须build立奴隶,同步和存储很多状态)
  • 他们不经常更新
  • 更新并不像“交换到容器的较新版本”那么简单
  • 对于“在所有环境中使用相同的版本”的要求较less(即开发者在本地使用MariaDB 5.7,尽pipe生产使用了MySQL 5.6 …这是毫无用处的)

您还应该考虑使用托pipe数据库,如Amazon RDS。 我认识到你有一台高性能的计算机,你可以利用这个计算机,但是要衡量自己维护和扩展基础设施的运营成本是否值得。

是的:我会为每个Spring Boot应用程序创build一个容器,并直接运行这些容器。 正如我所说:信任Docker的隔离 – 或者至less查看是否被破坏,以及根据您的威胁模型(以及虚拟机是否已将您保存在任何已报告的漏洞情况下)是否是可接受的风险。

至于在哪里部署这些Docker容器(即在本地快速计算机上,还是部署到云中):取决于是否要优化运营成本(即更容易pipe理云上的所有内容,而不必与任何物理机械),或尝试充分利用您的快速计算机(并将所有内容直接部署到该计算机上)。

大概有一些方法可以远程pipe理快速计算机上的Docker容器的编排。 这可以给你很多的部署到云的好处。

你在找什么叫Docker Swarm。 它允许您部署泊坞窗(高效的虚拟容器),并通过任何努力来扩展它们。

为了“dockerize”你的spring引导应用程序,你只需要用Dockerfile构build一个图像,就像这样:

 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"] 

要构build这个图像,执行:

 docker build -t name-application-img . 

要将镜像作为Docker Swarm中的服务部署,请使用:

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

您可以创buildSpring Boot应用程序的Docker镜像,它们非常容易构build和扩展和缩小。 甚至为什么不把MySQL作为一个Docker映像移动,并将卷映射到磁盘。 如果您拥有Docker中的所有应用程序,他们将很容易pipe理(通过docker-compose)。

然而,缺点是,如果您有多个MySQL-DB容器,那么您不得不担心数据复制,并在多个数据库容器之间维护相同的数据库状态

如果我是你,我只需要dockerize Spring Boot应用程序!