Code前端首页关于Code前端联系我们

有了docker容器技术,为什么我们还需要在生产环境部署虚拟机呢?

terry 2年前 (2023-09-28) 阅读数 83 #未命名

互联网公司生产环境应用实施的过程大致可分为三个阶段:

  • 物理机实施
  • 虚拟机实施
  • 容器化部署 P♿安装机P♿纯物理机的应用是所有早期物联网公司都必须经历的一个阶段。服务器至少需要32核CPU和64G内存。只部署一个应用程序是一种浪费。因此,同一台机器上安装了多个应用程序进程、DB、缓存进程等。虽然这样的实现可以有效利用昂贵的物理机,但这种简单粗暴的方法有一个很大的痛点:进程间的资源抢占。如果一个进程使用了​​100%的CPU资源,其他进程就无法提供服务。或者一个进程突然出现很多异常,日志占满磁盘,所有进程都会挂掉。进程间抢占资源导致其他进程无法提供服务而造成的杀机不计其数。我想很多同学都遇到过这个问题。
    由于问题是资源共享造成的,解决办法是:进程间硬件资源隔离。虚拟机技术的出现解决了这个难题。

    虚拟机部署时代

    有了docker容器技术,生产环境为何还需要部署虚拟机?

    虚拟机通过硬件进行虚拟化,即预先从物理机分配CPU核心数、内存数和磁盘数。每个虚拟机通常只部署一个应用程序。这样就解决了进程间资源隔离的问题。不同的进程运行在不同的虚拟机上,都相安无事,相互之间没有联系,直至死亡。自然不存在资源冲突。一台物理机可以部署多个虚拟机,物理机中的所有虚拟机均由虚拟机管理系统管理。

    虚拟机技术解决了物理机安装的痛点。但虚拟机并不完美,它也有自己的缺点。在大型集群部署的情况下,软件版本和配置文件很容易碎片化。

    大型应用集群中的虚拟机首次安装时,由于操作系统镜像相同,软件版本和库依赖关系初步统一。随着时间的推移,开源软件(tomcat、jdk、nginx)必须逐步升级,于是运维同学开始批量升级集群软件版本。批量升级可能会有遗漏或者升级失败。同时,一些开发人员会登录机器更改软件的版本或配置,以满足自己的需求。随着时间的推移,应用集群中虚拟机的软件版本和配置逐渐碎片化。当线上出现问题,需要从基础软件层面排查时,由于软件版本碎片化,故障排查变得困难。

    为了解决虚拟机实现的痛点,容器技术应运而生。

    容器部署时代

    有了docker容器技术,生产环境为何还需要部署虚拟机?

    容器技术不仅限于docker,但docker是目前最流行的。我以docker为例来谈谈容器。 docker容器技术的核心之一在于镜像文件。
    镜像文件通俗的理解是进程运行时所依赖的软件文件的容器。
    部署应用集群时,每台机器首先拉取指定版本的镜像文件。安装镜像后,会生成一个docker容器。由于所有机器上的镜像文件都是相同的,所以容器的软件版本也是相同的。即使容器的软件版本在开发或运维过程中发生变化,当容器被销毁时,软件的变化也会随着容器的销毁而被销毁。当使用现有镜像文件重新安装应用程序时,生成的 Docker 容器与更改之前的容器完全相同。这也是基础设施即代码思想的好处。

    如果要升级容器的软件版本,需要更改镜像文件。这样集群中的所有机器在安装时都会再次拉取新的镜像,一起升级软件。软件版本混乱的问题已经被docker完美的解决了。

    一个问题:有了容器技术,为什么生产环境还需要部署虚拟机?

    虚拟机可以实现硬件资源的完全隔离,而docker不能。虚拟机和docker各有所长,CP是最好的。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门