Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有嵌入式或独立tomcat的Java docker容器?_Java_Spring_Spring Boot_Docker_Tomcat - Fatal编程技术网

带有嵌入式或独立tomcat的Java docker容器?

带有嵌入式或独立tomcat的Java docker容器?,java,spring,spring-boot,docker,tomcat,Java,Spring,Spring Boot,Docker,Tomcat,目前,我有一个tomcat Web服务器,它承载多个.war微服务(如果重要的话):spring引导应用程序。升级应用程序时,我使用tomcat并行部署特性,添加了myapp005.war、myapp006.war等,以实现零停机部署 我想把这些申请归档。但是什么最适合java应用程序Web服务应用程序呢 是否最好将war文件直接打包到容器中,以便每次重新部署都需要一个新的docker容器?或者tomcat应该作为一个没有应用程序的容器运行,并从共享主机系统文件夹装载war文件,从而在没有doc

目前,我有一个tomcat Web服务器,它承载多个.war微服务(如果重要的话):spring引导应用程序。升级应用程序时,我使用tomcat并行部署特性,添加了myapp005.war、myapp006.war等,以实现零停机部署

我想把这些申请归档。但是什么最适合java应用程序Web服务应用程序呢

是否最好将war文件直接打包到容器中,以便每次重新部署都需要一个新的docker容器?或者tomcat应该作为一个没有应用程序的容器运行,并从共享主机系统文件夹装载war文件,从而在没有dockerimage的情况下提供重新部署

我可以想到以下三种可能性:

将每个war文件作为jar运行,而不是使用嵌入的tomcat,每个war文件都作为自己的docker容器运行?然后每个应用程序都是解耦的,但我不能再使用并行部署功能,因为我必须在另一个应用程序取代jar之前杀死它。如果这是最好的方法,那么问题是:如何使用docker容器实现零停机部署? 将每个war文件作为独立的tomcat运行,每个都作为自己的docker容器运行?然后,每个应用程序将被解耦,还可以利用并行部署。但是我必须为每个docker容器中的每个应用程序启动一个显式的tomcat Web服务器,这可能会对主机系统性能产生负面影响? 作为docker运行一个独立的tomcat,并将所有*.war文件放在一个共享文件夹中进行部署?在这里,我仍然可以使用并行部署特性。但这不是反对docker的想法吗?war应用程序不应该包装在容器中吗?性能和资源需求可能在这里最好,因为这只需要一个tomcat。
哪种方法适合java miroservices?

为每个Docker容器使用一个Jar部署无疑是最好的方法。正如您所提到的,低耦合是您希望从微服务获得的东西。滚动部署/金丝雀发布等可以通过Docker Swarm和Kubernetes等容器编排工具轻松完成

如果您想玩转这些概念,Docker Swarm相当简单:

在撰写文件中:

version: '3'

services:
    example:
        build: .
        image: example-image:1.0
        ports:
            - 8080:8080
        networks:
            - mynet
        deploy:
            replicas: 6
            update_config:
                parallelism: 2
                delay: 10s
            restart_policy:
                condition: on-failure
Docker Swarm只需要编写文件中的部署部分

副本告诉您将在swarm中部署6个应用程序实例 并行性将告诉您,将同时更新2个实例,而不是6个 更新之间将有10秒的宽限期延迟 如果您更新服务,将不会出现停机,因为Docker Swarm将通过仍在运行的4个容器来服务所有请求

我不推荐在生产环境中使用Docker Swarm,但它是一种很好的方法,可以用来处理容器编排的概念


库伯内特斯的学习曲线相当陡峭。例如,如果您在云中,AWS,像EKS、Fargate等服务可以为您消除很多复杂性。

为每个Docker容器使用单个Jar部署肯定是最好的方法。正如您所提到的,低耦合是您希望从微服务获得的东西。滚动部署/金丝雀发布等可以通过Docker Swarm和Kubernetes等容器编排工具轻松完成

如果您想玩转这些概念,Docker Swarm相当简单:

在撰写文件中:

version: '3'

services:
    example:
        build: .
        image: example-image:1.0
        ports:
            - 8080:8080
        networks:
            - mynet
        deploy:
            replicas: 6
            update_config:
                parallelism: 2
                delay: 10s
            restart_policy:
                condition: on-failure
Docker Swarm只需要编写文件中的部署部分

副本告诉您将在swarm中部署6个应用程序实例 并行性将告诉您,将同时更新2个实例,而不是6个 更新之间将有10秒的宽限期延迟 如果您更新服务,将不会出现停机,因为Docker Swarm将通过仍在运行的4个容器来服务所有请求

我不推荐在生产环境中使用Docker Swarm,但它是一种很好的方法,可以用来处理容器编排的概念


库伯内特斯的学习曲线相当陡峭。例如,如果您在云中,AWS,像EKS、Fargate等服务可以为您消除很多复杂性。

我认为您需要微服务的蓝绿色部署,它允许在零停机时间的情况下重新部署容器。共享war文件不是一个好主意,因为您需要遵循docker容器,您所需要的一切都必须在图像内部,docker compose文件除外。虽然这是一个主要基于观点的问题,但仍然是一个好问题。我认为您需要微服务的蓝绿色部署,它允许以零停机时间重新部署容器。共享war文件不是一个好主意,因为您需要遵循docker容器,您所需要的一切都必须在图像内部,docker compose文件除外。虽然这是一个主要基于观点的问题,但它
这仍然是一个好问题。感谢您的示例和详细解释!这将足以让我有一个运行的容器,只需在不停机的情况下热切换它们。docker swarm也可以这样做吗?除此之外,您知道是否有运行嵌入式tomcat而不是专用单机版的缺点吗?您需要临时扩展到至少两个。虽然新实例正在启动,但旧版本仍需要升级以服务请求。我的意思是,如果某个时间点上不存在服务实例,那么该服务在物理上不可能为请求提供服务。但是你可以用一个额外的docker命令来实现这一点,所以它不需要是你在docker compose文件中定义的一个永久性的东西。如果您只打算部署一个容器,我并不认为将其容器化有什么意义。您没有充分利用容器和容器编排可以为您提供的负载平衡、可用性、自动重新启动崩溃的应用程序等优势……我的全部目标是将应用程序解耦。如果使用单JAR,我需要docker提供零停机部署。不管怎样,我只举一个例子就可以了。当然,这将是一个专业能够负载平衡和规模的事情,如果需要在未来。有没有可能告诉docker swarm启动第二个实例进行部署,然后返回到仅1个实例,从而杀死旧版本?docker service scale exampleservice=2就可以了。docker服务更新-更新的图像newexampleserviceimage。默认情况下,docker swarm将一个接一个地更新您的服务实例-我认为-如果不是,您可以在您的撰写文件中或在使用-update parallelism标记创建服务时指定此项-谢谢您的示例和详细解释!这将足以让我有一个运行的容器,只需在不停机的情况下热切换它们。docker swarm也可以这样做吗?除此之外,您知道是否有运行嵌入式tomcat而不是专用单机版的缺点吗?您需要临时扩展到至少两个。虽然新实例正在启动,但旧版本仍需要升级以服务请求。我的意思是,如果某个时间点上不存在服务实例,那么该服务在物理上不可能为请求提供服务。但是你可以用一个额外的docker命令来实现这一点,所以它不需要是你在docker compose文件中定义的一个永久性的东西。如果您只打算部署一个容器,我并不认为将其容器化有什么意义。您没有充分利用容器和容器编排可以为您提供的负载平衡、可用性、自动重新启动崩溃的应用程序等优势……我的全部目标是将应用程序解耦。如果使用单JAR,我需要docker提供零停机部署。不管怎样,我只举一个例子就可以了。当然,这将是一个专业能够负载平衡和规模的事情,如果需要在未来。有没有可能告诉docker swarm启动第二个实例进行部署,然后返回到仅1个实例,从而杀死旧版本?docker service scale exampleservice=2就可以了。docker服务更新-更新的图像newexampleserviceimage。默认情况下,docker swarm将一个接一个地更新您的服务实例-我认为-如果不是,您可以在撰写文件中或在创建带有-update parallelism标记的服务时指定