APP下载

Docker技术在乘客信息系统部署中的应用

2019-06-10汪晓臣赵伟慧黄志威

铁路计算机应用 2019年5期
关键词:镜像仓库容器

田 源,李 樊,汪晓臣,赵伟慧,黄志威

(1. 中国铁道科学研究院集团有限公司 电子计算技术研究所, 北京 100081;2. 轨道交通系统测试国家工程实验室, 北京 100081)

乘客信息系统(PIS)采用中心-车站-车载的多层级架构,由控制中心统一管理各级设备[1]。目前的软件部署采用单机拷贝安装方式,面对数量庞大的设备集群,需要逐个设备安装调试。部署过程中容易暴露出诸多弊端,如软件运行环境配置导致的未知错误;单机拷贝和配置的安装方式耗费人力;软件版本升级或同步容易出错;应用与数据的耦合性较紧;硬件设备更换后,软件需重新部署等。

目前,Docker技术在越来越多的场景中得到了应用。张兆晨等人[2]设计了一种持续集成系统,利用Docker的镜像封装和轻量级特性,取代了传统持续集成系统的虚拟机架构,提升了开发效率,降低了系统占用资源;邹保平等人[3]通过与传统虚拟机比较的方式,验证了Docker容器化部署应用的敏捷性;姚炜等人[4]在传统开发平台中引入Docker技术,简化了从开发到部署的繁杂配置,有效提升了项目的发布速度。综上所述,基于Docker的容器化部署方案适用于开发与发布紧密结合、安装配置繁杂的软件部署场景。Docker技术的引入,将有效解决当下乘客信息系统中软件部署的诸多难点。

1 容器技术应用分析

1.1 容器技术优势

在乘客信息系统中,传统的应用软件部署方式是通过存储介质或网络传输的方式,拷贝软件安装包至目标机。然后在操作系统中配置软件运行所需的依赖环境,安装软件并进行配置,执行二进制文件或脚本来运行程序,提供软件服务。乘客信息系统中,车站设备数量多达上百台,分布距离较远,逐个设备部署、安装、调试的工作量非常巨大,后期对于软件的部署架构调整和版本维护都不友好。

容器是轻量级的操作系统级虚拟化。它可以实现在一个资源隔离的进程中运行应用及其依赖项[5]。应用程序与其所依赖的环境,可以被封装成镜像,并可以复用。应用需要被部署到目标机时,仅需在目标机上获取镜像,将其实例化为容器进程,运行即可。当软件或依赖环境产生变化,只需更新镜像即可。如此,将操作系统与应用程序相关的环境独立开,可降低部署难度,提升软件的可维护性,保证线路软件部署质量的统一性。容器技术具有以下优势:

(1)敏捷环境:容器的启动速度快,更新便捷。

(2)高效生产:开发人员不用担心生产环境下特殊的运行环境,实现一处调试,处处运行的高质量软件发布效果。

(3)版本控制:容器必须由镜像生成,镜像的版本唯一决定了运行容器的一致性。

(4)轻便:镜像文件占用空间小,且仅包含应用程序和关键依赖,方便软件归档和版本分发。

1.2 Docker技术特性

Linux 容器( LXC,Linux Container)是一个在单一 Linux 主机上提供多个隔离的Linux 环境的操作系统级虚拟技术[6]。Docker是一个基于LXC 的高级容器引擎[7]。Docker的沙箱机制有效的隔离各个用户实例,多容器共享系统内核的特性使得Docker实例轻量化,便于部署[8]。

Docker服务部署在宿主机操作系统之上。如图1所示,Docker将应用及其依赖环境封装在容器中运行。容器是操作系统为不同的用户或进程分配的具有一定相互独立空间(包括内存分页空间、CPU时钟分配、硬盘空间、进程空间、运行库等、IP地址)。

2 系统部署架构设计

本文在传统乘客信息系统的架构之上,引入Docker虚拟化技术。软件供应商将既有应用软件进行镜像封装,依据Docker私有仓库(Registry)规范,搭建一套应用软件管理系统。

图 1 Docker技术架构

该系统接入中心机房的核心交换机,负责管理乘客信息系统全部的应用镜像,并向各层级设备群提供镜像下载服务,如图2所示。

图 2 基于Docker的乘客信息系统部署架构

2.1 应用软件管理系统

应用软件管理系统由软件仓库管理工作站和软件仓库服务器组成。软件供应商提供初始的Docker镜像。镜像文件经管理工作站,推送至软件仓库服务器。软件仓库服务器宜采用主备集群策略,保证仓库镜像存储的高可靠性。结合Docker轻量、敏捷的技术特性,设备可在较短时间内完成部署任务,或从故障状态中快速的恢复。同时,该架构提供了云端应用级的容灾方案。

2.2 服务器集群和设备群

控制中心服务器集群、车站子系统设备群和车载子系统设备群的各设备需预置Docker环境,通过pull或run方式下载或更新软件镜像,如图3所示。

图 3 软件镜像部署与运行流程

虚线(1)所示是pull指令的数据传递流程。部署人员在操作系统中使用CLI指令向Docker守护进程发送拉取镜像A的指令,守护进程从软件仓库服务器获取对应的镜像A。

实线(2)所示是镜像的实例化过程。运行指令传递给Docker守护进程后,守护进程会将镜像A在本地实例化为容器A-1,并返回一个用于访问容器的虚拟会话。容器A-1在宿主机后台运行,通过端口映射向外部提供应用服务。

通过上述流程,基于Docker的私有仓库和应用容器化技术,系统实现了应用软件从云端备份到本地运行的无缝结合。

3 架构关键技术的实现

3.1 镜像制作

镜像是一个用于创建Docker容器的只读模板。镜像的制作方式有2种。

(1)容器提交(docker commit)

选择合适的基础镜像,启动一个可交换的容器。进入其中,安装需要的依赖环境和软件包。然后,退出容器。使用docker commit指令,将容器中的全部修改提交,形成一份新的镜像。

(2)镜像构建(docker build)

建立镜像首先需要创建一个Dockerfile文件。根据语法,在Dockerfile文件中定义了创建和运行镜像的必要指令。Dockerfile中的每一条指令都会在镜像中创建一个独立层,当Dockerfile内容发生变更需要重新构建时,只有变更的地方会被重建,因此,与其他虚拟化技术相比,Docker镜像显得更加轻量、小巧和快速。

上述两种镜像的生成方式优缺点对比如表1所示。乘客信息系统的应用软件多为定制化较强的专用软件,软件依赖环境特殊,版本控制严格。在应用软件的镜像制作中,针对不同软件类型,应制作不同的镜像。

考虑到应用软件依赖环境的多元化,对于依赖环境定制程度不高的应用软件类型,可以通过Dockerfile构建镜像。Dockerfile模板可扩展后服务于多个镜像构建,易于版本迭代和镜像维护。

表 1 两种Docker镜像制作方式比较

对于依赖环境定制程度高的应用软件类型,宜在既有容器逐步调试依赖环境,生成稳定可用的镜像。当软件版本或依赖环境需要变更时,在前一镜像版本的基础上,进入容器修改,通过镜像迭代完成版本升级和软件维护。

3.2 容器实例化

容器是镜像的实例。通过Docker API或CLI(Command Line Interface),可以创建、启动、停止、移动或删除一个容器。默认情况下,一个容器与其他容器、宿主机之间是相互隔离的。由于Docker引对卷挂载和端口映射的良好支持,容器可以通过外部存储的挂载(-v参数),或映射网络端口(-p参数),与宿主机或外部设备进行通信。

3.2.1 端口映射

在乘客信息系统中,应用软件的实现都建立在网络通信技术的基础上。应用软件容器化后,如何将容器内端口映射至宿主机是首要任务。

Docker容器运行时,通过-p参数,可以将容器内的网络端口映射至宿主机端口,实现网络通信的功能。对于多网卡宿主机,可以通过指定宿主机IP的方式,将容器内端口映射至指定网卡的端口。下述指令实现了将nginx容器的80端口映射至宿主机配置IP为192.168.1.10网卡的8090端口。

docker run -p 192.168.1.10:8090:80 -d nginx:latest

3.2.2 数据持久化

Dokcer镜像是一堆只读层的集合。容器实例化过程,是在只读镜像层基础上,建立一层可读写的容器层。以镜像为模板,创建的容器层可以通过提交指令转换为只读层,形成新的镜像。若不提交,在容器退出后,docker服务进程会将容器层移除。

综上所述,由镜像创建出的容器,其运行过程中的状态不会持久保存。所以,在实现例如数据库等应用的容器化时,除了端口映射,还需要保证数据的持久化。通过-v参数,将容器中的/var/lib/mysql文件夹映射至宿主机本地文件夹。

docker run -d -p 3306:3306 -v /usr/local/mysql/data:/var/lib/mysql mysql:latest

3.2.3 图像传输

乘客信息系统的终端设备需要提供媒体和信息服务,媒体播放应用程序需要图形化界面显示图形和文字信息。Docker容器中应用的图形化显示,可以利用X11服务实现。容器运行命令中使用-v参数,可以挂载容器的X11的unix套接字到宿主机,同时通过-e参数,更改宿主机的DISPLAY环境变量,控制图形输出至宿主机。

docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix myGuiApp

在Docker容器与宿主机间,X11通信数据流如图4所示。

图 4 容器应用图像传输流程示意图

3.3 应用软件管理系统搭建

应用软件管理系统由软件仓库服务器和软件仓库管理工作站组成。软件仓库是应用软件的Docker镜像的集合,位于控制中心,向中心服务器、车站服务器和车站播控提供镜像下载服务。为了实现仓库存储镜像数据的持久化,需要将仓库存储挂载至宿主机,即软件仓库服务器的本地目录。

软件仓库的界面化管理平台基于开源软件实现,平台采用B/S架构。运维人员通过软件仓库管理工作站,可以实现镜像上传、镜像更新、镜像标签编辑,镜像移除、镜像备份等操作,避免了在工作站环境下安装Docker环境和CLI访问仓库的繁杂步骤。

4 结束语

本文提出了一种基于容器技术的软件部署方案。通过容器化设计降低了应用程序与运行环境的耦合性,简化了系统安装与部署流程,保证了软件运行的可靠性,有助于降低人力成本和维护难度。但是本文提出的软件容器化部署方案,仅从操作系统层面实现了资源节约,未来可进一步研究基于硬件资源平台的虚拟化方案,对系统级的云平台构建提出设计方案。

猜你喜欢

镜像仓库容器
容器倒置后压力压强如何变
填满仓库的方法
镜像
四行仓库的悲壮往事
难以置信的事情
镜像
小猫看仓库
取米
消防设备
镜像