77百科网
当前位置: 首页 生活百科

docker容器技术及管理(详解docker容器数据持久化和数据共享)

时间:2023-06-05 作者: 小编 阅读量: 3 栏目名: 生活百科

概述docker主要有两种数据存储形式,一种是storagedriver(也叫做Graphdriver),另一种是volumedriver.stroagedriver主要是存储那些无状态的数据,写入密集型的场景应该使用volumedriver.storagedriver容器运行的文件系统是镜像层和容器层组成的,一层一层叠加,只有最上面的那层是可写的,其他层都是只读的.Docker通过UnionFS

概述

docker 主要有两种数据存储形式, 一种是storage driver(也叫做 Graph driver), 另一种是 volume driver. stroage driver主要是存储那些无状态的数据, 写入密集型的场景应该使用 volume driver.

storage driver

容器运行的文件系统是镜像层和容器层组成的, 一层一层叠加, 只有最上面的那层是可写的, 其他层都是只读的. Docker通过Union FS技术支持文件的读写和新建, Docker 采用插件式的方式支持多种Union FS实现, 官方文档中一般使用stroage driver术语, 目前已经有多种实现的插件, 比如: aufs/overlay/overlay2/devicemanger等等.

boot2docker 缺省使用的storage-driver 为 aufs, 下面命令将创建一个使用 overlay2 的 storage driver docker运行环境.

docker-machine create --driver virtualbox --engine-storage-driver overlay2 test2

正式的docker 环境, 需要修改 /etc/docker/daemon.json 文件

{"storage-driver": "btrfs"}

几个查询storage driver的命令:

docker info 命令, 查询docker运行环境使用的storage-driver.

docker image inspect 命令,查看镜像使用的存储driver.

docker container inspect 命令,查看容器使用的存储driver.

volume driver

volume driver 经常用来实现数据持久化和文件共享功能, 具体有两种存在方式, 分别是:

1. bind mount 方式:

是将host的目录或文件直接mount到容器中, host的目录或文件既可以容器运行之前就已存在的, 也可以是在容器运行之前不存在的.

如果在docker run 命令中采用了 -v /host/dir_or_file:/container/dir_or_file的形式, 就是bind mount方式, 即指定了host的挂载点的绝对路径.

2. volume 方式

是由 Docker 管理, 该volume最终存储到host的 /var/lib/docker/volumes 下. volume 方式还分为 named volume 和 Anonymous volume.

named volume 有两种创建方法,

(1) docker run 命令中采用了 -v one_volume_name:/container/dir_or_file , 这里的one_volume_name不是host中的绝对路径, 而是一个名称.

(2) 通过 docker volume create 创建的, 该命令支持更多的选项, 推荐使用.

匿名volume方式 是通过 docker run 命令中传入了 -v /container/dir 类型的参数.

3. bind mount 方式和volume方式的简单对比:

bind mount方式, docker容器直接访问host的目录或文件, 性能是最好的.

bind mount方式, docker容器直接访问host的目录或文件, 对于该host绝对目录可能会引入权限问题. 如果容器仅需要只读访问权限, 最好是显式设定只读方式.

对于 volume方式, 如果host中落地目录为空, docker先将容器中的对应目录复制到host下, 然后再进行挂载操作; 对于bind mount方式, 挂载之前没有复制操作.

容器要依赖host主机的一个绝对路径, 使得容器的移植性变差, docker 官方并不推荐这个方法, 而是推荐使用volume.

几个示例说明:

docker run -d --name web0 -v myetc:/etc busybox /bin/sh -c "while true; do echo hello world; sleep 1; done"#创建了一个named volume, 该volume 在 /var/lib/docker/volume/myetc 下. docker run -d --name web1 -v /etc busybox /bin/sh -c "while true; do echo hello world; sleep 1; done" #创建了一个匿名的volume, 该volume在/var/lib/docker/volume父目录下, 具体子目录不确定,#比如 /var/lib/docker/volume/9170d32e15b7578240afde81d5514637beece7d469b7ea253e23759a23b0a397 docker run -d --name web2 -v /etc2:/etc busybox /bin/sh -c "while true; do echo hello world; sleep 1; done" #使用 bind mount 方式, host上的目录为 /etc2

docker run 命令的--volume 和 --mount 参数

--volume 和 --mount 两种参数写法都支持上述volume和bind mount方式, --mount 采用key-value的写法, 支持更多的设置选项, docker 新版更加推荐使用 --mount 参数写法, 但 --volume 写法更加简洁, 仍然给广泛使用.

另一种推荐的volume写法是, 显式地使用 docker volume create 命令创建 named volume,

有了上面的知识, 很容易就能实现容器和Host之间共享数据. 对于同一Host下多个容器共享数据, 直接docker run -v参数非常不方便, 最好是使用 data container作为桥梁. 一般data container 不启任何应用, 也不需要将容器真正运行起来, 仅仅是挂载一下 volume, data container除了用于多个容器之间数据共享之外, 也可用于volume的备份和恢复.

data container和volume的备份恢复

#创建一个名 为 dbstore 的数据容器, 设置一个匿名的/dbdata volume. docker create -v /dbdata --name dbstore busybox /bin/sh #创建一个名为 web3 的应用容器, 将 dbstore 数据容器的volume 挂载过来. docker run -d --name web3 --volumes-from dbstore busybox /bin/sh -c "while true; do echo hello world; sleep 1; done"#备份数据容器 dbstore 的/dbdata目录到容器到host的host_backup目录下, 最终在host上的文件名为 /host_backup/backup.tardocker run --rm --volumes-from dbstore -v /host_backup:/backup busybox tar -cvf /backup/backup.tar /dbdata #恢复数据容器dbstore 的/dbdata目录, 数据源为host上的文件 /host_backup/backup.tardocker run --rm --volumes-from dbstore -v /host_backup:/backup busybox /bin/sh -c "cd /dbdata && tar -xvf /backup/backup.tar --strip 1"


之所以介绍持久化概念,是因为docker的容器设计理念是可以即开即用,用完可以随意删除,而新建容器是根据镜像进行渲染,容器的修改是不会影响到镜像,但是有时候容器里面运行的产生的数据(如mysql)或者配置项(如nginx的nginx.conf)我们又需要保存起来的,因而我们需要对容器某些修改的数据进行挂载,也就是把这些数据持久化。

后面会分享更多关于devops和DBA内容,感兴趣的朋友可以关注下!!

    推荐阅读
  • 酸汤砂锅粉做法和配方商用(酸汤砂锅粉做法)

    酸汤砂锅粉做法和配方商用准备材料:大白菜、粉条、豆腐泡、盐、生抽、老抽、葱姜、大料、干辣椒、酸面酱。准备好调料:大葱切成葱花、老姜1块切成片,大料2瓣,干辣椒2个,甜面酱1大勺。炒锅烧热,放入适量的食用油,下入大料炸出香味,接着下入葱花、姜片、干辣椒炒出香味。再加入适量的豆腐泡,没有豆腐泡也可以用豆腐代替。大火烧开后转到砂锅内小火慢炖20分钟左右,至汤汁浓稠、粉条软烂即可。

  • 捷途汽车有什么优势(捷途汽车营造了独树一帜的品牌文化内涵)

    2018年,捷途汽车正式诞生,至今累计销量已近50万辆,创下了中国车市“捷途速度”的美名。拥抱用户提升品牌归属感一直以来,捷途汽车始终坚持以用户为核心,并且希望用户真正参与进来。通过捷行军车友会,自2018年起捷途汽车已携8万名车友累计开展3季、上千场自驾游活动,已成为捷途车主享受旅行生活方式、追求探索乐趣的庞大社群活动平台。

  • 留尼汪岛旅游(寻觅一段自然之美的旅程)

    马航MH370的第一片残骸,也是在这条公路的海滩边发现的。整个PALM酒店的客房,大致分成高级客房、豪华客房、家庭套房和秘密林间别墅,客房的面积最小的有34平方米,最大的达100平米,可谓宽敞舒适。棕榈水疗酒店,目前为五星级酒店,它也是唯一一家获得欧盟环保标志的海外酒店。相对于国内那些富丽堂皇的五星级酒店来说,PALM并不奢华,但却是一家最亲近自然的酒店。

  • 性价比高的电动车小品牌(小品牌电动车与杂牌电动车有什么区别)

    但是很多用户对于一些三线品牌或小品牌电动车,却常常与杂牌电动车混淆,认为小品牌电动车就是杂牌电动车。从实力来看,小品牌有正规的厂房,也有正常的生产线,而且企业也有严格管理制度,受市场的波动较小。从品牌来看,小品牌有自己的独立品牌标识,也都经过注册商标,成为一个合规的品牌。甚至为了出名,取一些与大品牌相仿的名字。但是杂牌电动车接班没有售后服务渠道,如果出了问题,只能是用户自己承担。

  • twins什么意思中文(twins的意思)

    跟着小编一起来看一看吧!twins什么意思中文twins意思是孪生儿之一;双胞胎之一;一对相像的事物之一。twins是twin的第三人称单数和复数。twin,英语单词,名词、形容词、动词,作名词时意为双胞胎中的一人;一对相似的事物之一,作名词时意为孪生的;双胞胎之一的;双生的;成双的;双重的,作名词时意为使结成姐妹城市;使耦合;成对;生双胞胎。

  • gta圣安地列斯在哪打篮球(GTA圣安地列斯中是谁杀了CJ的母亲)

    而且,出现的不只是被怀疑真正杀害CJ母亲的两名巴拉斯帮的成员与斯莫克、莱德尔,还有GTAsa里的大反派,洛圣都腐败警察弗兰克·汤谱尼。CJ或许会认为这是家里的东西,然而这就是杀害母亲的凶器。而在其操控下,巴拉斯帮派在众人的眼下做戏“杀害”已经被斯莫克杀害的CJ母亲,让两大帮派爆发争斗,解决其中一个帮派,反正两个帮派谁死了剩下的他都可以继续操控。讽刺的是,弗兰克最终死在了离CJ母亲去世不远的地方。

  • 马鲛鱼的功效与作用(马鲛鱼的功效与作用及营养)

    4、补中益气补中益气也是马鲛鱼的重要作用之一,从中医的角度看,这种鱼类时才能强壮、提神、补气还能止咳,平时它能用于人类体虚咳喘以及女生产后身体虚弱等多种不良症状的调理,需要时可以把马鲛鱼的肉取下切成小丁与小米一起煮粥喝,用于女性产后身体调理时还可以加入适量的益母草,它会让产妇身体尽快恢复到最佳状态。

  • 解决黑头最好方法(黑头怎么去除)

    接下来我们就一起去研究一下吧!解决黑头最好方法在药店选购质量上乘的内服珍珠粉。取适量珍珠粉放入小碟中,加入适量清水,将珍珠粉调成膏状,均匀地涂在脸上。部按摩的手法在脸上按摩,直到脸上的珍珠粉变干,再用清水将脸洗净即可。能很好地去除老化的角质和黑头。

  • 临沂沂水东方瑞海温泉景区有哪些配套设施和服务?

    临沂沂水东方瑞海国际温泉度假区配套服务设施按摩大厅与按摩包房、休闲快餐、自助网吧、棋牌、健身房游客服务中心1)附加服务:自助早餐38元2)服务:商务中心服务、礼宾服务、会议厅、旅游票务服务、免费停车场、商场、前台保险柜、洗衣服务、叫醒服务、无线上网公共区3)房间设施:国内长途电话、国际长途电话、拖鞋、110V电压插、24小时热水、电热水壶、免费瓶装水、中央空调、独立写字台、全部房间浴衣、多种规格电