运行 Spring 在容器中启动应用程序?还是虚拟机?或虚拟机内的容器?
Running Spring boot application in a container? or a VM? or a container inside a VM?
我有一个 96G 内存的服务器,我想在上面 运行 几个 spring 启动应用程序。他们都需要 MySql DB.
我很难决定什么是利用服务器获得最佳隔离和性能的最佳方式。
我在想以下几点:
- 为 MySql 服务器创建一个 VM
- 每个 spring 引导应用程序一个 VM
现在我应该 运行 mysql/spring 直接在 VM 中启动,还是 运行 它们在 docker 中启动?我看不出这样做有什么立竿见影的好处。但是如果以后我需要为我的应用程序创建一个集群,那么有一个 docker 图像会更好吗?
或者,如果你是我,你会怎么做?
谢谢
您可以创建 Spring 引导应用程序的 Docker 图像,它们非常容易构建和放大和缩小。为什么不将 MySQL 也作为 Docker 图像移动并将卷映射到您的磁盘。如果您在 docker 中拥有所有应用程序,它们将易于管理(通过 docker-compose)。
然而,缺点是如果您有多个 MySQL-DB 容器,那么您必须担心数据复制和跨多个数据库容器维护相同的数据库状态
如果我是你,我会docker调整 Spring 引导应用程序!
您正在寻找的是 Docker Swarm。它允许您部署 docker(高效的虚拟容器)并随心所欲地扩展它们。
要 "dockerize" 您的 spring 引导应用程序,您只需构建一个带有 Docker 文件的映像,如下所示:
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
您想要最好的隔离和性能?
相信您的 Docker 容器提供的隔离。这是一个初级设计 objective。
不要添加不必要的层(即在其中托管 Docker 容器的 VM)——添加 VM 层会影响性能,听起来您不必这样做。
容器化 MySQL 需要思考,因为它本质上是有状态的。
如果您想这样做:我至少会将状态(数据和可能配置)存储在容器之外。
您可以 而不是 容器化 MySQL。我认为数据库不适合容器化用例,因为:
- 它们是有状态的
- 缩放并不像"spin up another instance"那么简单(因为你必须建立从属关系,并同步和存储大量状态)
- 他们不经常更新
- 更新不像 "swap to the newer version of the container"
那样微不足道
- 对 "use the same version in all environments" 的要求较低(即开发人员在本地使用 MariaDB 5.7,尽管生产环境使用 MySQL 5.6……这或多或少没问题)
您还应该考虑使用托管数据库,例如 Amazon RDS。我知道您有一台想要使用的高性能计算机,但值得权衡一下自己维护和扩展基础架构的运营成本。
是的:我会为每个 Spring 引导应用程序创建一个容器,然后直接 运行 这些容器。正如我所说:信任 Docker 的隔离——或者至少查看它是否被破坏,以及根据你的威胁模型这是否是一个可接受的风险(以及 VM 是否会在任何报告的案例中拯救你漏洞)。
至于在哪里部署这些Docker容器(即在您的快速计算机本地,而不是部署到云):取决于您是否要优化操作成本(即更容易管理云上的所有内容,而不必与任何物理机器交互)或尝试充分利用您的快速计算机(并将所有内容直接部署到该计算机)。
大概有一些方法可以远程管理 Fast Computer 上 Docker 容器的编排。这会给您带来很多部署到云的好处。
我有一个 96G 内存的服务器,我想在上面 运行 几个 spring 启动应用程序。他们都需要 MySql DB.
我很难决定什么是利用服务器获得最佳隔离和性能的最佳方式。
我在想以下几点:
- 为 MySql 服务器创建一个 VM
- 每个 spring 引导应用程序一个 VM
现在我应该 运行 mysql/spring 直接在 VM 中启动,还是 运行 它们在 docker 中启动?我看不出这样做有什么立竿见影的好处。但是如果以后我需要为我的应用程序创建一个集群,那么有一个 docker 图像会更好吗?
或者,如果你是我,你会怎么做?
谢谢
您可以创建 Spring 引导应用程序的 Docker 图像,它们非常容易构建和放大和缩小。为什么不将 MySQL 也作为 Docker 图像移动并将卷映射到您的磁盘。如果您在 docker 中拥有所有应用程序,它们将易于管理(通过 docker-compose)。
然而,缺点是如果您有多个 MySQL-DB 容器,那么您必须担心数据复制和跨多个数据库容器维护相同的数据库状态
如果我是你,我会docker调整 Spring 引导应用程序!
您正在寻找的是 Docker Swarm。它允许您部署 docker(高效的虚拟容器)并随心所欲地扩展它们。
要 "dockerize" 您的 spring 引导应用程序,您只需构建一个带有 Docker 文件的映像,如下所示:
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
您想要最好的隔离和性能?
相信您的 Docker 容器提供的隔离。这是一个初级设计 objective。
不要添加不必要的层(即在其中托管 Docker 容器的 VM)——添加 VM 层会影响性能,听起来您不必这样做。
容器化 MySQL 需要思考,因为它本质上是有状态的。
如果您想这样做:我至少会将状态(数据和可能配置)存储在容器之外。
您可以 而不是 容器化 MySQL。我认为数据库不适合容器化用例,因为:
- 它们是有状态的
- 缩放并不像"spin up another instance"那么简单(因为你必须建立从属关系,并同步和存储大量状态)
- 他们不经常更新
- 更新不像 "swap to the newer version of the container" 那样微不足道
- 对 "use the same version in all environments" 的要求较低(即开发人员在本地使用 MariaDB 5.7,尽管生产环境使用 MySQL 5.6……这或多或少没问题)
您还应该考虑使用托管数据库,例如 Amazon RDS。我知道您有一台想要使用的高性能计算机,但值得权衡一下自己维护和扩展基础架构的运营成本。
是的:我会为每个 Spring 引导应用程序创建一个容器,然后直接 运行 这些容器。正如我所说:信任 Docker 的隔离——或者至少查看它是否被破坏,以及根据你的威胁模型这是否是一个可接受的风险(以及 VM 是否会在任何报告的案例中拯救你漏洞)。
至于在哪里部署这些Docker容器(即在您的快速计算机本地,而不是部署到云):取决于您是否要优化操作成本(即更容易管理云上的所有内容,而不必与任何物理机器交互)或尝试充分利用您的快速计算机(并将所有内容直接部署到该计算机)。
大概有一些方法可以远程管理 Fast Computer 上 Docker 容器的编排。这会给您带来很多部署到云的好处。