【编者的话】Docker技术自从诞生以来已经带来了一场云计算的革命。其进展速度之快,接受程度之高让人惊叹。国内已经有不少介绍Docker技术的文章,它的生态,网络,管理,构建,应用都有方方面面的资料。然而,要想在生产环境中部署Docker,开发运维人员必须还要明白docker容器是如何使用存储(包括外部存储),才能更好地为容器选择合适的存储方案。本次交流与大家分享Docker对存储的定义的来龙去脉。
我是一名老程序员了,今天给大家分享的是Docker容器和存储系统系列的东西。分享之前要说的一点是:今天的分享是从一个技术人的角度出发的。
做产品和自用或者做项目服务是不一样的。产品就是交付用户后,对所发生的所有可能的情况基本都有比较明确的判断,而作为技术人员,对将要遇到的问题和对问题考虑的角度都是不确定也不尽相同的。
Docker技术自从诞生以来已经带来了一场云计算的革命。其进展速度之快,接受程度之高让人惊叹。国内已经有不少介绍Docker技术的文章,它的生态,网络,管理,构建,应用都有方方面面的资料。然而,要想在生产环境中部署Docker,开发运维人员必须还要问自己关于数据存储的几个问题。
关于Docker存储的介绍目前国内比较少,作为一名在存储和云计算领域扎根多年的IT人,我希望能够亲自研究这些课题,抛砖引玉,分享讨论。其中的观点不一定都是正确的,但是希望能够引起更多人的思考和共鸣。
Docker技术自从诞生以来已经带来了一场云计算的革命。其进展速度之快,接受程度之高让人惊叹。国内已经有不少介绍Docker技术的文章,它的生态,网络,管理,构建,应用都有方方面面的资料。然而,要想在生产环境中部署Docker,开发运维人员必须还要明白docker容器是如何使用存储(包括外部存储),才能更好地为容器选择合适的存储方案。本次交流与大家分享Docker对存储的定义的来龙去脉。
一.Docker的整体数据存储的方式
首先今天分享的是这个系列的第一节,即Docker的整体数据存储的方式。要说明这个问题,我们可以先看看容器和VM的区别,看看他们对存储有哪些不一样的要求。
容器和VM,几乎所有人都会说容器就是一种比VM更轻更优的虚拟化技术。其实,我的理解不太一样,我认为容器和VM最大的不同在于容器不是VM。这个,不是废话么。仔细分析一下,容器的重点其实不在虚拟化技术,它叫Container, 并没有Virtual这个词。它的关注核心已经从冷冰冰的Machine,上升到了如何更好的去承载应用。这个是有本质区别的。VM关注的是如何让Machine更加高效,VM发展的再厉害,它也是一种更高级的Machine。它看待后端存储其实是和一个物理Machine看待后端存储是一致的。而容器呢,它希望后端存储对它来说是透明的,不用它关心的,它更加关心的是应用数据的组织形式。
下面这个表是我做的一些对比。
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的接口规范:
可以看到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机制的实现感兴趣的人多,下次可以搞个分享。