如何让Docker部署和管理更简单
分类:技术社区 发布时间:2015/10/10 0:00:00

Docker 是 PaaS 提供商 dotCloud 开源的一个基于LXC (Linux Container) 的高级容器引擎。Docker基于go语言开发,从Apache2.0协议开源,其源代码托管在 Github 上。自2013年以来,Docker在工业界迅速走红,无论是从 github 上的代码活跃度,还是从Redhat在RHEL6.5中集成对Docker的支持, 以及 Google 的 Compute Engine 对Docker 的支持都可见一斑。


   究其原因,Docker的迅速发展得益于现代Linux内核所具有的特性,如控件组(control group)、命名空间(namespace)技术,使Docker容器与宿主机之间的隔离更加彻底,能够实现同一台宿主机中多个容器的友好共存。正是由于Docker具有良好的隔离性,作为操作系统级的虚拟化方法,相比于以KVM等为代表的硬件虚拟化具有轻量级、资源占用少、启动快等优势,使Docker在云计算领域风靡一时。


   使用Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让应用程序具备可移植性,使应用系统的构建和协作更加容易。基于Docker,更容易在云环境下构建基于微服务架构的分布式应用集群,在每个Docker容器上只运行一个应用组件,通过一系列运行在Docker容器上的、分布式的应用组件实例来构建一个大规模的分布式应用系统。


   但是,随之而来的也是对基于Docker容器的大规模应用集群的部署和管理的难题,其中主要包括:1) 如何快速、自动化的实现大规模应用集群的部署?2)如何在运行时实现对集群的敏捷管理,快速完成集群实例的扩展和收缩?


   我们采用了Docker Swarm + Puppet + Docker file的方式来解决上述问题,如下图所示。其中,

   l  Docker Swarm 作为Docker集群的管理工具,使用标准的Docker API接口作为其前端访问入口,用以部署和管理Docker集群;


   l  Puppet是当前流行的自动化运维管理工具,我们使用Puppet与Docker Swarm交互,驱动Docker Swarm执行集群的管理任务;


   l  Docker file是创建集群镜像的基础,通过预先创建的应用系统的镜像文件来支持运行时基于Docker容器的应用组件实例的动态创建。


   本文以一个典型的多层架构Web应用FreeCMS为例来说明如何基于上述方法简化Docker集群的部署和管理。


   为了建立一个基于Docker的FreeCMS应用集群,我们采用Nignx作为前端的负载均衡组件,将FreeCMS的Web组件运行在Tomcat中作为Web实例,最后以MySQL作为后端数据存储和访问的实例。其中,应用集群的扩展和收缩主要针对Web实例完成,通过基于Docker的Web容器实例创建、部署、运行和停止等操作实现集群的管理。


   对于这样一个应用集群系统,我们首先建立Nignx、Tomct+FreeCMS、MySQL的Docker镜像。以Tomct+FreeCMS为例,其镜像文件的创建如下:


   FROM tomcat:8.0-jre8


   ADD ./freecms $CATALINA_HOME/webapps/freecms


   ADD ./context.xml $CATALINA_HOME/webapps/freecms/META-INF/context.xml


   ADD ./apm/* $CATALINA_HOME/apm/


   ADD ./catalina.sh $CATALINA_HOME/bin/catalina.sh


   CMD sh $CATALINA_HOME/bin/catalina.sh run


   由此,我们可以得到后续创建FreeCMS Web实例的Docker file镜像,Nignx 和MySQL的镜像创建与之类似。


   Docker Swarm可以执行的容器管理操作包括创建、启动、停止和销毁等,它的接口与Docker原生接口是一致的。


   创建

       


   docker –H tcp://[swarm Ip : port] [ run | create] [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]


   启动

       


   docker –H tcp://[swarm Ip : port] start [OPTIONS] CONTAINER [CONTAINER...]


   停止

       


   docker –H tcp://[swarm Ip : port] stop [OPTIONS] CONTAINER [CONTAINER...]


   销毁

       


   docker –H tcp://[swarm Ip : port] rm [OPTIONS] CONTAINER [CONTAINER...]


   然后,我们基于Docker Swarm提供的Docker API,创建针对Docker镜像的Puppet参数化脚本,用来执行创建、启动和停止容器实例等操作。如下所示即为创建FreeCMS容器的Puppet脚本,其主要执行流程为:首先创建系统的Service文件,然后Puppet调用系统Service的管理命令,以系统服务的方式驱动Docker Swarm去执行相应的Docker命令,来管理容器的创建启动等。


   cloudeploydocker::tomcat::instance{"freeCMS_POC_Tomcat3":


       nginx_instance_name => "freeCMS_POC_Nginx",


       registry  => "133.133.134.169:5000",


       #registry  => "ipoc",


       image  => "ipoc/tomcat",


       port   => "8093",


       instance_name => "freeCMS_POC_Tomcat3",


       mysql_instance_name => "freeCMS_MySQL_POC",


   mysql_alias_name => "freecmsMysql",


   }



   这样,管理员在部署应用集群实例以及增加或者减少集群中实例的时候,仅仅需要执行对应的Puppet命令即可,后续一系列执行过程将通过Docker Swarm自动完成,大大了简化Docker集群的部署和管理。

体验创新云技术带来核心业务效率显著提升
立即预约,加速企业数字化转型进程
Copyright ⓒ 2022 苏州博纳讯动软件有限公司 国徽 苏ICP备13004761号 法律声明及隐私政策