张延冬,邢艳芳
(1.南京南瑞继保电气有限公司,江苏 南京 211102;2.中国传媒大学南广学院)
由于软件开发人员与软件测试或运维人员的环境信息不对称,传统的软件交付方式存在很多问题。如软件发布分散,使用者安装软件时需要解决软件的依赖关系。这些问题不但降低了软件交付效率,而且难以实现持续交付和集成。
作为开源的应用容器引擎,Docker很好地解决了上述问题。本文研究了基于Docker的轻量级虚拟化方案,以及类似于版本管理的映像管理模式。
Docker的运行主要依赖以下几个模块:①Linux操作系统,Docker依赖于像Linux容器(LXC)这样的Linux技术,以及Cgroups和命名空间功能,这些在Windows操作系统尚不存在,所以Linux的操作系统是Docker必不可少的基础。②虚拟机,由于普遍采用Windows操作系统,所以需要虚拟机安装Linux操作系统。③VMware虚拟机软件,创建虚拟机并完成配置,以满足Docker正常使用。配置好基本的硬件信息之后,在虚拟机上安装Linux系统,采用centOS6.8的操作系统,下载并安装Docker[1]。
Docker是软件工业的集装箱技术,它提供了一个可供应用程序运行的独立空间或者说容器。Docker最初采用Go语言编写,相当于是加在Linux容器上的管道,允许开发者在更高层次的概念上工作。Docker扩展了Linux容器,通过一个高层次的API为进程单独提供轻量级的虚拟环境。与传统虚拟机不同的是,一个Docker容器并不包含一个单独的操作系统,而是基于已有基础设施中操作系统所提所供的功能来运行[2]。
Docker基于C/S架构,由客户端和服务端组成,主要包含以下组件:①Docker Client,Docker的客户端。②Docker Server,是Docker daemon的主要组成部分,用于接收用户通过Docker Client发来的请求,并按照相应的路由规则实现路由分发。③Docker Registry,是Docker镜像的中央存储仓库,用于储存上传的私有和公有Docker容器的镜像备份。Docker的三个基本要素分别是:①Docker容器,负责应用程序的运行,程序可以是操作系统,或者用户添加的文件和元数据。②Docker镜像,是一个只读文件,用来运行创建的Docker容器。③Dockerfile文件指令集,用来创建Docker镜像,其命令用来构建容器的每一层[3]。
⑴ 自定义指令集,依据基础镜像,结合实际的需要,在Dockerfile指令集中增添命令,创建符合实际需求的Docker镜像。
⑵ 创建镜像,可以通过Dockerfile文件创建,也可以通过仓库拉取,还可以通过压缩文件解压生成镜像,或者通过容器的反向Commit生成镜像。
⑶ 生成容器,所有的镜像文件都是为了生成Docker容器,容器是Docker的核心部分,在容器中部署、运维、测试。
⑷ 上传和下载镜像,通过Docker官方提供的开源平台Registry仓库,方便镜像的使用和传播[4]。
虚拟机采用VMware12,可以虚拟所有的操作系统,而且操作简单。首先安装VMware12,创建典型虚拟机。随后用镜像的centOS系统文件进行安装,选择好镜像文件后,对虚拟机的硬件进行配置,分配内存和硬盘空间,网络适配器和光驱/声卡等其他配置。虚拟机中安装centOS系统,在操作系统命令行终端,使用Linux命令对系统进行操作。
在Linux操作系统下安装Docker。首先打开命令终端检查本地是否有Linux中的curl命令,如果没有,输入sudo yum install curl从yum库中安装curl命令。安装好curl命令后,输入curl-fsSL http://get.docker.com|sh进入Docker官网获取最新的Docker安装包进行安装,具体操作参见图1。
图1 安装Docker
使用命令Docker version检查Docker的版本,正常情况下同时显示client版本和server版本。只显示client版本,表示Docker运行时没有超级用户权限,命令不能执行。使用命令Docker info检查Docker基本信息,能正确显示表示Docker已经安装完成。
在Linux中使用Vim创建Docker镜像,编写Python程序,完成下载和上传等操作。使用Python语言编写一段程序放到创建的容器中,测试程序在容器中的运行情况和程序的输出情况[5]。
创建Docker镜像有很多种办法,可以在官方网站上使用pull命令下载,也可以用Linux中的Vim命令编写Dockerfile本地文件系统创建Docker镜像。分别用两种方法创建两个Docker镜像。
⑴ 在官方网站上使用pull命令下载
在Docker Registry和云平台上存放的镜像,都是按照用户名/镜像名的方式来存储的。但有一类镜像比较特殊,比如centos、ubuntu这类基础镜像,经过官方验证,安全可靠,可以直接通过镜像名来检索到。输入命令:$docker pull busybox,通过Docker命令下载busybox镜像。执行pull命令的时候要输入完整的镜像名称。
⑵ 使用DockerFile文件创建镜像
首先创建一个Dockerfile,包含一些创建镜像的指令。新建一个目录和一个Dockerfile。
在Dockerfile中每一条指令都创建镜像的一个层。Dockerfile使用#来注释,FROM命令说明使用哪个镜像作为基础(即父镜像),已RUN开头的指令会在创建过程中运行。Dockerfile文件可以通过网上下载或自己编写,使用git命令从网站clone下载Dockerfile,使用Docker build命令来生成镜像,如图2所示。
图2 创建镜像
Docker容器可以理解为将一个进程在一个安全封闭的环境中运行。这个环境包含了该进程运行所必须的资源,包括文件系统、系统类库、shell脚本等等。这个环境默认不运行任何程序,需要在环境中运行一个进程来启动这一个容器。这个进程是该容器的惟一进程,所以当该进程结束的时候,容器也会完全停止。
创建容器首先要有镜像文件,通过Docker镜像文件使用Docker run命令,将镜像文件运行成为Docker容器。启动容器,在容器中运行相应的程序以达到快速部署,应用隔离。将之前通过两种方法构建的boyan_py和busybox两个镜像文件运行成容器。
容器运行后,在Python中运行写好的程序,进行测试,检测程序的可行性和容器是否已部署完成。
当修改了某一个容器之后,通过执行Docker中的commit命令,可以保存对容器的修改。Docker中保存状态的过程称之为committing,为了与旧版本区别,会产生新的版本号。使用docker ps-l命令获得容器的id,输入命令:$docker commit 83ae boyan/centos:7.1,把这个镜像保存为boyan/centos:7.1。无需拷贝完整的id,通常起始的三至四个字母即可区分,如图3所示。
图3 容器封装成镜像
通过docker push命令可以将某一个镜像发布到官方的索引网站,分享到这样的开源平台,一方面可以重用,另一方面也可以分享使用,提高使用效率,避免重复劳动。docker images命令可以列出所有安装过的镜像。
在已经安装好的VMware上虚拟第二台计算机,配置和第一台相同。同样在创建好的虚拟机中安装Linux系统,登录之后安装Docker,配置与之前相同。新建好Docker之后,从registry中pull之前上传的镜像文件,pull回本地的镜像文件名与上传时一致。
使用docker run命令运行镜像文件,使其生成docker容器,在容器中检验编写的python程序,测试容器的性能。执行完docker run命令后,生成73f5a93600f8这个容器,在容器中运行python检测程序是否可以执行,如图4所示。
图4 在容器验证Python程序运行
Python程序成功运行,表明了运维系统的可行性。本文通过创建镜像、运行容器和镜像共享,验证了Docker容器的快速部署和轻量级的特点,展现了Docker类似集装箱的技术在运维平台搭建中的广泛应用前景[6-7]。
伴随互联网时代的发展,程序开发和运维项目日益增多,快捷方便地搭建环境必将成为趋势。Docker降低了开发人员的繁琐劳动,简化了与测试运维人员的配合,方便在持续的集成环境中进行部署和验证工作。未来还需考虑Docker在Windows系统中的应用,以及共享的安全性,私有库的身份验证,安全机制等方面。
参考文献(References):
[1]陈康,黄炳良.基于openstack云平台的docker应用[J].软件,2014.11:73-76
[2]张怡.基于Docker的虚拟化应用平台设计与实现[D].华南理工大学硕士学位论文,2016.
[3]王飞.基于Docker的研发部署管理平台的设计与实现[D].北京交通大学硕士学位论文,2015.
[4]刘琳羽,南凯.一种基于Docker的开发者服务平台设计[J].科研信息化技术与应用,2015.5:65-72
[5]胡湘菲.软件自动化测试环境搭建中的Docker应用[J].计算机时代,2017.3:26-29
[6]逸凡.从Docker的流行谈云计算的走向[N].网络世界,2015-03-09(014).
[7]E.Mazzoni,S.Arezzini,T.Boccali,A.Ciampa,S.Coscetti,D.Bonacorsi.Docker experience at INFN-Pisa Grid Data Center[J].Journal of Physics:Conference Series,2015.664(2).