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

时间:2017-08-21 10:39:08

标签: mysql docker spring-boot kubernetes virtualization

我有一台96G RAM服务器,我想在它上面运行一些Spring启动应用程序。他们都需要MySql DB。

我很难确定利用服务器获得最佳隔离和性能的最佳方法是什么。

我正在考虑以下事项:

  1. 仅为MySql服务器创建VM
  2. 每个春季启动应用程序的VM
  3. 现在我应该直接在VM中运行mysql / spring启动,还是在docker中运行它们?这样做,我看不到任何直接的好处。但是如果我以后需要为我的应用程序创建一个集群,那么拥有一个docker图像会更好吗?

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

    由于

3 个答案:

答案 0 :(得分:1)

您正在寻找的是Docker Swarm。它允许您部署docker(高效虚拟容器)并随意扩展它们。

To" dockerize"你的春季启动应用程序,你只需要使用Dockerfile构建一个图像,如下所示:

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

要构建此图像,请执行:

docker build -t name-application-img .

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

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

答案 1 :(得分:1)

您想要最佳隔离和性能吗?

信任Docker容器提供的隔离。这是一个主要的设计目标 不要添加不必要的层(即托管Docker容器的VM) - 添加VM层会对性能产生影响,听起来你不必这样做。

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

你可以通过而不是来控制MySQL。我不认为数据库非常适合集装箱用例,因为:

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

您还应该考虑使用托管数据库,例如Amazon RDS。我知道你有一台你想要使用的高性能计算机,但是值得权衡这一点与自己维护和扩展基础设施的运营成本相比。

是的:我会为每个Spring Boot应用程序创建一个容器,并直接运行这些容器。正如我所说的那样:相信Docker的孤立 - 或至少查看它是否被破坏,以及根据您的威胁模型这是否是可接受的风险(以及VM是否会在任何报告的漏洞情况下保存您)。

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

据推测,有一些方法可以远程管理快速计算机上Docker容器的编排。这可以为您提供部署到云的许多好处。

答案 2 :(得分:0)

您可以创建Spring Boot应用程序的Docker镜像,它们易于构建和扩展和缩放。为什么不将MySQL作为Docker镜像移动并将卷映射到磁盘。如果你有docker里面的所有应用程序,它们将很容易管理(通过docker-compose)。

然而,缺点是如果你有多个MySQL-DB容器,那么你必须担心数据复制并在多个数据库容器中保持相同的DB状态

如果我是你,我会把Spring Boot应用程序停靠!