2017年3月,又迎来Docker的生日周,今年将有130多个Docker Meetup在全球举办,共同为Docker庆生。网易云作为杭州的主办方,在3月12日成功举办了Docker Meetup,为Docker庆祝4周年生日!
大雨并没有影响大家的技术热情,还有很多小伙伴特地从武汉、南京等地赶来参加活动,在这里也感谢他们的支持!
Docker生日会开场演讲
活动开场,网易云高级产品经理刘发明首先为大家带来了开场演讲,刘发明主要介绍了Docker的概念和发展历程。
刘发明,网易云高级产品经理,10年文件系统开发和架构经验。自主开发类kubernetes容器云管理平台。熟悉云计算平台通用架构和技术。
官方对于Docker的定义是:Docker是一个面向开发者、运维和企业的容器管理平台:
对于开发人员来说,Docker可以提供一套标准化的应用打包格式,避免“work on my machine”情况的出现;
对于运维人员来说,用Docker可以快速搭建和配置复杂的环境;
对于企业来说,用Docker可以构建敏捷的软件交付流程,产品新特性快速上线。
什么是容器?
容器就是通过Linux的命名空间,将一个或一组进程互相隔离起来,用起来就很像虚拟机。
容器和虚拟机有什么区别?
容器是共享内核的,上面有很多进程,这些进程是相互隔离的;虚拟机比容器多一层内核,要装虚拟机首先要装一层客户操作系统,然后在操作系统上部署应用。所以容器比虚拟机更轻量级,启动更快。
但容器和虚拟机是可以相互补充的,容器可以部署在虚拟机上,它们互相配合可以为IT提供更方便的管理和部署。
Docker的发展历程
最开始Docker的目的比较单一,主要是给开发者用,慢慢发展才形成了覆盖技术社区和企业的全生态链的平台。
为了协调社区和企业的不同需求,Docker的版本也进行了分支,目前已经分为社区版和企业版,社区版发布频率更高,发展更快;企业版每个季度发布一次,更稳定。
网易云Docker实践经验分享
接下来,网易云高级开发工程师汪幸分别从容器基础、编排、网络架构和存储方案四个方面,介绍了网易云在开发过程中使用Docker的一些实践经验,并结合实例、场景分析了使用Docker过程中遇到的问题以及相应的解决方案。
汪幸,网易云高级开发工程师,北邮硕士毕业,主要从事云计算、Kubernetes、Docker相关开发工作。
容器基础
Docker的基础功能分为3个开源项目:Docker、Containerd和runC。Docker 1.1版本基于OCI,把原本的一个项目拆分为了三个项目,目前runC项目也不再是Docker主导了,而是Kubernetes、RedHat团队来维护。2016年底,Docker公司宣布将containerd从Docker Engine中分离,并捐赠到一个新的开源社区独立发展和运营。不管是被迫还是自愿,Docker已经渐渐失去了对运行时项目的管控,将更多的精力放在了编排技术的研究。
Docker的底层技术主要分为namespace和cgroups,namespace主要负责Docker的资源隔离,cgroups主要负责容器的资源控制。在容器创建之初,namespace就确定了,无法修改;cgroups在运行时是可以调整的,网易云就基于这个功能做了容器的动态调整功能。
一个容器就可以简单抽象为由namespace、cgroups和Linux capabilities机制构建的一个沙盒。但是,这个沙盒在隔离性和扩展性上都有很多问题,汪幸通过2个网易云在实践过程中遇到的问题进行了说明:
其中一个是资源信息显示错误,比如一个16G内存的虚拟机上面跑了8个2G的容器,使用free命令,看到的仍然是16G,造成这个问题的原因就是/proc目录隔离不彻底。
另外一个问题是容器运行时挂盘的实现会遇到2个难点:一是mount namespace隔离导致主机文件系统在容器中不可见,另一个是capabilities没有mount权限,汪幸分别介绍了网易云提供的解决方案。
容器编排
编排就是把海量的容器部署到集群中。汪幸首先介绍了Docker原生的三种编排技术:
Swarm独立于Docker Engine的,集成在Docker Machine中,需要额外的KV存储,没有服务模型。现在基本上已经是一个废弃的项目;
SwarmKit是Swarm Mode的基础本质上是完全独立的开源项目,集群可以不使用KV存储,但如果用到overlay网络则需要提供;
SwarmMode集成到了Docker Engine,不需要额外的KV存储,支持服务模型以及相应的扩容缩容、服务发现、滚动升级、路由和负载均衡等。
网易云底层是基于Kubernetes的编排技术,比Docker原生的Swarm技术更稳定,特性也更丰富。并且Kubernetes的架构设计来源于Google长期的集群管理经验,更具性能优势。
当然SwarmMode也有自己的优点:使用很简单,集成于Docker cli,无需KV、DNS等外部以来,部署、学习成本低;还有完整的容器生态工具链支持,更好地集成于Docker Compose、Docker Machine、Docker Universal Control Plane。
网络架构
Docker的缺省网络有三种:none、bridge和host,一般都不会直接使用,而是使用用户自定义网络:
container模式就是让多个容器共享一个容器的网络栈,把一组关系紧密地容器作为统一的服务对外提供;
bridge单机网络实际上是在宿主机上创建了一个网桥,一般通过NAT技术对外提供服务;
overlay是缺省跨主机网络,底层实现是隧道技术。
无论是通过NAT技术对外提供服务还是overlay搭建网络,这两种模式再叠加到宿主机原有的网络模式上,性能损失都是很大的。
存储方案
要了解Docker的存储驱动,首先要明确联合挂载的概念。联合挂载实际上是把容器的读写层和所有镜像的只读层合并起来,对外提供一个视角,选择存储驱动实际上就是选择如何实现这个联合挂载。
Docker官方经过实验也给出了很多参考标准,网易云选择了overlay的实现方式,也是Docker当年主推的挂载技术,相比其它AUFS和Device Mapper来说,性能是最高的,缺点是还有很多不完善的地方。汪幸也举例说明了网易云在存储驱动方面遇到的问题以及解决方案。
Docker卷和Docker的网络很类似,通过插件提供了本地卷和远程共享卷两种方式。网易并没有使用Docker卷插件,而是使用了IaaS层基于Ceph定制的高性能云盘,汪幸从盘处理逻辑、Docker修改和容器恢复三个方面进行了详细说明。
持续集成的容器化实践
接下来,网易云的美女程序媛张雨介绍了如何通过容器部署的方式快速搭建Jenkins环境,完成软件开发的容器化构建部署及测试的流程实践。
张雨,网易云高级系统测试工程师。2015年加入网易质量保障部平台测试一组,在网易云基础服务从事测试工作。目前致力于平台产品整体质量保障,探索提高测试效率的工具和方法。
随着Docker技术的兴起,推动了微服务、DevOps和持续集成/持续交付等技术革新。持续集成指开发人员将代码定期合入到中央仓库后触发的一系列构建、静态代码检查、 单元测试、 部署、接口测试等一系列构建或集成的行为。主要目标是更快发现并解决缺陷,提高软件质量,并减少验证和发布新软件更新所需的时间。
上图是一个传统的持续集成流程,主要的问题是:
部署环境的成本较高 (包含持续集成本身)
测试环境的不一致性,导致问题不能复现
相对开发周期较长
张雨介绍了基于容器的持续集成的实现,使用容器搭建持续集成Master 和Slave环境,结合支持持续集成功能的镜像仓库,实现镜像化版本管理,最终实现容器化CI & 容器化测试。
上图是基于容器实现的一个持续集成流程,最明显的变化就是Jekins换成了Docker,并且新增了容器仓库角色,另外测试在交付的时候不光会反馈一个结果,还会把镜像也作为一个测试结果交付,这个镜像里面就封装了代码和配置的环境。
这样一来持续集成环境搭建的步骤变得非常简单,只需要创建一个Jekins的容器服务,在创建的时候设置好环境变量来解决Slave和Master注册的问题,张雨以网易云基础服务为例,详细描述了整个过程。
Docker实践
“纸上得来终觉浅 绝知此事要躬行”,干货演讲结束后,网易云组织大家进行了Docker Lab的实践。感兴趣的小伙伴也可以打开下面的链接去体验一把:https://github.com/docker/labs
为了方便大家的操作,网易云首席技术布道师黄庆兵特别搭建了一套在线的Docker环境:http://docker.bingohuang.com/
Docker庆生蛋糕
除了干货演讲和Docker实践,网易云还提供了美味的Docker生日蛋糕,共同分享Docker的喜悦。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。