【问题标题】:Running Spring boot application in a container? or a VM? or a container inside a VM? [closed]在容器中运行 Spring Boot 应用程序?还是虚拟机?还是虚拟机内的容器? [关闭]
【发布时间】:2018-01-29 09:43:25
【问题描述】:

我有一个 96G 内存的服务器,我想在上面运行一些 spring boot 应用程序。他们都需要MySql DB。

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

我正在考虑以下几点:

  1. 为 MySql 服务器创建一个虚拟机
  2. 每个 Spring Boot 应用程序都有一个 VM

现在我应该直接在 VM 中运行 mysql/spring boot,还是在 docker 中运行它们?我看不出这样做有什么立竿见影的好处。但是如果以后我需要为我的应用程序创建一个集群,那么拥有一个 docker 镜像会更好吗?

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

谢谢

【问题讨论】:

    标签: mysql docker spring-boot kubernetes virtualization


    【解决方案1】:

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

    相信您的 Docker 容器提供的隔离。这是一个主要的设计目标。
    不要添加不必要的层(例如,在其中托管 Docker 容器的 VM)——添加 VM 层会影响性能,听起来您不必这样做。

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

    你可以侥幸将 MySQL 容器化。我认为数据库不适合容器化用例,因为:

    • 它们是有状态的
    • 扩展并不像“启动另一个实例”那么简单(因为您必须建立从属,并同步和存储大量状态)
    • 他们不经常更新
    • 更新并不像“换到新版本的容器”那么简单
    • “在所有环境中使用相同版本”的要求较少(即开发人员在本地使用 MariaDB 5.7,尽管生产环境使用 MySQL 5.6……这还是很好的)

    您还应该考虑使用托管数据库,例如 Amazon RDS。我知道您拥有一台想要使用的高性能计算机,但值得将其与自己维护和扩展基础架构的运营成本进行权衡。

    是的:我会为每个 Spring Boot 应用程序创建一个容器,然后直接运行这些容器。正如我所说:相信 Docker 的隔离性——或者至少查看它是否被破坏,以及根据您的威胁模型这是否是可接受的风险(以及 VM 是否会在任何报告的漏洞案例中拯救您)。

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

    大概有一些方法可以远程管理快速计算机上 Docker 容器的编排。这可以为您带来很多部署到云端的好处。

    【讨论】:

    • 感谢您的建议。在阅读了您的答案和其他人的答案后,我意识到我不需要那么多的孤立。在两者之间添加虚拟机会引入不必要的复杂性,并且还会产生性能成本!更不用说 IPv4 地址 :-) 不确定的一件事是 MySql,如果我在我的服务器上运行所有这些(16 核,32 线程),我如何限制它使用的核心/线程?
    • 听起来你可以set max_connections in my.ini
    • @Brichlabs 谢谢!
    【解决方案2】:

    您正在寻找的是所谓的 Docker Swarm。它允许您部署 docker(高效的虚拟容器)并毫不费力地扩展它们。

    要“dockerize”你的 Spring Boot 应用程序,你只需要使用 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
    

    【讨论】:

    • 感谢您的意见。
    【解决方案3】:

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

    但是,缺点是如果您有多个 MySQL-DB 容器,那么您必须担心数据复制和跨多个 DB 容器维护相同的 DB 状态

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

    【讨论】:

    • 感谢您给我您的观点!我同意目前在 docker 中运行 mysql 可能不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多