DockOne技术分享(五十七):Docker容器对存储的定义(Volume 与 Volume Plugin)


【编者的话】Docker技术自从诞生以来已经带来了一场云计算的革命。其进展速度之快,接受程度之高让人惊叹。国内已经有不少介绍Docker技术的文章,它的生态,网络,管理,构建,应用都有方方面面的资料。然而,要想在生产环境中部署Docker,开发运维人员必须还要明白docker容器是如何使用存储(包括外部存储),才能更好地为容器选择合适的存储方案。本次交流与大家分享Docker对存储的定义的来龙去脉。

@Container容器技术大会将于6月4日在上海光大会展中心国际大酒店举办,来自Rancher、携程、PPTV、蚂蚁金服、京东、浙江移动、海尔电器、唯品会、eBay、道富银行、麻袋理财、土豆网、阿里百川、腾讯游戏、数人云、点融网、华为、轻元科技、中兴通讯等公司的技术负责人将带来实践经验分享,5月7日之前购票只需438元,欢迎感兴趣的同学抢购。

Docker技术自从诞生以来已经带来了一场云计算的革命。其进展速度之快,接受程度之高让人惊叹。国内已经有不少介绍Docker技术的文章,它的生态、网络、管理、构建、应用都有方方面面的资料。然而,要想在生产环境中部署Docker,开发运维人员必须还要明白Docker容器是如何使用存储(包括外部存储),才能更好地为容器选择合适的存储方案。本次交流与大家分享Docker对存储的定义的来龙去脉。

我是一名老程序员了,今天给大家分享的是Docker容器和存储系统系列的东西。分享之前要说的一点是:今天的分享是从一个技术人的角度出发的。

做产品和自用或者做项目服务是不一样的。产品就是交付用户后,对所发生的所有可能的情况基本都有比较明确的判断,而作为技术人员,对将要遇到的问题和对问题考虑的角度都是不确定也不尽相同的。
  1. Docker的数据存储组织形式是什么?
  2. Docker目前的存储生态圈各个公司的技术特点?
  3. Docker的出现对未来存储后端要求会带来哪些技术变革?


关于Docker存储的介绍目前国内比较少,作为一名在存储和云计算领域扎根多年的IT人,我希望能够亲自研究这些课题,抛砖引玉,分享讨论。其中的观点不一定都是正确的,但是希望能够引起更多人的思考和共鸣。

Docker技术自从诞生以来已经带来了一场云计算的革命。其进展速度之快,接受程度之高让人惊叹。国内已经有不少介绍Docker技术的文章,它的生态,网络,管理,构建,应用都有方方面面的资料。然而,要想在生产环境中部署Docker,开发运维人员必须还要明白docker容器是如何使用存储(包括外部存储),才能更好地为容器选择合适的存储方案。本次交流与大家分享Docker对存储的定义的来龙去脉。

一.Docker的整体数据存储的方式

首先今天分享的是这个系列的第一节,即Docker的整体数据存储的方式。要说明这个问题,我们可以先看看容器和VM的区别,看看他们对存储有哪些不一样的要求。

容器和VM,几乎所有人都会说容器就是一种比VM更轻更优的虚拟化技术。其实,我的理解不太一样,我认为容器和VM最大的不同在于容器不是VM。这个,不是废话么。仔细分析一下,容器的重点其实不在虚拟化技术,它叫Container,并没有Virtual这个词。它的关注核心已经从冷冰冰的Machine,上升到了如何更好的去承载应用。这个是有本质区别的。VM关注的是如何让Machine更加高效,VM发展的再厉害,它也是一种更高级的Machine。它看待后端存储其实是和一个物理Machine看待后端存储是一致的。而容器呢,它希望后端存储对它来说是透明的,不用它关心的,它更加关心的是应用数据的组织形式。

下面这个表是我做的一些对比。
1.png

Docker并不推荐采用Root Image的存储方式来存储应用数据。因为应用数据对安全、可用性、共享、性能等方面的要求和Root Image的要求是完全不一样的。Docker采用了Volume这样一个独立的数据访问接口,应用通过Volume去访问相关的数据,Volume的实现和CoW的分层文件系统完全独立。通过Volume Plugin机制可轻易驱动外部存储。如Rancher Convoy或者Flocker这样的存储驱动去管理和访问具体的存储设备。

二.为什么需要Volume这样的数据接口

为什么我们需要Volume这样的数据接口。我们要深刻理解的是Docker容器是承载应用的,是对应用环境的抽象而不是对OS运行环境的抽象。Docker容器天生设计就是为了应用的运行环境打包,启动,迁移,弹性拓展,所以Docker容器一个最重要的特性就是disposable,是可以被丢弃处理,稍瞬即逝的。而应用访问的重要数据可不是disposable的,这些重要数据需要持久化的存储保持。Docker提出了Volume数据卷的概念就是来应对数据持久化的。如果把容器比喻成一个人,那么这个人的重要数据(物质上的)就是他的财产(钱)。容器可以不存在了,但是数据必须还要存在。小沈阳说,人生最大的痛苦就是人没了,钱还在。容器会说,正相反,Docker最大的幸福就是,我不在了,数据还在。

所以,定义好需要持久化的数据,采用Volume接口来存储访问是容器应用需要考虑的首要课题,必须引起高度的重视。我们可以想象一下容器和应用之间这样一段对话。


容器:我稍瞬即逝,我稍瞬即逝,重要的事情说三遍,我稍瞬即逝。
应用:哦,这样啊,那我的重要数据不能丢怎么办?
容器:请用Volume数据卷,请用Volume数据卷,重要的事情说三遍,请用Volume数据卷。
应用:&%#!,知道了,真啰嗦,你的前世一定是一台复读机,妈妈再也不用担心你的学习了。

三.数据迁移

数据能够持久化以后,应用容器迁移和数据共享就成为了可能。Volume接口可以说很大程度上讲是容器迁移和数据共享的基础组件。我们先谈谈迁移。假设一个人需要从一个城市搬到另外一个城市,如果让他把所有的现金都打包带到身上是不太现实的,也非常不安全。怎么办呢?很简单,他去银行开个账户,把钱存进去,到另外一个城市的分行取就可以了。容器迁移的道理是一样的,因为数据都是存储在Volume卷(银行账户)里的,所以容器在集群的另外一个服务器甚至云端重新启动的时候,只要挂载同样的数据卷就可以了。当然,这些都需要数据卷后端有共享存储,或者数据副本的支撑。

容器应用迁移的核心其实是数据卷Volume迁移,(注:容器本身的迁移由镜像库Docker Registry主导) 这一部分涉及数据存储,安全加密,网络传输,性能优化,快照备份等等的技术点,是容器管理的核心功能。Volume数据卷更是容器间共享数据的基础,道理很简单,数据是存储在容器之外的,那么容器间共享同样一个数据卷就能共享数据。为此,Docker容器还专门推出了数据卷容器这种特殊的容器,只要一个数据卷容器来挂载Volume, 其他需要共享Volume的容器只需要很简单的指明和这个数据卷容器共享Volume就可以了。有兴趣的读者可以自己查找数据卷容器的资料。

为了更好的支持容器迁移和数据共享,Docker推出了Volume plugin接口机制,让第三方的存储厂商来支持Docker Volume并且在此基础上进行功能拓展。下面这个表提供了Volume plugin的接口规范:
2.png

可以看到Volume plugin的接口规范是相当简洁的。大部分的存储和高级功能由和Volume plugin driver驱动的后端存储提供。

Rancher Convoy:Convoy是Rancher Labs用go开发的支持Device Mapper、NFS、EBS、GlusterFS多种后端存储的Docker Volume plugin driver. Convoy还提供了一个存储拓展功能(如快照、备份恢复等)的接口框架。

Flocker:Flocker volume plugin driver主要用于多主机环境Docker数据卷的迁移,从而支持数据库应用等stateful有状态应用的主机间迁移。

四.Docker Volume框架

附送Docker Volume机制的图,作为结束,如果对Docker Volume机制的实现感兴趣的人多,下次可以搞个分享。
3.png

Q&A

Q:Kubernetes中是否有Volume的处理模块,或者说Volume的重要性,以及前面提到的各种操作,在Kubernetes中是怎么体现的?

A:Kubernetes借助Docker Volume实现一套自己的volume管理机制。Kubernetes的相关问题下一次再详细说明。
Q:请教下现在分布式存储很多,Ceph、CFS等,哪个性能更好,更稳定,适合上生产?

A: Ceph、Glusterfs都有上生产环境成功的案例。 就运维成本来说Gluster更加简单点。Ceph的运维成本较高。稳定性上Gluster因为设计更简单,所以社区版本就已经稳定了。
Q:Docker Volume 和Kubernetes volume/persistent volume比较, 有什么异同?

A:Kubernetes借助Docker Volume实现一套自己的Volume管理机制。
Q:应用日志管理收集是否适用Volume?有没有什么注意的地方?推荐的共享方式?不同应用是否-v到不同的地方?

A:容器如果需要持久的数据,使用Volume挂在到目标存储上。注意日志太多对系统资源的占用。
Q:想问下有没有类似测试过,或者说你现在觉得性能比较好的一些方案?有没有测试用例级数据?

A:存储的性能是与实际的应用是相关联的。我们开发适合容器的存储。
Q:一个存储盘能共享挂载到多个容器吗?

A:看后端存储类型,如NFS、Glusterfs是支持存储盘能共享挂载多个容器。
Q:Rancher刚出,不知道它这个Convoy能单独用么,比如说安装在Ubuntu?

A: Convoy与Rancher是独立的,可以独立安装在Ubuntu。
Q:请问有什么静态资源共享数据的方案,例如Web图片?

A:OpenStack Swift、GlusterFS都可以。
Q:Convoy或Flocker能支持rbd么?

A:原生的Convoy目前不支持rbd。现在我们做Convoy支持rbd的功能。
Q:不同主机上的容器能同时挂到一个共享存储上吗,最多能支持多少个?

A:共享存储支持就可以,NFS、Glusterfs都可以支持。
Q:Kubernetes和Docker Swarm两个更看好谁,如果只能选一个的话?

A:看具体的应用场景,Kubernetes会越来越稳定。Swarm对容器的支持会越来越好。
以上内容根据2016年4月28日晚微信群分享内容整理。分享人江松,有容云联合创始人兼研发副总裁。拥有16年的国内外企业级软件基础架构研发经验,在企业级存储,云计算解决方案方面有很深的技术造诣和行业理解。曾任美国AITech Ltd、爱尔兰Raidtec Ltd高级系统架构师,存锋科技Storwind创始人兼CEO。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

2 个评论

图不错,就是太小了,不太看得清
对我这种新手解惑很有帮助,感谢!

要回复文章请先登录注册