容器化技术的使用和优缺点

当前,容器化技术非常流行,各大小公司都在使用。那么容器化技术在实际项目中如何运用?有哪些优缺点?

容器化技术是什么

在容器化技术出现之前,部署系统非常麻烦,以一个简单的博客系统为例,博客系统设计如下:

  1. 前后端分离,分别独立开发和部署
  2. 前端使用vue,负责数据展示
  3. 后端java,使用spring框架,负责业务逻辑处理,给前端提供接口
  4. 数据库使用mariadb

这个系统该如何部署?

  1. 数据库部署 首先安装mariadb服务,再执行sql语句建库建表
  2. 后端的部署 先安装jdk。后端在构建后会生成jar包,因使用了spring框架,jar包是自带tomcat,配置好数据库地址和端口后,直接用java -jar命令运行即可
  3. 前端的部署 前端在构建后会生成静态文件,即是html、js、css文件,同时需要调用后端接口获取数据,用于展示。那么就需要部署nginx,nginx的配置文件需要指定静态文件的位置,同时需要配置后端服务的代理地址。

部署图如下:

部署图

这样部署有以下几个问题:

  1. 需要手动安装mariadb、jdk、nginx。可能遇到安装包损坏、权限不够等各种问题,且每个新环境都需要重新安装一遍。
  2. 手动执行sql语句,手动配置nginx,手动配置mariadb连接地址等。很容易配置错误,每个新环境都需要重新配置一遍。
  3. 升级需要替换jar包、前端静态文件等,非常复杂。

有没有一种方案能解决上述重复安装、重复配置、升级麻烦的苦恼?
有!
那就是容器化技术,代表技术是虚拟机和Docker
容器化技术最显著的特点是:自带环境。就是说容器自己带有应用运行需要的环境和全部依赖。

虚拟机大家都用过。在电脑上安装虚拟机软件,再安装操作系统,再安装其他需要的环境。再部署应用,其他地方需要部署的话,则将虚拟机文件拷贝到其他机器上。

Docker是个划时代的技术,它极大提高了应用的维护效率,降低了应用开发的成本!使用Docker,可以让应用的部署、测试和分发都变得前所未有的轻松!

什么是Docker,这里只做一个简单的介绍,详细的内容请查看Docker官网
Docker基于Linux内核的cgroup、namespace,以及OverlayFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,使得Docker技术比虚拟机技术更为轻便、快捷。

下面的图片比较了Docker和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

传统虚拟化
传统虚拟化

Docker
Docker

Docker同传统的虚拟化技术相比,有以下优点:

对比总结如下:

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

容器化技术怎么用

主要有以下几个步骤:

  1. docker安装
    首先需要安装docker环境,Docker官网有安装教程,Linux、Mac、Windows都支持。
  2. 镜像构建
    镜像是docker运行的基础,应用系统交付物即是镜像。镜像是一个特殊的文件,包含了运行时所需的程序、库、资源、配置、环境变量等参数。
    镜像的构建,都是依赖基本的镜像,再将应用集成进去。例如后端镜像,以包含了Linux及jdk环境的镜像为基础,再将应用的jar包放入镜像中,jar包在这个自闭的环境中运行,不受外界影响。
    实际应用中,会按照镜像类别分为:
    • 基础镜像
    • 初始化镜像
    • 后端镜像
    • 前端镜像

    以博客系统为例,需要构建哪些镜像呢?

    类别 名称 作用
    基础镜像 mariadb镜像 提供mariadb服务
    基础镜像 ngxin镜像 提供ngxin服务
    初始化镜像 sql镜像 建库建表,一般只执行一次
    初始化镜像 ngxin配置镜像 前端静态文件处理,后端接口代理
    后端镜像 java镜像 博客后端服务
    前端镜像 静态文件镜像 前端界面

    上述不同类别的镜像有不同的生成方式,后面的文章再进行讲解。

  3. 镜像的运行
    镜像依赖docker环境运行,即是启动了一个容器。容器可理解为一个进程,除了可以提供服务外,也可以通过目录映射,读写宿主机上的文件。

    这么多镜像需要一个一个的启动吗?那工作量很大。需要进行统一的管理维护。

    可以为博客系统生成一个shell文件,文件中主要使用 docker run 命令写明了运行容器需要的镜像名称、环境变量等,也指明了镜像启动的先后顺序,例如基础镜像最先启动,再启动初始化镜像,再启动后端镜像,最后启动前端镜像。

    也可以使用 docker compose 来维护容器,会生成一个yaml文件,写明了镜像名称、环境变量等,需要在安装了docker compose的环境中运行。

    容器管理可以使用Portainer,或者使用 K8S

    以上的shell文件、docker compose yaml文件,只需要做少许的配置,例如换IP等,就可以在任何一个装有docker的环境中使用一条命令将博客系统运行起来,省去了安装软件、做各种配置等操作,而且无论哪个环境运行,博客系统的表现都是一致的。

总结

  1. 自带环境使得镜像保持了一致性,不会出现环境问题、配置问题等
  2. 更方便分发和维护
docker