技术领域
[0001] 本公开涉及
计算机网络技术领域,尤其涉及一种基于Docker的轻量级网站部署方法。
背景技术
[0002] 随着我国高校及科研机构与国内外学术交流的加强,Internet作为最广泛的信息交流共享平台,在Internet环境下,会议网站已经不仅仅局限于简单的发布信息的网站,内容通常还包含稿件管理功能,在线注册参会功能,参会者信息管理、查询、导出、下载,实现在线投稿、在线注册参会,会议信息统计分析功能等众多的系统模
块。随着每年学术会议的召开,内容及用户数据都有所不同,并有数据逐年增加的趋势。
[0003] 针对这样的轻量级网站,传统的
软件应用部署方式是在
硬件的
基础上,虚拟出多个
操作系统,然后在系统上部署相关的应用。若每年有多个轻量级网站采取
虚拟机方式部署,在资源利用上形成较大浪费。
[0004] Docker是PaaS提供商DoctCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源。
云计算时代的到来--AWS的成功,引导开发者将应用转移到cloud上,解决了硬件管理的问题,然而环境管理复杂,从各种OS到各种
中间件到各种软件应用,作为开发者需要关心的东西太多,且难于管理,这个问题几乎在所有现代IT相关行业都需要面对,对此Docker可以简化部署多种应用实例工作,比如Web应用、后台应用、
数据库应用、
大数据应用比如 Hadoop集群、消息队列等等都可以打包成一个Image部署。Docker的出现使用虚拟化手段的变化--cloud时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需使用的需求以及保证可用性和隔离性。由于Docker 基于LXC轻量级的虚拟化特点,Docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离性的标准化的运行环境,轻量级的PaaS,构建自动化测试和持续集成环境,以及一切可以横向扩展的应用,尤其是需要快速启停来应对峰谷的web应用。从最为简单的构成形式出发,Docker实际上旨在提供一套能够在共享式基础设施之上对软件工作负载进行管理的容器环境,但同时又确保不同负载之间彼此隔离且互不影响,创建一套完整的操作系统堆栈,通过虚拟机管理程序将与该系统相关的设备囊括进来,而与虚拟机解决方案的区别在于,Docker在很大程度上依赖于Linux操作系统所内置的一项功能——名为LXC(即Linux容器)。 LXC利用内置于操作系统当中的各项功能将不同
进程的内存进行划分,甚至能够在一定程度上拆分CPU与网络资源。Docker镜像不需要像一套全新操作系统那样进行完整的引导过程,这样一来
软件包的体积就能得到大幅压缩、应用程序运行在共享式计算资源之上时也将具备更为显著的轻量化优势。除此之外,Docker还允许工作负载直接
访问设备驱动程序、从而带来远超过虚拟机管理程序方案的I/O运行速度。Docker镜像正逐渐成为应用交付的标准,加之迅速成长的
生态系统,将会是应用发布、分享的首选方式。
发明内容
[0005] (一)要解决的技术问题
[0006] 鉴于上述技术问题,本公开提供一种基于Docker的轻量级网站部署方法,解决了传统虚拟机方式运行多个不同的应用就要起多个虚拟机,占用资源庞大、启动速度缓慢、扩展性差,以及目前的应用通常从已存在的组件组合而来,并且依赖其他服务和应用的问题,实现了更高的性能和效率。
[0007] (二)技术方案
[0008] 根据本公开的一个方面,提供了一种基于Docker的轻量级网站部署方法,包括:在
服务器上部署Docker服务;以及Docker服务在Docker 容器
执行环境中增加应用程序部署引擎,完成所述基于Docker的轻量级网站部署。
[0009] 在一些
实施例中,所述Docker服务包括:Docker客户端(Client)、 Docker
守护进程(daemon)、Docker镜像(Image)、Docker容器(Container) 以及Docker仓库(Registry)。
[0010] 在一些实施例中,在服务器上部署Docker服务,包括:资源层:完成操作系统层面配置和部署,包括
内核升级、Docker服务部署、安全策略配置及ssh公钥分发;容器层:编排Docker容器和服务器之间的关系和/ 或增加服务器资源;以及应用层:对外提供服务访问点,用于处理服务 (Service)
请求,或将服务(Service)请求分发给后台(Backend),由 Backend容器处理服务(Service)请求。
[0011] 在一些实施例中,资源层完成操作系统层面配置和部署,还包括:选择一服务器作为轻量级网站的web配置界面,用于管理一私有Docker仓库,以分发Docker镜像。
[0012] 在一些实施例中,通过轻量级网站的web配置界面编排容器和服务器之间的关系;通过添加设备加入新的服务器资源。
[0013] 在一些实施例中,通过资源层的部署,向所述容器层提供资源操作平面,该资源操作平面用于向服务器导入镜像、起停容器。
[0014] 在一些实施例中,通过容器层的部署,向应用层提供容器操作平面,在容器操作平面上编排各种服务之间的关系,实现分布式系统架构。
[0015] 在一些实施例中,通过Service-Backend模式构造Service依赖树,树的根
节点对系统外提供服务。
[0016] 在一些实施例中,当启动一服务时,分布式系统架构将递归检查该服务的后台,在启动依赖树的叶
子节点并保证状态正常之后逐级回溯启动上级服务。
[0017] 在一些实施例中,所述的基于Docker的轻量级网站部署方法,还包括:通过iptables阻断从Docker容器到所有内网IP的通信;通过selinux 或者apparmor限制部分Docker容器所能访问的资源;对部分sysfs或者 procfs目录采用只读方式挂载;通过grsec来加固系统内核;通过cgroup 对内存、CPU、磁盘读写等资源进行配额控制或通过tc对每个Docker容器的带宽进行控制。
[0018] (三)有益效果
[0019] 从上述技术方案可以看出,本公开基于Docker的轻量级网站部署方法至少具有以下有益效果其中之一:
[0020] (1)基于Docker的轻量级网站部署方法,解决了传统虚拟机方式运行多个不同的应用就要起多个虚拟机,占用资源庞大、启动速度缓慢、扩展性差,以及目前的应用通常从已存在的组件组合而来,并且依赖其他服务和应用的问题,实现了更高的性能和效率。
[0021] (2)通过iptables阻断从容器到所有内网IP的通信、通过selinux或者apparmor限制部分容器所能访问的资源、对部分sysfs或者procfs目录采用只读方式挂载、通过grsec来加固系统内核、通过cgroup对内存、CPU、磁盘读写等资源进行配额控制或通过tc对每个容器的带宽进行控制,进一步保证了安全及隔离性。
附图说明
[0022] 通过附图所示,本公开的上述及其它目的、特征和优势将更加清晰。在全部附图中相同的附图标记指示相同的装置。并未刻意按实际尺寸等比例缩放绘制附图,重点在于示出本公开的主旨。
[0023] 图1为依据本公开基于Docker的轻量级网站部署方法
流程图。
[0024] 图2为依据本公开基于Docker技术的应用程序部署架构图。
[0025] 图3为依据本公开Docker内部组件关系图。
[0026] 图4为依据本公开三个层面的部署过程图。
具体实施方式
[0027] 为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
[0028] 本公开提出了一种基于Docker的轻量级网站部署方法。如图1所示,本公开基于Docker的轻量级网站部署方法,包括以下步骤:
[0029] 在服务器上部署Docker服务;
[0030] Docker服务在Docker容器执行环境中增加应用程序部署引擎,完成所述基于Docker的轻量级网站部署。
[0031] 本公开方法针对每年用户数量递增,因政策变化、新技术的发展以及外部环境变化,网站内容版本而有所不同的轻量级网站,在部署上基于 Docker容器技术,有效解决了传统虚拟机方式运行多个不同的应用就要起多个虚拟机,占用资源庞大、启动速度缓慢、扩展性差,以及目前的应用通常从已存在的组件组合而来,并且依赖其他服务和应用的问题。
[0032] 另外,在服务器负载方面,如果单独开一个虚拟机,那么虚拟机会占用空闲内存,而采用Docker部署,这些内存就会被有效的利用起来,而且Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
[0033] 经过大量测试,并和物理服务器进行性能对比。在CPU、内存、磁盘、网络方面,Docker和物理设备的性能基本一致,没有额外损耗。随后进行了Docker和虚拟机实现原理的比较,大致可以得出一些结论:(1)由于 Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上 Docker将会在效率上有优势。(2)Docker利用的是宿主机的内核,而不需要Guest OS。当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核,省略了这个过程,新建一个Docker容器只需要几秒钟。因此Docker对比虚拟机在资源消耗上占有比较大的优势。事实上,在一台物理机上可以很容易建立成百上千的容器,而只能建立几个虚拟机。
[0034] 从上述实现原理的
角度可知Docker应当在CPU和内存的利用效率上比虚拟机高。在相同硬件参数2个英特尔xeon E5-2655处理器,主频2.4 GHz,每个处理器有8个核,共有
16个核,256GB RAM的条件下,启动 3个物理机、3个Docker容器和3个虚拟机进行性能数据测算,实验得知在操作系统运行的资源消耗方面,Docker相对于物理机其计算能
力几乎没有损耗,而虚拟机对比物理机则有着非常明显的损耗,虚拟机的计算能力损耗在50%左右。
综上,若部署上千个轻量级网站,Docker部署方式能比虚拟机部署节约资源50%左右。另外,在系统引导时间方面,Docker能在几秒钟之内启动几百至上千个容器,虚拟机则需要数分钟。
[0035] 本公开轻量级网站应用程序基于Docker部署架构如图2所示。在物理机上部署Docker服务,Docker服务在虚拟化的Docker容器执行环境中增加了应用程序部署引擎,该引擎的目标就是提供一个轻量、快速的环境,能够运行程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境中。
[0036] 在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便,用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。图3为Docker内部组件关系图。如图3 所示,Docker服务包括以下五部分:1、Docker Client客户端;2、Docker daemon守护进程;3、Docker Image镜;4、Docker Container容器;5、 Docker Registry仓库。
[0037] Docker服务通过Docker客户端连接Docker守护进程,通过命令向 Docker守护进程发出请求,Docker守护进程通过一系列的操作返回结果。 Docker镜像是Docker容器运行时的只读模板,每一个Docker镜像包括一系列的层(layers)。Docker使用UnionFS(联合文件系统)来将这些层联合到单独的镜像中。UnionFS允许独立文件系统中的文件和文件夹(称之为分支)被透明
覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker才是如此轻量。当改变了一个Docker镜像,比如升级到某个程序到新的版本,一个新的层会被创建,因此不用替换整个原先的 Docker镜像或者重新建立Docker镜像,只是一个新的层被添加或升级了。现在不用重新发布整个镜像,只需要升级,层使得分发Docker镜像变得简单和快速;Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库,同样Docker仓库也有公有和私有的概念。公有的Docker仓库名字是 Docker Hub,其提供了庞大的镜像集合供使用,这些镜像可以是自己创建,或者在已有镜像基础上创建,Docker仓库是Docker的分发部分;Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个Docker容器都是从Docker镜像创建的。Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台,Docker容器是Docker的运行部分。Docker对于应用依赖封装完整,同一镜像可重复的在测试、集成、生产等环境部署,做到“一次构建,处处运行”,适用于持续集成、持续部署流程。虽然Docker的初衷是为“微服务”架构设计的,但其解决了远程登录容器和容器内进程管理的问题,把容器作为开发机使用,在Docker内运行多个程序,甚至sshd 或者upstart也是可行的。
[0038] 本公开基于Docker的轻量级网站部署方法,其整个部署过程可分成三个层面:资源层、容器层、应用层,形成分布式部署
框架,如图4所示:
[0039] 如图4所示,资源层:资源层完成操作系统层面配置和部署,包括内核升级、Docker服务部署、安全策略配置、ssh公钥分发等。资源层的安装需要登录每台服务器并root身份运行程序bin文件,此时内置脚本将提示用户完成本地设置,并选出其中一台服务器充当“portal”,即轻量级网站的web配置界面,同时portal管理了一个私有的docker-registry用于分发Docker镜像。通过资源层的部署,向容器层交付了资源操作平面,资源操作平面具备向其他服务器导入镜像、起停容器的能力。
[0040] 容器层:容器层在资源操作平面上,可以通过portal提供的web配置界面方便的编排容器和服务器之间的关系。通过“添加设备”功能还能够很方便的加入新的服务器资源。在容器操作平面上,通过编排各种服务请求之间的关系,发挥分布式系统架构的威力。
[0041] 应用层:Service负责对外提供服务访问点,既可以自己处理请求,也可以将请求分发给Backend;由Backend容器真正处理Service请求。Docker 社区建议一个Docker跑一个进程,但是当系统内有成千上万的进程时,这种策略不便于配置管理。经过大量测试后,本公开这里采用一个容器跑几个进程的方法,通过Service、Backend模式,可以构造出Service依赖树,树的根节点对系统外提供服务。Service依赖树将在容器启动阶段发挥重要作用。当启动某服务时,分布式部署框架将递归检查此服务的 Backend,先启动依赖树的叶子节点并保证状态正常后再逐级回溯启动上级服务,这种机制保证了各模块的启动顺序。
[0042] 本公开还提供一标准模块镜像。首先一个标准模块需要按一定的结构规划目录来放置模块自身文件。模块需要编写对应脚本放到对应目录下面。当目录对应的事件发生时,部署框架将按照ascii顺序依次同步调用脚本,首先status和info文件用于输出容器的当前状态和容器的描述性信息,然后使用ADD命令把my_service加入镜像中,每日构建系统会自动将镜像build出来,第二日的bin包中将包含此模块镜像;最后当部署框架启动模块容器时会按照配置将log目录挂载到容器外,同时调用start目录中的所有脚本,至此模块启动完成。从网状配置模式到星形配置模式,最初的网站部署框架采用全局配置文件的模式,即在
web界面完成配置之后,部署框架会生成一个巨大的配置文件,配置文件描述了整个系统的所有物理机情况、模块情况、Service依赖树、服务访问点等等。任何一个模块看到这个配置文件后即可获得所有需要的信息,而当任何配置发生变化后,框架只需要重新生成该配置文件并通知每个模块即可,通过这种模式确实简化了整体配置复杂度。
[0043] 另外,Docker作为一种轻量级虚拟化技术,它更轻量、启动速度更快的同时,还具有以下优势:更快速的交付和部署、更轻松的迁移和扩展、更简单的管理。基于Docker容器技术,最大限度的优化应用开发、构建、集成、部署的整个流程,并提供一个高效、可靠的运行环境。
[0044] 开发人员使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速
迭代应用程序,实现整个过程全程
可视化,方便各角色理解应用程序的创建及工作。其主要工作流程如下:
[0045] 1、运维人员可在云主机上搭建私有Docker Registry仓库;
[0046] 2、开发人员可在开发云主机上从公有Docker仓库Docker Hub或私有Docker Registry仓库获取应用需要的基础Docker镜像;
[0047] 3、开发人员可开发云主机上构造应用容器,自测后提交容器为新的镜像并推送到私有Docker Registry,通知QA测试;
[0048] 4、QA在其测试云主机上启动容器进行测试;
[0049] 5、发布人员下载最新版本镜像并在生产云主机上启动Docker容器。
[0050] 此外,关于多租户资源隔离方面,Docker容器充分利用linux内核的 namespaces提供资源隔离功能,结合cgroup,可以方便的设置某个容器的资源配额,既能满足资源隔离的需求,又能方便的为不同级别的用户设置不同级别的配额限制。但由于容器中运行的程序对于hosting服务提供方来说是不可信的,所以需要特殊的手段来保证用户无法从容器中操作到宿主机的资源。从安全及隔离性加固方面,可考虑以下措施:
[0051] 通过iptables阻断从容器到所有内网IP的通信(当然如果需要也可以针对特定的IP/端口开放权限);
[0052] 通过selinux或者apparmor限制某个容器所能访问的资源;
[0053] 对某些sysfs或者procfs目录,采用只读方式挂载;
[0054] 通过grsec来加固系统内核;
[0055] 通过cgroup对内存、CPU、磁盘读写等资源进行配额控制;
[0056] 通过tc对每个容器的带宽进行控制。
[0057] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本
申请。对这些实施例的多种
修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
[0058] 需要说明的是,在附图或
说明书正文中,未绘示或描述的实现方式,均为所属技术领域中普通技术人员所知的形式,并未进行详细说明。此外,上述对各元件和方法的定义并不仅限于实施例中提到的各种具体结构、形状或方式,本领域普通技术人员可对其进行更改或替换。
[0059] 以上所述的具体实施例,对本公开的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本公开的具体实施例而已,并不用于限制本公开,凡在本公开的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。