Web应用与其Dockerize后的研究分析

2018-08-08 06:28张雷
电子设计工程 2018年14期
关键词:镜像命令容器

张雷

(中国石油大学(华东)计算机与通信工程学院,山东青岛266000)

传统的Web应用大都部署在性能强的主机群、虚拟机群,亦或云服务商提供的云主机群上.伴随着企业业务规模的扩大,用户不断增多,流量高峰时,曾经的服务器集群难免会遇到性能瓶颈,这时就需要扩展集群,以支撑更庞大的用户访问.基于主机方式的扩展较为繁琐,需要手动进行各种配置,以适应现有集群环境,因而成本代价相对很高。同时,流量低峰时又会空闲大量服务器资源,造成资源浪费,利用率低等情况,集群的动态伸缩也是一个很大的挑战。Docker的出现,使得应用的部署扩展方式得到很大程度的改变,很好的解决了上面的问题,在环境的搭建部署方面有着天然的优势,本文基于一个简单Web应用,根据容器相关技术将其容器化,观察在Docker环境中应用的运行情况。然后分别在单容器,容器集群中构建Web应用,研究分析其与传统部署环境中服务的差异优劣。最后对容器集群环境进行了资源动态伸缩测试,节点容错测试。

1 技术背景

Docker[1-2]是一个平台,一系列技术的总称,基于这个平台在项目的开发、测试、部署各个环节中更加方便快捷,此外Docker还提供了许多额外的特性来保证软件的稳定安全。Contianer(容器)和Image(镜像)是Docker中最重要的两个基本概念。

1.1 容器与镜像存储研究

Image是一个轻量级、独立的可执行包,其中包含运行一个软件所需的一切,包括代码、运行时库、环境变量和配置文件。它是容器启动的基础,每一个容器都是从一个镜像中产生的,实际上镜像就是由多个不可变的layer构成的,容器则是在其上加了一个可读写的layer。容器与镜像存储结构如图1所示。

图1 镜像与容器的存储

Container是Image的运行时实例,实际运行时Image在内存中的内容.默认情况下,它与主机环境完全隔离,只能访问主机文件和端口。容器化后的软件将始终运行在一致的环境中,无论其部署在何种平台之上。容器将软件与其周围环境隔离开来,因而有助于减少团队之间在同一基础设施上运行不同软件的冲突。

Container基于主机内核,因而可以获得本地原生的支持。它们具有比仅通过Hypervisor虚拟访问主机资源的虚拟机更好的性能特征。容器是更轻量的虚拟机[3-4]。虚拟机是在操作系统上完整的模拟一台真实机器,多台虚拟机就需要完整虚拟出相应数量的操作系统,耗费大量主机资源.相比Docker,由于镜像的layer层的概念,相同的layer层在主机中只会保存一份,许多镜像拥有相同layer层时,都会基于这一个layer,资源占用大大减少。这也是容器技术比虚拟机性能表现更好的原因之一。

1.2 镜像构建Dockerfile

Docker中所有的一切都是基于镜像的。如何把应用Dockerize,也就是打包成镜像呢?Docker提供了一个非常便捷的方式来将软件应用及其所需的运行环境打包成一个镜像,即Dockerfile。

Dockerfile是一个文本文档,包含了用户用以创建镜像的所有命令.只需遵循Dockerfile命令格式,定义所需的应用环境,Docker就可以通过Dockerfile中的指令来自动完成镜像的构建.Dockerfile中的每一条命令都会创建一个layer,出于镜像的轻量,容器的效率等原因,尽量不要在一个镜像中创建过多的layer。一些主要命令[5]:

FROM<image>:FROM指令初始化一个新的构建阶段,并后续指令设置一个基本镜像。有效的Dockerfile必须以FROM指令开始。镜像可以是任何有效的镜像:本地的,亦或是公共仓库中的。

ADD <src>...<dest>:ADD 指令从 src复制新文件,目录或远程文件URL,并将它们添加到路径为dest的镜像文件系统中。

RUN<command>:RUN指令将在当前镜像顶部的新层中执行一些命令,并提交结果.生成的镜像将用于Dockerfile中的下一步。

EXPOSE<port>:通知容器在运行时侦听指定的网络端口。可以指定端口是侦听TCP还是UDP,如果未指定,则默认为TCP。

CMD["param1","param2"]:容器启动时默认执行的命令,一个Dockerfile文件中只能有一个CMD命令,如果有多个,只有最后一个会起作用。

1.3 容器集群Swarm

安装运行着Docker的机器,它们之间相互独立,单独作为一台Docker服务主机,Swarm[6]的作用就是将这些机器联系起来,构成一个集群,使之对外看起来就像是一台机器。搭建Swarm集群后,继续运行使用Docker命令,Docker将会在管理的整个集群上执行命令,而不仅仅是在当前的机器上运行。集群中的机器可以是物理的或虚拟的。加入集群后,它们被称为节点。

Swarm管理节点是集群中唯一可以执行命令的机器,或授权其他机器作为工作节点加入集群。工作节点只是提供处理资源,没有权力告诉任何其他机器它可以做什么和不能做什么。

2 实验准备

2.1 容器化Web应用

容器化[7-9]的主要工作就是Dockerfile的编写,定义容器内的环境。并将访问资源(如网络接口和磁盘驱动器)在此环境中进行虚拟化,并具体说明要将哪些文件复制到此环境。

基于Docker官方基础镜像,预装python2.7环境,官方镜像经过了大量精简优化,体积非常小,保证开发环境正常的同时,占据更少的存储空间,对搭建部署有极大的好处。构建镜像的Dockerfile定义:

根据此Dockerfile文件,执行docker build命令,构建出镜像。还可以把构建好的镜像放入私有库中,协作开发人员就可以从中下载使用。镜像包含了开发的必需环境,基于同一个镜像开发,也避免了开发环境不一致问题[10]。

2.2 部署启动容器

在单节点部署容器:将构建好的镜像pull至此节点上,执行doker run命令完成容器的部署.因为是网络应用,需要将容器暴露的80端口映射到主机的任意可用端口上.这样通过访问主机的指定端口就能够访问到容器内的应用。

集群环境:一个集群由多个节点组成,可以是物理机或虚拟机。这里仅以两台虚拟机组成集群。虚拟机是用VMware搭建的,基于Unbuntu17.04系统.也可以使用Docker Machine工具来创建虚拟机,通过docker-machine create命令创建虚拟机,可以统一查看管理虚拟机,非常方便。

搭建容器集群[11-12]:执行docker swarm init命令启用swarm模式,使当前的机器成为集群管理节点,这步会得到一个Worker角色序列码,然后在其余机器上运行docker swarm join,给token参数附上上步得到的序列码,使以工作节点身份加入群集。集群搭建完毕后,在管理节点上可以查看到集群中各节点的状态。

最后借助Stack在集群上完成部署[13-14],Stack相当于一个软件系统整体,其中包括了许许多多的服务(Service),每个服务充当系统中的一个模块,服务又由很多个容器(Container)组成.一个Stack文件其实就是版本号为3的Compose文件,定义如下:

通过docker stack deploy命令部署运行,在管理节点可以查看到应用在集群中的部署情况,部署成功之后,5个容器实例被分别分配到ubuntu2和ubuntu3两台主机上运行,可以通过集群中的任意一台主机的ip访问到部署在其上web应用。

3 测试分析

3.1 本地环境与容器环境性能测试分析

实验使用Apache旗下的一款测试工具JMeter来模拟用户访问。首先单线程循环访问100次。查看服务器平均响应时间情况。图2展示了本地环境和容器环境下服务器的响应能力,可以明显看出本地环境下的响应时间在2 000 ms上下浮动,而容器环境下的响应时间大约维持在250 ms左右,对比本地环境有明显优势。

图3所示为50个线程并发访问测试情况.随着访问量增大,服务器处理能力的局限性,两种环境下的响应时间都呈现出逐步增长的趋势,但仍可看出容器环境下在访问量到达顶峰时的响应时间接近10 000 ms,对比本地环境下的90 000 ms,容器下的服务器也表现出了不错的处理能力。服务器具体性能指标如表1。观察发现,容器环境下服务器的平均响应速度远远高于本地环境,容器单线程情况下为251 ms,多线程并发访问时用时6 039 ms,两种情景下都远少于本地环境下服务的响应时间。服务器的吞吐量也存在明显差异,容器环境近约3.9/sec,本地环境约为0.49/sec。综合各个方面,容器都拥有更出色的表现。

图2 单线程本地与容器环境下响应时间对比

图3 多线程本地与容器环境下响应时间对比

表1 各环境下服务器性能比较

3.2 容器集群节点伸缩与容错

Swarm集群中节点的伸缩拓展[15-16]:使用docker swarm join命令将一台主机轻松加入到集群中,docker swarm leave命令则可以将机器从集群中踢出.此外还可以控制容器的副本数量,给程序提供更多的处理资源,保证程序的健壮。

为了测试集群中的容错性,人为删除一个容器实例(docker rm命令用于删除容器,删除运行中的容器,需加上-f强制删除)来模拟容器宕机挂掉的情况,稍等片刻,查看集群状态,如图4所示。

机器ubuntu2上\_wepapp_web.5为手动宕掉的容器,可以看见Swarm自动在ubuntu3上创建了一个新的容器来替代它。

图4 集群容器容错测试

本次实验中的web服务是由两台虚拟机内的五个容器实例提供的,任意的http请求都由Swarm采用默认的负载策略分发给具体的容器实例进行处理。Swarm保证replicas参数数量的容器实例的运行,如果其中某个容器宕机挂掉,Swarm会自动分配启动一个新的容器来取代它。

4 结束语

通过实验发现了Web应用在容器的环境中发挥出了更好的性能,但其带来的好处远不止如此,在集群的资源利用、拓展、容错方面也带来了极大的便利。本文只是基于Web应用的容器化进行了些许探讨,在其他领域方面Docker也掀起了巨大的变革,越来越多的互联网公司使用Docker来开发部署自己的系统架构,尤其在云计算、大数据盛行的今天,更凸显了Docker自身的优势。Docker技术还在不断完善成长,需要逐步挖掘探讨。

猜你喜欢
镜像命令容器
容器倒置后压力压强如何变
只听主人的命令
镜像
难以置信的事情
镜像
移防命令下达后
这是人民的命令
取米
镜像
对卢沟桥事变期间一份“作战命令”的考析