我的问题可以改为:Pros and cons of docker or other container for Java application。
我发现了大量关于Docker和VM的信息,但是我找不到一篇关于Docker优势中的Java的文章。
Java程序作为JVM进程运行,已经是“所谓的”虚拟机。为什么许多IT人员想要在docker中运行Java程序?
有一些工具可以帮助管理docker容器:kubernetes,docker-compose,Docker Swarm等。使用任何自定义配置轻松部署整个应用程序(例如微服务架构):docker-compose up
和docker-compose.yml
定义了组态。使用这些工具进行编排和扩展也很容易。
是否可以像管理容器一样管理JVM(Java虚拟机)?那里有这样的工具或技术吗?我想到的一个硬编码有限解决方案是使bash脚本部署所有应用程序堆栈。
在容器之前,我们将在云中的虚拟机中运行我们的应用程序。但是虚拟机很昂贵(运行应用程序需要更多资源,还有主机操作系统和VM OS)。 Docker技术允许使用主机操作系统(assuming that container and host OS have the same kernel,例如基于Linux的两者)在容器内运行应用程序进程。
容器的另一个好处是易于开发。您可以获得所需的图像并从中运行容器,而无需在您的开发计算机上安装这些依赖项,而不是为您的应用程序(数据库,缓存,应用程序服务器,代理服务器等)安装不同的依赖项。
但是,为什么不在主机上运行JVM进程进行生产?例如,我们有五个容器,我们知道它们将在那里运行Java进程(这很重要;否则为每个技术堆栈使用单独的容器是有意义的)。因此我们可以安装一台安装了JRE的主机,并且我们可以在没有容器的情况下运行5个JVM进程。为什么不?
正如您在问题的最后一点所说,容器比VM便宜得多,因为它不会将硬件和操作系统整体虚拟化。
此外,在制作Docker镜像时,只需抓住容器并使其立即运行即可轻松实现。
我们假设您在主机上运行了5个JVM进程。 如果: - 如果应用程序过载,您希望扩展到其他主机(手动/脚本,配置代理,dns为新节点在其他主机上添加更多JVM进程)。使用docker业务流程工具,您只需单击或部署即可扩展 - 如果进程死了怎么样,你需要编写监控/ 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
虽然,编排工具的架构会很复杂。我们应该根据目的和当前的架构来决定