专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
51好读  ›  专栏  ›  分布式实验室

Docker的另类用法,就是这么简单粗暴

分布式实验室  · 公众号  · 后端  · 2017-06-23 07:47

正文

我说另类是指我就用了原生的功能,这些对我们来说基本够用了。还省去了很多开发维护的工作量。


最小化的使用Docker,保证资源利用最大化和服务分钟级切换。


现在业内一提到Docker就必然说到Kubernetes、Mesos。然后就提到重写Kubernetes、Mesos,优化Ubuntu内核等等。作为一个资源紧缺的使用者我只能表示用不起。那么真的需要这么用吗?Docker自带的工具可以吗?


其实我们经常处于消费过剩,需求过剩的状态。很多需求都是伪需求,没必要什么都做到100%。为了达到这目标需要的资源比做到70%要多几十倍。我们使用工具目标是用最少的投入来解决问题。简单粗暴没什么不好。


首先我们使用Docker是为了解决服务稳定性和资源紧缺的问题。现存很多关键系统(非生产)都跑在古老的服务器上,说挂就挂。很多系统跑在VM上,宿主机资源不足。说不定突然VM就崩了。甚至于宿主机直接挂了,再也启动不了。想上新系统,机柜也没空间。所以为了保证这些系统的稳定和高效,就决定把这些系统迁移到Docker系统。



先用一批新机器安装Docker,配成Swarm集群。然后把用的服务一个个做成image,上传到集群上的Docker Hub。所有服务的端口全部固定,人为错开。网络全部使用Host模式。所有的数据全部从外部存储挂载。就是这么简单粗暴。


然后把所有服务启动在Swarm上,看看负载情况,不行就手动指定机器。全部启动完成后,把IP和Port填入DNS和Nginx。其他人就可以通过域名来访问到对应的服务。如果服务挂了,重启这个服务,然后修改对应的DNS和Nginx。如果服务代码变了,直接JENKINS编译出新版本image到Docker Hub。停服务,拉镜像,重启,修改DNS,这些都可以通过脚本完成。


下一步在所有镜像里添加自主开发的Agent来完成服务监控,完成服务自发现。再加上服务监控。基本就可以用一段时间,不用折腾了。


这个方案的缺点就是如果是JIRA这种有License的软件,必须手工重新去获取机器信息,然后重新申请License。不过正常情况服务就这么起个一年,也不用管它。系统监控通过Zabix和我们自己开发的Agent来进行。也能满足日常监控需求。


这样搭建整个环境,2个人搞两周就行了。


中等规模测试环境Docker的规划,环境网络隔离及持续集成。


因为我们是金融公司,所以目前生产系统还没有打算上Docker。在测试环境还是可以用Docker的。


由于多个测试环境需要互相隔离,而且服务一般都部署在80端口,所以就要比前一个用法进阶一点了。用Contiv进行VLAN的隔离。各个环境互相隔离。IP也自动分配,不用自己管了。服务启动后自己上报信息,修改DNS和Nginx的信息,内部外部都可以访问。


针对不同的测试环境建不同的Jenkins,可以产生对应的镜像部署到对应的测试环境。缺点是不能做到按需建立和销毁环境。那个还需要进行很多开发工作。整个Docker的动态伸缩也没在考虑过程中。毕竟规模不大。预先划分出5、6套测试环境足够使用。



这样就把整个CI内置到测试环境中了。


Q&A


Q:请问从开始看Docker到完成环境搭建大概用了多长时间?
A:前期的学习和选型用了2个月。后面基础搭建用了1个月,耗时最长的是旧服务的Docker化,这个到现在还没全部完成,因为技术债太多。


Q:可以说明下为什么生产环境不用Docker吗,跟你们是金融公司属性有什么关系?

A:因为金融公司对于稳定性有非常高的要求,同时对于生产服务器数量和空置率又不敏感。所以Docker这样的新技术应用还是需要不会那么快切入。同时运维团队也要去学习,技术储备等都是阻碍。所以现在很多银行也只是在周围不重要,变化频繁的系统开始尝试Docker。


Q:主要想了解下你们集成的流程。

A:CI的流程和普通的CI类似。代码变动后触发Jenkins,Jenkins会编译,打包,产生一个对应的发布单元的新容器版本。然后触发对应的脚本来停服务,取镜像,启动容器。


Q:为什么不考虑在私有云平台上玩?

A:因为资源限制,从硬件及人力上都不足。另外就几十台服务器,没必要。如果有几百台就要考虑资源调度等因素。


Q:请问容器做编排管理,你们选用什么工具?

A:我们只用了原生的Swarm。这样不用考虑开源软件二次开发及工具间的版本兼容问题。


Q:如何让宿主机挂载到存储之后,让容器全部跑在存储里面?

A:容器本身还是在Docker主机的磁盘中,但其他数据:例如配置文件都是从SAN上挂载到容器中。这样保证如果Docker主机down了,容器可以在其他主机上重启恢复。


Q:为什么把JIRA也Docker?

A:因为资源不足,没有强大的主机来跑JIRA,也没有办法主备。所以干脆把这些重要系统都放到容器里。这样就可以用较少的主机来保证性能和可用性。


Q:镜像带环境变量属性吗?

A:看情况,我们跑自动化测试的镜像有环境变量属性,因为有很多可变参数。


Q:如果服务挂了,重启服务。重新修改DNS和Nginx,问题1:服务挂了,Swarm可以负责重启吧?问题2:为什么重启后需要改DNS Nginx。Swarm的ingress网络可以从任何一台node路由到对应的Container吧?







请到「今天看啥」查看全文