Docker使用OpenStack-Cinder持久化volume原理分析及实践 (docker是干什么的)

教程大全 2025-07-17 21:34:38 浏览

Docker使用OpenStack Cinder持久化volume原理分析及实践

2017-10-20 15:25:17Docker容器本身是无状态的,意味着容器退出后不会保存任何数据。但实际使用场景,肯定是需要保存业务数据的,Docker通过volume实现数据的持久化存储以及共享。

1 背景知识

1.1 OpenStack Cinder简介

OpenStack Cinder为OpenStack提供块存储服务,其功能类似AWS的EBS服务,目前使用最多的是为OpenStack Nova虚拟机提供虚拟硬盘功能,即把volume挂载到虚拟机中,作为附加弹性硬盘使用,关于OpenStack Cinder volume挂载到虚拟机的过程分析可以参考之前写的博客OpenStack虚拟机挂载数据卷过程分析,这篇博客也是了解本文内容的基础。

但是,OpenStack Cinder不仅仅是为Nova虚拟机提供云硬盘功能,事实上,Cinder并不关心是谁在消费它的volume,除了虚拟机,还有可能是物理机和容器。Cinder volume挂载到物理机前面已经介绍过,可以参考OpenStack中那些很少见但很有用的操作。Cinder volume挂载到虚拟机以及物理机都介绍过了,剩下最后一个内容,Cinder volume如何挂载到Docker容器中呢,本文接下来将详细介绍并通过两个driver实例实践。

1.2 Docker volume简介

我们知道Docker容器本身是无状态的,意味着容器退出后不会保存任何数据。但实际使用场景,肯定是需要保存业务数据的,Docker通过volume实现数据的持久化存储以及共享。

默认情况下,Docker会使用本地目录作为容器的volume挂载到容器实例指定的路径。用户可以指定已经存在的路径作为Docker volume,如下:

以上把本地data目录挂载到容器/data路径中,注意源目录路径必须使用绝对路径,否则Docker会当作volume name。

你也可以不指定本地路径,此时Docker会自动创建一个新的空目录作为Docker volume:

docker是干什么的

可以使用docker volume ls查看创建的volume:

通过inspect子命令查看源路径path:

从以上输出的结果可看出本地源目录为/var/lib/docker/volumes/0e8d4d3936ec3b84c2ee4db388f45cbe5c84194d89d69be6b7a616fbdf1ea788/_data,这个目录是Docker自动创建的。

由此我们也得出结论,Docker创建的volume只能用于当前宿主机的容器使用,不能挂载到其它宿主机的容器中,这种情况下只能运行些无状态服务,对于需要满足HA的有状态服务,则需要使用分布式共享volume持久化数据,保证宿主机挂了后,容器能够迁移到另一台宿主机中。而Docker本身并没有提供分布式共享存储方案,而是通过插件(plugin)机制实现与第三方存储系统对接集成,下节我们详细介绍。

1.3 Docker volume plugin介绍

前面提到Docker本身并没有提供分布式共享volume方案实现,而是提供了一种灵活的插件机制,通过插件能够集成第三方的分布式共享系统,用户只需要实现plugin driver的接口就可以对接自己的任何存储系统。如当前非常流行的开源分布式存储系统Ceph、AWS EBS、OpenStack Cinder等,这些外部存储系统我们称为Provider。

值得一提的是,官方在volume plugin协议文档中强调:

这句话的理解就是说,Docker不能直接读写外部存储系统,而必须把存储系统挂载到宿主机的本地文件系统中,Docker当作本地目录挂载到容器中,换句话说,只要外部存储设备能够挂载到本地文件系统就可以作为Docker的volume。比如对于ceph rbd,需要先map到本地,并挂载到宿主机指定的路径中,这个路径称为path。这里和虚拟机不一样,rbd挂载到虚拟机,QEMU能够直接通过rbd协议读写,不需要map到本地。

我们要想了解Docker挂载分布式存储系统的原理,首先需要了解下官方定义的plugin协议接口:

以上create和remove都比较简单,最为核心的两个接口为mount和umount,不同的存储系统,接口实现不一样,我们这里只关心Cinder接口的实现。在此之前我没有过多研究,不妨我们就用前面了解的知识大胆猜想下Docker使用Cinder volume的实现原理。

1.4 Docker使用Cinder volume原理猜想

前面我们介绍了Docker plugin接口,现在假设我们需要对接OpenStack Cinder,Cinder存储后端(backend)使用LVM,猜测Docker plugin接口实现如下:

目前Docker挂载Cinder volume的方案还挺多的,如:

以上原理只是我们的猜想,猜想是不是成立,我们接下来通过以上方案研究实践下即可验证。

2 docker cinder driver实践

2.1 docker cinder driver简介

docker-cinder-driver是由john griffith开发的,实现了Docker挂载Cinder卷Driver。作者还写了篇专门的博客介绍Cinder – Block Storage for things other than Nova,也可以参考作者于OpenStack Days East 2016的分享pptslides: Consuming Cinder from Docker以及2016年奥斯汀分享视频cinder and docker like peanut butter and chocolate。

2.2 环境准备

实验之前本人已经使用DevStack工具部署了一个allinone OpenStack测试环境,代码基于最新的master分支,对应Cinder commit为2b58f2bb04c229c738b5cc806575ed3503fd1bfe。 Cinder使用LVM后端存储(backend),配置如下:

后续操作都是在这个DevStack环境中进行,不再强调。

docker cinder driver文档中说可以直接通过install.sh脚本下载:

但这样下载的可能不是最新代码编译的(亲测有坑),为了使用最新的版本,我们只能手动编译,首先需要安装go开发环境,关于go语言开发环境可以参考官方安装文档。

ubuntu可以直接使用apt-get安装:

下载cinder-docker-driver源码到本地:

使用go build直接编译:

创建配置文件,主要包含Cinder的认证信息:

其中Endpoint为认证URL,注意包含版本/v3,且必须包含DomainName配置项。

配置完成后就可以直接运行cinder-docker-driver服务了:

2.3 功能验证

使用docker创建一个volume,如下:

启动一个容器并挂载int32bit-test-1:

以上我们挂载刚刚创建的volume到/int32bit-test-1中,并写了HelloWorld到hello.txt文件中。

启动容器时cinder-docker-driver日志如下:

从日志中可以看出挂载volume本质就是通过iscsi把volume attach到本地(local attach),格式化为ext4文件系统,然后挂载到宿主机/var/lib/cinder/mount目录中,与我们猜想过程基本一致。

可以通过lsblk确认:

从docker容器实例中退出,此时会自动把volume从本地detach。

我们使用cinder把创建的卷手动attach到本地并挂载,关于Cinder的local attach,可参考OpenStack中那些很少见但很有用的操作。

查看前面我们写的文件:

可见输出了我们通过容器写的HelloWorld。

通过docker cinder driver基本验证了我们之前的猜想是正确的。

3.1 fuxi项目简介

OpenStack fuxi是一个比较新的项目,最初是从magnum项目分离出来,于2016年2月26号被OpenStack社区接受成为社区项目,目前主要由华为主导开发,其目标是使Docker容器可以使用Cinder volume和Manila share作为持久化存储卷。

3.2 环境准备

OpenStack环境仍然使用之前的DevStack环境,fuxi安装过程如下。

首先安装依赖的包,这些包其实DevStack基本都已经安装完成了。

下载fuxi源码并安装:

使用generate_config_FILE_samples.sh生成配置文件模板,并拷贝到/etc/fuxi目录下。

修复配置文件,最终配置文件如下:

注意auth_url必须包含版本,如/v3。

启动服务:

3.3 功能验证

使用Docker创建一个volume:

挂载volume到Docker容器中:

我们可以验证volume其实是映射到本地路径的:

由此可见,fuxi首先把Volume attach到本地,并mount到指定路径中,然后mount到Docker容器中,又和我们的猜想一致,接下来我们从源码角度分析。

3.4 Docker使用fuxi挂载volume源码分析

fuxi挂载是通过fuxi/volumeprovider/cinder.py模块的Cinder类实现的,该类实现了provider.Provider接口,而该接口就是对应前面介绍的Docker volume plugin接口。我们主要研究其mount方法:

以上主要通过Cinder API获取volume信息,检查其attach情况:

假设前面都没有问题,顺利把volume attach到本地,则我们可以获取映射到本地的虚拟设备名,接下来的代码就是检查该路径是否就绪:

如果前面顺利获取的volume到设备名,比如/dev/sdd,则最后的工作就是mount到本地文件系统了:

其中mountpoint是挂载的目标目录,其路径为volume_dir + volume_type + volume_name,其中volume_dir通过配置文件配置,默认为/fuxi/data,volume_type这里为cinder,假设volume name为int32bit-test-volume,则挂载路径为/fuxi/data/cinder/int32bit-test-volume。

create_mountpoint就是创建挂载目录:

最后调用mount.do_mount,mount是fuxi实现的一个通用的mount库,代码位于fuxi/common/mount.py。

该方法直接调用Mounter的mount方法,如果mount失败,则重新创建格式化文件系统后再次挂载(第一次挂载时没有安装文件系统,因此mount必然失败)。mount方法如下:

由此我们通过研究源码,再次验证了我们之前的猜想是正确的。

REX-Ray是一个EMC团队领导的开源项目,为Docker、Mesos及其他容器运行环境提供持续的存储访问。其设计旨在囊括通用存储、虚拟化和云平台,提供高级的存储功能。换句话说,REX-Ray进一步封装,提供一个统一的为Docker提供volume的工具,整合了各种不同的provide,如Ceph、Cinder、EBS等。但遗憾的是,目前Docker挂载Cinder卷,Docker必须安装在Nova虚拟机中,虚拟机还必须能够和OpenStack管理网打通,参考Cinder: failed to attach volume while using cinder driver,因此实际使用场景有限,本文不再详细介绍。

戳这里,看该作者更多好文


脸上从小就长有雀斑,有什么办法可以去除?

美 容:去美容院,使用脱色药,可能会减弱色素。 药物治疗:辅助用药可口服维生素C,1次0.2~0.4g,1日3次;或维生素E,1次50mg,1日3次,连续数月。 中成药可选六味地黄丸,其滋阴补肾,蜜丸1次1丸,片剂1次8片,胶囊1次8粒,均1日2次,有一定疗效。 近年来应用二氧化碳激光或液氮冷冻治疗雀斑,也有较好疗效,但仅限于比较表浅的雀斑。 日常生活:应注意避光,防止日光直射面部,外出时应戴个遮阳帽或打旱伞,也可在暴露部位外涂防晒膏.用半只番茄绞碎至糊状,再加两滴甘油,放入冰箱,每天敷脸上一次,坚持一段时间雀斑自然隐退~!!我试过了,效果不错~!!要多吃含维C的果蔬定期到美容院做祛斑护理、生活要有规律早睡早起雀斑皮肤多居干性、选用乳剂或杏仁密等化妆品、滋润皮肤、夏季避光日晒。 自制面膜;白茯苓研磨;用蜜调和每夜敷面。 黑丑研磨;用鸡蛋清调和夜间竺妗⒃缡窍慈ァ?nbsp;外搽3%氢醌霜或双氧水,可以暂时有效,也可每日一次搽用3%的乳酸至退屑。 还可由专业医师用60%左右三氯醋酸点涂进行化学剥脱,外售的雀斑霜有些也可用。 除了上述的外用药物治疗外,还可使用短时间的液氮喷雾冷冻,中药外用制剂治疗。 但上述治疗的效果往往不稳定。 还可以用以下办法适试试:1.每天吃一片维生素C和维生素E,可达到祛斑的作用。 2.用干净的茄子皮敷脸,一段时间后,小斑点就不那么明显了。 3.每天喝一杯西红柿汁或常用西红柿,对防止祛斑有较好的作用。 因为西红柿中含有丰富的谷胱甘肽,谷胱甘肽可抑制黑色素,从而使沉着的色素减退或消失。 4.洗脸时,在水中加1-2汤匙的食醋,有减轻色素沉着的作用。 5.将鲜明萝卜辟碎挤汁,取10-30毫升,每日上晚洗完脸后涂抹,待干后,洗净。 此外,每日喝一杯胡萝卜,可美白肌肤。 6.将柠檬汁搅汁,加糖水适量饮用。 柠檬中含有大量维生素C、钙、磷、铁等。 常饮柠檬汁不仅可美白肌肤,还能使黑色素沉淀,达到祛斑的作用。 木瓜和牛奶,用搅拌机打碎,敷在脸上,二十分钟左右洗掉。 坚持一个星期,会有不错的效果!不过我还想再补充一些:天然食物轻松除雀斑人人都希望自己有红润而光洁的面容,因为它不仅给人以美感,而且也使自己精神愉快,有益于身心健康。 但是,有些人脸上却有许多褐色的雀斑,且这种现象女性比男性多。 那么有何妙方去除呢?在天然食品中,具有保养皮肤和消除雀斑功效的食物有许多种。 现介绍几种经临床验证确有实效的食疗方法。 西红柿汁:每日喝1杯西红柿汁或经常吃西红柿,对防治雀斑有较好的作用。 因为西红柿中含丰富的维生素C,被誉为“维生素C的仓库”。 维生素C可抑制皮肤内酪氨酸酶的活性,有效减少黑色素的形成,从而使皮肤白嫩,黑斑消退。 黄瓜粥:取大米100克,鲜嫩黄瓜300克,精盐2克,生姜10克。 将黄瓜洗净,去皮去心切成薄片。 大米淘洗干净,生姜洗净拍碎。 锅内加水约1000毫升,置火上,下大米、生姜,武火烧开后,改用文火慢慢煮至米烂时下入黄瓜片,再煮至汤稠,入精盐调味即可。 一日二次温服,可以润泽皮肤、祛斑、减肥。 现代科学研究证明,黄瓜含有丰富的钾盐和一定数量的胡萝卜素、维生素C、维生素B1、维生素B2、糖类、蛋白质以及芥、磷、铁等营养成分。 经常食用黄瓜粥,能消除雀斑、增白皮肤。 柠檬冰糖汁:将柠檬搅汁,加冰糖适量饮用。 柠檬中含有丰富的维生素C,100克柠檬汁中含维生素C可高达50毫克。 此外还含有钙、磷、铁和B族维生素等。 常饮柠檬汁,不仅可以白嫩皮肤,防止皮肤血管老化,消除面部色素斑,而且还具有防治动脉硬化的作用。 黑木耳红枣汤:取黑木耳30克,红枣20枚。 将黑木耳洗净,红枣去核,加水适量,煮半个小时左右。 每日早、晚餐后各一次。 经常服食,可以驻颜祛斑、健美丰肌,并用于治疗面部黑斑、形瘦。 本食谱中的黑木耳,《本草纲目》中记载其可去面上黑斑。 黑木耳可润肤,防止皮肤老化;大枣和中益气,健脾润肤,有助黑木耳祛除黑斑。 胡萝卜汁:将新鲜胡萝卜研碎挤汁,取10-30毫升,每日早晚洗完脸后,以鲜汁拍脸,待干后用涂有植物油的手轻拍面部。 此外,每日喝1杯胡萝卜汁也有祛斑作用。 因为胡萝卜含有丰富的维生素A原。 维生素A原在体内可转化为维生素A。 维生素A具有滑润、强健皮肤的作用,并可防治皮肤粗糙及雀斑。 另外,用冬瓜藤熬水用来擦脸、洗澡,可使皮肤滋润、消除雀斑。 金盏花叶汁也有护肤除斑的功效。 将金盏花叶捣烂,取汁擦涂脸部,既可消除雀斑,又能清爽和洁白皮肤。 蒲公英花水也能用于除斑,取一把蒲公英,倒入一茶杯开水,冷却后过滤,然后以蒲公英花水早晚洗脸,可使面部清洁,少患皮炎。

吃韭菜烧心怎么办?

韭菜含有挥发性的硫化丙烯,因此具有辛辣味,有促进食欲的作用。 韭菜除做菜用外,还有良好的药用价值。

消化不良或肠胃功能较弱的人吃韭菜容易烧心,建议不要吃了!

好好保护你的胃,天天吃几个花生米,持之以恒!

身体健康什么都好啊!

女孩子为什么都喜欢喝绿茶?

呵呵这个问题其实很简单,没那么复杂.1.绿茶清香,适合女孩子2.绿茶汤色清澈,碧绿,漂亮的很,女孩子喜欢3.绿茶冲泡简单,也适合女孩子.

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐