对于 Java应用程序,我的问题可以改为: Pros and cons of docker or other container 。
我找到了大量有关Docker和VM的信息,但是找不到关于Docker优势Java的文章。
Java程序已作为JVM进程运行,它已经是“所谓的” 虚拟机。为什么许多IT人员想要在docker中运行Java程序?
有一些工具可以帮助管理Docker容器:kubernetes,docker-compose,Docker Swarm等。使用任何自定义配置,都可以轻松轻松地部署整个应用程序(例如微服务架构):{{ 1}}和docker-compose up
定义配置。使用此类工具进行编排和缩放也很容易。
是否可以通过与管理容器类似的方式来管理JVM(Java虚拟机)?那里有这样的工具或技术吗?我想到的一种硬编码的受限解决方案是制作bash脚本以部署所有应用程序堆栈。
在使用容器之前,我们将在云中的虚拟机中运行我们的应用程序。但是虚拟机很昂贵(运行您的应用程序需要更多的资源,此外还有主机操作系统和VM OS)。 Docker技术允许使用主机OS(assuming that container and host OS have the same kernel,例如两者都基于Linux)在容器内运行您的应用程序进程。
容器的另一个好处是易于开发。无需为应用程序安装不同的依赖项(数据库,缓存,应用程序服务器,代理服务器等),而是可以获取所需的图像并从中运行容器,而无需在开发计算机上安装这些依赖项。
但是,为什么不在主机上运行JVM进程进行生产呢?例如,我们有五个容器,并且我们知道它们将在那里运行Java进程(这很重要;否则,对每个技术堆栈使用单独的容器是有意义的)。因此,我们可以有一台装有JRE的主机,并且可以在其中运行5个没有容器的JVM进程。为什么不呢?
答案 0 :(得分:1)
正如您在问题的最后一部分所说,容器比VM便宜得多,因为它不能虚拟化硬件和整个OS。
此外,在制作Docker映像时,仅抓取一个容器并使其立即运行非常容易。
答案 1 :(得分:1)
让我们想象一下,您正在主机上运行5个JVM进程。
怎么样:
-如果您的应用程序过载,您想扩展到其他主机(通过手动/脚本,配置代理,新节点的dns在其他主机上添加更多JVM进程)。使用docker Orchestration工具,您只需单击或部署即可扩展
-如果进程死了,您需要编写监视/ cron脚本以确保它仍然存在并在停止时重新启动。我们可以使用编排工具进行自我修复
编排工具还有很多想法:
Provisioning and deployment of containers
Redundancy and availability of containers
Scaling up or removing containers to spread application load evenly across host infrastructure
Movement of containers from one host to another if there is a shortage of resources in a host, or if a host dies
Allocation of resources between containers
External exposure of services running in a container with the outside world
Load balancing of service discovery between containers
Health monitoring of containers and hosts
Configuration of an application in relation to the containers running it
但是,业务流程工具的体系结构将很复杂。我们应该根据目的和当前架构来决定