专注于
IT技术和业内交流

Docker容器对存储的定义

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容器对存储的定义

分享到:更多 ()

专注品牌化高端网站建设

商务服务联系我们