当前,容器化技术非常流行,各大小公司都在使用。那么容器化技术在实际项目中如何运用?有哪些优缺点?
容器化技术是什么
在容器化技术出现之前,部署系统非常麻烦,以一个简单的博客系统为例,博客系统设计如下:
- 前后端分离,分别独立开发和部署
- 前端使用vue,负责数据展示
- 后端java,使用spring框架,负责业务逻辑处理,给前端提供接口
- 数据库使用mariadb
这个系统该如何部署?
- 数据库部署
首先安装mariadb服务,再执行sql语句建库建表 - 后端的部署
先安装jdk。后端在构建后会生成jar包,因使用了spring框架,jar包是自带tomcat,配置好数据库地址和端口后,直接用java -jar命令运行即可 - 前端的部署
前端在构建后会生成静态文件,即是html、js、css文件,同时需要调用后端接口获取数据,用于展示。那么就需要部署nginx,nginx的配置文件需要指定静态文件的位置,同时需要配置后端服务的代理地址。
部署图如下:
这样部署有以下几个问题:
- 需要手动安装mariadb、jdk、nginx。可能遇到安装包损坏、权限不够等各种问题,且每个新环境都需要重新安装一遍。
- 手动执行sql语句,手动配置nginx,手动配置mariadb连接地址等。很容易配置错误,每个新环境都需要重新配置一遍。
- 升级需要替换jar包、前端静态文件等,非常复杂。
有没有一种方案能解决上述重复安装、重复配置、升级麻烦的苦恼?
有!
那就是容器化技术,代表技术是虚拟机和Docker
容器化技术最显著的特点是:自带环境。就是说容器自己带有应用运行需要的环境和全部依赖。
虚拟机大家都用过。在电脑上安装虚拟机软件,再安装操作系统,再安装其他需要的环境。再部署应用,其他地方需要部署的话,则将虚拟机文件拷贝到其他机器上。
Docker是个划时代的技术,它极大提高了应用的维护效率,降低了应用开发的成本!使用Docker,可以让应用的部署、测试和分发都变得前所未有的轻松!
什么是Docker,这里只做一个简单的介绍,详细的内容请查看Docker官网
Docker基于Linux内核的cgroup、namespace,以及OverlayFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,使得Docker技术比虚拟机技术更为轻便、快捷。
下面的图片比较了Docker和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
传统虚拟化
Docker
Docker同传统的虚拟化技术相比,有以下优点:
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
对比总结如下:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
容器化技术怎么用
主要有以下几个步骤:
-
docker安装
首先需要安装docker环境,Docker官网有安装教程,Linux、Mac、Windows都支持。 -
镜像构建
镜像是docker运行的基础,应用系统交付物即是镜像。镜像是一个特殊的文件,包含了运行时所需的程序、库、资源、配置、环境变量等参数。
镜像的构建,都是依赖基本的镜像,再将应用集成进去。例如后端镜像,以包含了Linux及jdk环境的镜像为基础,再将应用的jar包放入镜像中,jar包在这个自闭的环境中运行,不受外界影响。
实际应用中,会按照镜像类别分为:- 基础镜像
- 初始化镜像
- 后端镜像
- 前端镜像
以博客系统为例,需要构建哪些镜像呢?
类别 名称 作用 基础镜像 mariadb镜像 提供mariadb服务 基础镜像 ngxin镜像 提供ngxin服务 初始化镜像 sql镜像 建库建表,一般只执行一次 初始化镜像 ngxin配置镜像 前端静态文件处理,后端接口代理 后端镜像 java镜像 博客后端服务 前端镜像 静态文件镜像 前端界面 上述不同类别的镜像有不同的生成方式,后面的文章再进行讲解。
-
镜像的运行
镜像依赖docker环境运行,即是启动了一个容器。容器可理解为一个进程,除了可以提供服务外,也可以通过目录映射,读写宿主机上的文件。这么多镜像需要一个一个的启动吗?那工作量很大。需要进行统一的管理维护。
可以为博客系统生成一个shell文件,文件中主要使用 docker run 命令写明了运行容器需要的镜像名称、环境变量等,也指明了镜像启动的先后顺序,例如基础镜像最先启动,再启动初始化镜像,再启动后端镜像,最后启动前端镜像。
也可以使用 docker compose 来维护容器,会生成一个yaml文件,写明了镜像名称、环境变量等,需要在安装了docker compose的环境中运行。
容器管理可以使用Portainer,或者使用 K8S
以上的shell文件、docker compose yaml文件,只需要做少许的配置,例如换IP等,就可以在任何一个装有docker的环境中使用一条命令将博客系统运行起来,省去了安装软件、做各种配置等操作,而且无论哪个环境运行,博客系统的表现都是一致的。
总结
- 自带环境使得镜像保持了一致性,不会出现环境问题、配置问题等
- 更方便分发和维护