在数据爆炸的今天,企业对互联网应用的要求一方面是速度,要求可以快速迭代,适应市场需求变化;另一方面是稳定性,在面对用户量不断增长以及软件应用不断更新的情况下,可以依然保持业务持续不中断。这也是云计算发展的一个方向,用户可以不必自己部署、安装基层应用,因为可以直接交给云平台实现。而在这方面,Docker是一个尤其典型的应用!关于Docker等容器技术,你究竟了解多少?其使用场景都有哪些呢?9月24日,由DockOne社区和天云软件联合主办的容器技术沙龙在北京IC咖啡举办,由各位技术大咖带你近距离了解Docker!
作为一个标准的中间件,Docker相当于云计算的“集装箱”,承载着后端的各种技术,并且可以保障多个技术同时运行的速度。技术人员只需关注将自己开发好的代码、技术放在Docker镜像里面,而运维人员也只需关注让这种标准化的Docker在平台上运行起来即可。
首先,中国电信云计算公司研发工程师张其栋给大家带来“中国电信基于Mesos+Docker的运维自动化在CDN中的实践”的主题演讲。
张其栋首先表示,使用Mesos+Docker的大背景是中国电信云公司的CDN架构。之所以采用这样的架构,是因为后期的业务范围比较大,用户比较广,后期的设备量会达到几万台,如果用传统的思路进行运维,对于运维的压力太大。
张其栋认为容器技术有自动化部署、持续集成、敏捷开发和提高开发效率、弹性调度、资源复用等优势。他表示,中国电信在选择了Docker之后,首先是实现业务软件的容器化。比如直播转码业务软件实现容器化。在实现了业务容器化之后,就需要选择编排软件。中国电信最终选择的是Apache的Mesos。另外,他给出了选择Mesos的如下几个原因:一是相对比较成熟;二是数据分析相关软件跟Mesos结合起来更容易。
当然在Docker落地过程中也遇到了一些问题,张其栋表示中国电信在落地Docker的过程中确实也遇到过一些坑,当然他也给出了自己的解决建议:
1、Docker默认共享内存太小,普通权限无法更改。我们给了最高权限。现在新版本Docker已经支持更改共享内存了,在测试环境里可以用新命令去更改。后期会把最高权限去掉,使用命令行进行共享内存的更改。
2、Docker最高权限会把容器107G存储给写满,写满之后,再生成一个容器可以成功,但是运行不起来。有两个方法,一个是更改107G存储,变成2T或者4T的大硬盘,不能从根源上解决问题。还有一个办法,从业务软件上避免这个问题,把日志尽量往小写,另外把日志映射出来。
3、直播转码和切片无法获取CP方给的组播流。解决方案是给容器HOST模式,性能上没有损失,但用网络比较多。
4、修改防火墙后,Docker网络环境不通。修改防火墙后重启防火墙,之前运行起来的镜像,再次运行时网络是不通的。现在的解决方案是规避它,在使用镜像的时候,先把防火墙所有的配置参数调好,不要重启防火墙。
北京天云融创软件技术有限公司研发总监刘春阳主要负责公司容器化以及平台化产品的规划和设计。他给大家带来主题为“企业应用容器化的痛点、坑和解决之道”的演讲。主要分享了针对企业级的平台性的产品设计过程当中,可能会面临什么样的需求,面临什么样的问题,包括天云软件本身所采取的一些技术选型。
他认为,在电信领域,Docker有着自己的特殊性。首先电信行业里面有运营商企业,然后是应用提供商,然后是资源提供商,这三个是分离的。管理方对于资源提供方,应用提供方都有要求,因此要求业务要能敏捷,要能快,尽快适应他们的需求。其次是业务要稳定;最后是高效率。而容器技术给以上三方带来了改变,利用容器,可以利用行程中的程序逻辑,可以用标准的协议交付第三方,使彼此之间角色没有重叠现象资源提供者可以无差别的对待资源。其次,利用容器技术,可以在Docker放货柜混合编排,混合部署,促进平台的统一性。另外,通过利用标准化的容器技术,促进研发流程的自动化和应用模式化。
刘春阳认为,容器现在面临的挑战主要有以下两个:
1、标准不统一。至少目前来说,容器的标准相对统一,但是容器平台管理的标准至少有三家在,标准不统一,导致大家在使用过程当中,技术选型的时候会有挑战。
2、容器的技术涉及到资源,涉及到应用内部,所以它具有一定的轻量性,不是交付虚机就可以。因此容器要解决个问题,否则就没有办法做模式化,而不做模式化的话,平台的很多东西都无法构建。
当当网个性化推荐组项目负责人肖骁主要为大家分享了关于当当网个性化推荐组应用Docker进行应用部署以及小团队试水Docker的的若干经验,分享主要包括:现有应用Docker化的过程和结合Jenkins的自动化构建。他的演讲主题是 “当当网Docker应用实践”。
肖骁告诉我们,要是把程序放在容器里,程序至少是无状态的,不能依赖于宿主机的一切环境和目录等。Docker以后,代码流水线管理,提高开发效率。
而用Docker把现有的程序Docker化,需要注意哪些东西呢?
1、镜像构建。一定要从Dockerfile生成,如果不从Dockerfile生成,以后更新、回滚是很麻烦的。
2、避免依赖过深。不要在基础镜像上加太多产生其他的镜像,最多是三四层。一层是base镜像,再往上是工具,再往上一层就是自己的程序,再多就比较乱。
3、发布。使用Docker可以用很标准的过程做上线、回滚或者是升级。
4、日志管理。如果把日志放在容器里,容器销毁了,日志就没有了。要把日志实时保留,有一种办法是把日志放在宿主机,完全不依赖宿主机的任何环境。肖骁建议放一些日志收集等。
5、环境变量。指定里面的环境变量,应用再去环境变量。这是Docker启动的时候用这个,如果上集群的话,这个稍微麻烦一点。
6、配置中心。用数据库,把配置放在里面都可以。用Docker的话,在里面改配置文件,再启动的时候,配置文件就没有了,有个简单的方法就是配置文件,给每一个版本配置文件都打一个容器。
7、网络管理。 现在主要是用Host,网络性能最好用Bridge,现在如果用自定义的话,可以建多个像Docker0这样的网络,可以为容器之间连接和隔离。
他说,如果自己团队想用Docker的话,运行环境、内核版本、操作系统的发行版本,这些都是有要求的。
1、镜像载荷要求。一个现有的比较成熟的架构应用,要放到Docker里要考虑是不是依赖宿主机的环境,包括本地的IP和本地目录等。
2、数据中心过大。 数据中心过大时采用折中的方法,先往上扔一个空数据,后台第一次启动的时候,如果容器里面没有数据的话,自己就下了,这可能也是一个折中的办法。
3、镜像管理、版本控制。如果提交一个镜像,包括版本号等,必须要有比较严格的规定,格式和定义必须要仔细规定一下,要不然就会乱。
相信不少人都想知道,在异构技术栈、5种语言、500+个微服务(包括Task)、网状调用关系状况下,如何做到一键构建测试环境,并同时支持50个Feature独立测试却互不影响? 折800的架构师刘凯以 “用Docker&K8s构建自动化测试环境”为主题的演讲为大家做了妙答:用Docker + Kubernetes实现一键构建测试环境。按需拉起容器,按需部署,按照关联计算,拉起关联的服务。
但是,在使用Docker + Kubernetes过程中需要解决如下问题:
1、变异构为同质。不同的语言部署方式是不一样的, 必须用一个方式,代码上传的时候,自带环境、版本和库。那么用什么样的部署方式把异构的语言变成同步呢? 提供一个统一的接口可以构建、传输、部署。
2、配置管理。要自动化部署,一键拉起几百个服务和几十个服务,要知道相互的关系,要连什么服务,要怎么配置,必须做到自动化配置。要加一个存储,要加一个ES,必须在ES上建索引等。
3、服务管理。如何做服务注册、服务发现、如何做负载均衡。不同类型的服务,启动以后,位置是不一样的,HTDP服务要对外挂IP,要注册到外面的负载均衡里面,应用层面的服务是不需要这样做的。
4、监控。如果测试时,测不通,报告异常、超时,必须能在竖状结构里面知道哪个节点报错,如果从最前端一层一层向下排查,将会非常耗时。失败了用红点标出来,然后告诉失败原因是什么。请求发不过去,是什么原因,图形数据怎么来?采用更加激进的做法:整个测试环境,把所有包抓下来,知道源IP以及调度内容是成功还是失败,从而分析所有容器节点的调度关系是成功还是失败,这些数据配合服务依赖关系,完全可以把数据贯到监控数据上,这样一来就知道哪个节点进来了,有什么错,有多长时间。
5、兼容性。Docker化以后,怎么把之前没有Docker化的服务和流程融入到里面,Docker研发流程要做相应的改造。接口和数据库要兼容。
6、编排部署。上线、开发时先更新哪个服务,再更新哪个服务,加一个配置,然后改数据库等等。这么复杂的事情,如果没有合理的编排是很难做到自动化的。用DAG的方式去描述部署计划,通过拖拽的方式表达要干什么。
7、隔离。一键拉起测试环境同时还要做到按需拉取,要对服务之间的调度关系做隔离。在隔离区里面,每个来源IP不一样,第一个隔离区的来源IP,把请求转到相应的隔离区里面。
8、依赖关系。服务之间调度链很深,如果不对调度链关系进行管理,很难知道被拉起的是什么服务。向上找依赖分析,把依赖的服务一起部署。把500个服务的依赖关系都清算出来,放在一个服务库里面,能看到相互依赖关系。
9、统一命名。看起来没有技术含量,但是在做自动化部署和自动化测试时是非常关键的。
本文作者:谭盼雨
来源:51CTO