切换界面风格
为什么丰盘要构建在Docker技术之上
丰盘ECM产品采用Docker技术进行构建,为了让您更好的了解丰盘系统的技术架构,这里需要对Docker技术做一些基础介绍。如果您对Docker技术已经很了解了,可以忽略本章节。
传统运维技术的挑战
随着技术的更新迭代,服务端软件架构日趋复杂,使用单一技术栈往往无法解决问题,通常软件会包含多种技术栈所构建的组件。例如一个主流BS架构的简单应用(基于浏览器-服务端的应用架构)通常包含 前端HTML静态网站、api服务,数据库 三个技术栈差异很大的组件。
传统运维技术下,我们需要先在Linux或者Windows主机上安装好数据库,在不同操作系统之间的安装方式差异极大,即便是Linux,也会面临不同发行版或者不同CPU架构如x86、ARM、MPIS等软件包文件二进制不兼容的问题,而基于源码安装的话编译环境和参数也会有很大差异;对于MySQL还是PostgreSQL,习惯了一种数据库的运维人员不一定能够很轻松的快速配置好另外一种数据库。
然后开始部署后端api服务了,如果厂商使用的技术是PHP,那么需要安装好PHP的运行环境,基于web fastcgi配置的PHP环境和独立的PHP环境又有所差别;如果是基于Java/DotNet环境,则需要安装相应的JVM或CLR Runtime,同样的会面临操作系统上的部署差异。如果api服务采用了时下流行的微服务进行拆解,就从一个单一组件变成了多个组件,还需要增加一个流量聚合网关作为反向代理(避免浏览器侧访问多个端口地址),整体架构又变得更加复杂了。
对于前端HTML静态网站相对是最简单的,但也有很多种选择,可以直接通过PHP、Java、DotNet等环境直接代为托管,也可以使用Nginx或Apache纯粹的Web服务器托管性能更佳,细节又会有很多差异。如果要开启HTTPS证书,那么不同环境的配置方法又有极大的差异。
最后一步,是配置各个组件之间的相互通讯,例如浏览器访问的站点如何知道该访问哪个地址的api服务,api服务需要知道数据库的通讯端口,每个企业的运维管理规范可能又有不同,有些端口不让开放。
以上仅仅是一个架构较为简单的应用软件的传统构建和部署方式。
而上述麻烦带来的工作量是,厂商研发人员需要花大量时间去适配各种环境,而企业客户的运维人员也需要从多种方案里自行拼凑出可用的方案,并自行解决官方文档未能覆盖到的场景和问题。
Docker如何破局
而如果基于Docker技术,我们又该如何安装一个PostgreSQL数据库呢?
在支持Docker的操作系统上安装好Docker环境之后(此项步骤相对简单),只需要运行以下同一条指令,即可神奇的在所有Linux发行版、Windows环境上、x86或ARM系列CPU上运行起一个PostgreSQL实例,且数据库的配置均保持一致:
bash
docker run -d --name pgsql -e POSTGRES_PASSWORD=123456 -p 5432:5432 postgres
上述命令里末尾的 postgres 代表了PostgreSQL开源社区封装好的一个镜像(稍后再解释什么是镜像),如果我们的软件对PostgreSQL数据库做了最佳实践的配置,同时还预装了一些软件依赖的数据库插件,重新打包成一个叫 xpan-db 的镜像存放到公共仓库里,那么用户只需要把镜像名称修改一下重新运行,即可立即用上我们预配置的最佳环境。
bash
docker run -d --name pgsql -e POSTGRES_PASSWORD=123456 -p 5432:5432 xpan-db
对运维自动化脚本比较熟悉的技术人员可能会认为,在网上也能找到很多别人封装好的一键自动化安装脚本,不管哪个操作系统都能方便的安装。但事实上,大多数组件的运维自动化脚本对环境的敏感性非常高,非常脆弱,哪怕系统多安装了一个不同版本冲突的依赖lib,都有可能会导致自动化脚本运行失败。再进一步,当我们的软件包含不止一个组件,而是由多个组件构成,不同组件可能使用了同一个依赖类库的新旧版本,并且组件之间有一定逻辑依赖、网络连接关系的时候,完全基于脚本自动化技术将变得极其容易出错或者难以维护。而且更重要的是,大量技术栈的组件都不会有稳定可用的一键自动化脚本,几乎都需要依靠厂商技术人员自行实现自动化。
Docker技术的核心价值之一是,他将自动化技术的前置条件,也就是标准化,通过镜像文件的方式很好的实现了。不管系统运维技术人员,还是厂商编制软件的研发人员,基于Docker镜像来实现自动化会变得更加容易和可维护,不同公司维护的镜像文件甚至可以互相引用或继承,高度复用,而不必重新造轮子。另外,研发人员开发测试使用的环境和最终终端用户运行的环境可以保持高度一致的,这样就避免了因部署环境差异导致的问题。
分发多组件构建的软件系统
像丰盘系统包含了数据库、API服务、OTA服务,静态HTML网站,以及一个流量网关,作为软件厂商只需要在开发构建环境里将各个组件预先配置好,组件之间的网络连接关系预定义好,然后就可以将整套软件发布出去了,而客户的环境不管是CentOS还是Ubuntu甚至是最新版的Windows,都可以用相似的几行指令在短短十几分钟内完成部署,99%的时间主要花在了下载镜像二进制文件到本机上,实际部署上线几乎秒级完成。
整个过程就像海运港口常用的集装箱技术一样,把一堆复杂的货物提前装配到集装箱内,然后一次性高效搬运到不同的货轮上。这也是为什么Docker官方的Logo是一只大鲸鱼拖着集装箱的形象。
上述技术和传统运维领域的VMWare、HyperV、KVM、Xen等虚拟机技术非常像。Docker也是一种虚拟化技术,但他相对传统虚拟机技术而言,是一种极其轻量级的虚拟技术。Docker最早是基于Linux内核原生cgroups和namespaces特性之上构建的一整套管理虚拟隔离环境的工具链。 虚拟机技术是需要对操作系统内核进行深度修改才能实现资源的虚拟化,而Docker技术本身不对内核做出任何定制修改,而是利用了系统内核自身的一些特性来实现的虚拟隔离。
相比传统运维环境下,我们去分发软件二进制包,在Docker技术里,我们分发的是若干个镜像文件,镜像文件除了包含软件包二进制文件之外,尤其重要的是包含了软件包运行所依赖的其他环境及其配置,这里提到的依赖环境通常包括了操作系统。不管您是在ubuntu还是centos系统上安装丰盘系统的,实际上丰盘系统所有的组件容器运行的环境都是基于debian v11。当某个组件需要升级更新的时候,我们就像替换一个螺丝钉一样,将整个容器(容器是镜像运行的实例副本)替换成新的镜像文件即可。
网络与资源隔离
Docker技术除了解决构建和分发部署的难题之外,核心价值之二是很好的实现了单机多个软件系统的虚拟隔离,包括网络隔离、CPU/内存资源的隔离,使到单一机器上可以运行上千个Docker容器,而传统的虚拟机技术通常一台物理机上能跑十几个虚拟机就很不错了,仅虚拟机的操作系统带来的开销就大到难以忽略了。
深入学习
如果要更深入的学习Docker技术,建议访问Docker官网: Get Started with Docker 。