初识DOCKER容器技术

    金琦

    编者按:在国家教育信息化政策的大力支持下,很多区域教育技术中心或学校都在积极开展或筹建教育云平台大数据发展工作,教育云平台和大数据建设已成为未来教育信息化发展的重要趋势。但智慧校园发展遇到诸如学校运维受限、软件部署繁琐、硬件资源浪费、数据孤岛、使用率低下等困惑,而引入容器技术作为目前已经普遍实施的服务器虚拟化技术的有效补充,既能保障主机的安全、稳定和高可用性,又能实现业务应用的快速灵活部署和轻量高效运行,从而使教育部门可以获得真正标准化的可持续更新的流程和数据资产。接下来本栏目将分两期对容器技术进行探讨。● 数据中心应用服务现状

    容器技术在最近几年都是一个非常热门的话题,目前越来越多的公司都向学校提出基于容器技术的智慧校园解决方案。要探讨容器技术,我们避免不了回顾容器技术产生的背景。

    2010年前我们中小学数据业务服务器架构基本上是如图1所示的模式。

    这种模式下我们面临以下问题:①部署成本高。我们要准备相应物理服务器,然后在物理服务器上安装Windows或者Linux操作系统,安装各式系统环境的依赖,再在操作系统中部署學校各类业务应用,这样的部署非常慢,而且成本非常高。②资源浪费严重。对于学校来说大部分业务与系统消耗的资源非常小,为避免应用程序自身的安全隐患影响同一服务器上其他应用程序的运行,通常在每一台服务器上只运行一种应用程序,所以大多数服务器的利用率比较低,造成资源的浪费。③更新和扩展困难。例如,要更新服务器,要对相应的业务应用进行迁移,除了重复之前繁冗的部署之外,老的业务应用未必能适应新的硬件架构和新的操作系统环境。又如,要对服务器进行资源扩展(阅卷系统有增加阅卷量需求,需要增加内存和存储读写效率),这样又要对物理服务器的资源去做扩展,这也是非常麻烦的。

    随着技术的发展,2010年后各学校逐渐应用虚拟化技术来解决学校数据中心面对上述传统物理服务器应用面临的各式瓶颈(如图2)。

    

    首先,我们先了解虚拟化技术的实现方式。虚拟化技术就是在原先的物理服务器上,通过一种运行在基础物理服务器和操作系统之间的中间软件层(Hypervisor)去做物理资源虚拟化,即Hypervisor会加载所有客户端操作系统,同时会分配给每一个客户机操作系统适量的物理资源(内存、CPU、网络、磁盘)。这些被调度相应物理资源的操作系统其实就是我们常说的虚拟机。一般来说,物理主机底层的物理资源是比较丰富的,这样可以通过虚拟化这一层去实现不同虚拟机之间的资源调度,如根据业务应用实际需要,就可以让某个业务应用运行在单独的一个虚拟机里面,分配一个低业务应用虚拟机使用1核CPU、4G内存,然后另外一个相对高业务应用虚拟机使用2核CPU、8G内存,这样就可以做物理资源的一个限定和隐形的调度,从而实现物理资源利用率的最大化。再总结虚拟化技术的优点:首先是提出资源池的概念,可以把整个物理资源分配到不同的虚拟机里面,然后去做物理资源的有效管理。

    其次,我们可以很容易进行扩展,当物理资源不够时,可以去资源池里加物理机,然后在这台物理机上再创建虚拟机,因为有了Hypervisor这样的中间层完成了物理主机和虚拟机之间的有效隔离,所以无需关心底层的物理服务器到底使用联想还是浪潮的,因为通过虚拟化技术,可以在任何的物理设备上面去创建一台Windows或者Linux等各式系统的虚拟机。

    最后一点也是很重要的,就是很容易云化。现在很多云服务商(如阿里、腾讯)和省市的教育技术中心都在做教育公有云,我们可以通过这些大企业或者教育中心提供的云服务,对底层的物理资源都不用管,直接在云上去创建虚拟机或者迁移学校现有虚拟机,然后去部署或者迁移我们的业务应用就可以了。

    既然虚拟化技术这么有效了,为什么还要去讲容器技术?首先我们要看一下虚拟化技术的局限性:

    (1)每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多。

    (2)应用环境管理复杂,维护效率不高。学校各种应用服务所需要的部署环境各异,每次安装新的应用服务都需要重新安装新的应用部署环境,无法将应用服务部署环境和应用打包作为一个整体进行有效的复用和管理。

    (3)各项业务应用运行之后,后期的监控和运维也非常复杂,尤其对学校来说,大多数网管教师素质一般,与开发人员也缺乏有效的沟通方式,实际的开发环境和学校的运维环境有差异,部署和后期更新都会出现矛盾。

    

    以Docker为代表的容器技术实现轻量级的操作系统虚拟化解决方案可以对上述传统虚拟化技术的局限性进行有效改善,使得学校用户也可以通过容器技术克服不同平台的差异性,享受标准化的交付维护、对应用按需分配的全套体验。● Docker的概念和基本使用方法

    Docker是基于Go语言实现的云开源项目,是为开发人员设计的,以容器调度和资源分割为单位,通过封装软件运行的环境,用于构建、发布和运行应用的平台。Docker设计之初的目的是“Build、Ship And Run Any App、Anywhere”,其理念使程序实现了“一次封装,到处运行”。

    Docker特有的容器技术与前面讲的传统的虚拟化技术不同,虚拟化技术都是基于完全虚拟化技术,即由Hypervisor层完整模拟一个“物理主机”,在生成主机上制备操作系统,在操作系统上安装并部署相应运行库文件、业务应用等,这种虚拟化手段的典型代表是VMware ESX、Hyper-V、Citrix、KVM等,相比较于传统的服务器虚拟化技术,Docker更为轻量级,它直接省缺了“物理主机”的模拟,通过各实例共享宿主机操作系统的方式生产虚拟主机,而在Docker沙盒环境中是不包含操作系统内核的,所以把应用运行在Docker容器上面,可以简化配置,将运行环境和源代码及配置文件打包到一个容器里面,实现了本地环境、开发环境、业务环境的统一,降低了开发测试部署的难度。而且多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为孤立进程运行。容器占用的空间少于虚拟机(容器映像的大小通常为几十MB),并且几乎立即启动。而虚拟机都包含一个操作系统的完整副本,一个或多个应用程序,占用数十GB,虚拟机相对容器来说启动缓慢得多。双方的架构对比如下页图3所示。

    Docker包括三个基本概念:

    (1)镜像(Image)。

    Docker镜像是一个特殊的文件系统,可以理解为一个模板,它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像构建时,会逐层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。

    

    (2)容器(Container)。

    容器就是使用镜像来启动常见的应用或者系统,在当前系统上安装所需的容器即可,而不用去创建新的系统。镜像(Image)和容器(Container)的关系,就像是信息技术教师熟悉的面向对象程序设计中的“类”和“实例”一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    (3)仓库(Repository)。

    仓库是存放镜像的地方,包括公开仓库和私有仓库两种形式。一个Docker仓库中也可以包含多个仓库,每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。● Docker的基本使用体验

    在对Docker有了基本了解后,可以尝试用实际操作加深体验,如果想在习惯的Windows上体验Docker,可在64位Windows 10(家庭版除外)和Windows 2016上安装DockerDesktop For Windows,由于Docker本身是Linux软件,所以最好在Linux系统的主机或者虚拟机上直接安装感受原生的体验。下面以CentOS 7为例,使用Linux Shell命令搭建一个容器网站服务来说明。

    (1)使用root权限登录CentOs,Docker要求CentOs系统为64位操作系统且内核版本需要在3.10及以上,可用“uname -r”命令查看版本,使用“yum update”命令确保yum包更新到最新(如图4)。

    (2)Yum是一个在Linux中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须烦琐地一次次下载、安装。安装需要的软件包。yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的:yum install -y yum-utils device-mapper-persistent-data lvm2(如图5)。

    (3)用“yum-config-manager --add-repo”指令加上相应地址来设置Yum源(如下页图6)。

    (4)用“yum install docker-ce”指令安装Docker,由于repo中默认只开启stable仓库,故这里安装的是最新稳定版(如下页图7)。

    (5)用“systemctl start docker”指令来启动Docker。也可以用“systemctl enable docker”指令把Docker加入开机启动就启动(如图8)。

    (6)Docker启动后,首先用“docker pull”指令来拉取一个名为busybox(一个集成了一百多个最常用Linux命令和工具的软件工具箱)的镜像文件,拉取完成后用“Docker images”命令查看下载到本地的所有镜像(如图9)。

    (7)使用“docker run”命令将前面拉取的“busybox”镜像文件去启动一个容器(Container),并指定一个容器名称为“ITEdu”。运行后会直接进入这个容器里面,可以发现该容器内环境和一个正常使用的Linux的环境完全相同,首先创建一个简单的网站目录“data/www”,并在该目录下用tee命令写一个简单文本网页(如图10)。

    (8)这个镜像里自带了httpd服务(Apache HTTP服务器程序,直接执行程序可启动WEB网站服务器),我们来启动“httpd-h/data/www”命令,将“data/www”下的网站启动,查看一下容器的IP地址172.17.0.2,并在宿主机用浏览器访问该地址,可以看到该网站已经可以成功访问该测试网站(如图11)。

    通过以上几条命令,就可成功搭建一个容器内网站,感觉是不是很方便。最后,还可以实际体验下一家校园软件开发公司的容器操作范例(如上页图12):

    (1)我们可以在学校或者云服务器上直接到该公司在阿里云的仓库拉取(pull)一所学校数据中心范例镜像,执行以下命令即可实现。

    docker pull registry.cn-shanghai.aliyuncs.com/xy-docker-hub-test/data-center:dev

    (2)然后再执行运行容器指令。

    docker run -d --restart always --name data-center -p 9000:9000 registry.cn-shanghai.aliyuncs.com/xy-docker-hub-test/data-center:dev

    命令解釋如下:“registry.cn-shanghai.aliyuncs.com/xy-docker-hub-test/data-center:dev”是该公司学校数据中心范例镜像的一个标识,我们用该镜像生成一个名为“data-center”的容器,“-d-restart always”表示让该容器每次开机就后台启动,“-p -p 9000:9000”就是映射该服务器的9000端口到容器的9000端口。

    这样通过拉取镜像和运行容器两条指令,就可以将该容器网站服务直接映射数据中心宿主服务器9000端口上,通过http://服务器IP:9000/访问该容器网站。

    至此,学校的一个新的需求就完成了。开发人员仅需开发对应的代码,然后进行发布。后续的一系列流程,全部自动化实现,大大减少了研发流程,提高了研发效率,节省了大量的人力和物力。在学校信息化不断深入的过程中,校园各种应用服务急剧增加,学校数据中心急需一种管理维护便捷、占用资源少、运行效率高的应用服务部署和迁移解决方案,采用基于Docker容器技术的校园应用服务开源PAAS能满足以上需求,为学校的教学和管理应用服务提供一个高可靠、低成本的高效便捷的应用方式。

相关文章!
  • 小学语文课堂教学中的激励性评

    摘 要:激励性评价作为小学常用的教学方式,在教师日常教学中具有重要作用,在各小学学科中都有应用。在小学语文课堂上,语文教师需要与学

  • 高等教育人工智能应用研究综述

    奥拉夫·扎瓦克奇-里克特 维多利亚·艾琳·马林【摘要】多种国际报告显示教育人工智能是当前教育技术新兴领域之一。虽然教育人工智能已有约

  • 生活引路,作文随行

    周海波【摘 要】“写作教学应贴近学生实际,让学生易于动笔,乐于表达,应引导学生关注现实,热爱生活,表达真情实感。”教师如何让学生更加贴