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

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

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

概述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内容,感兴趣的朋友可以关注下!!

    推荐阅读
  • 如何立足岗位发挥好示范引领作用(如何发挥好岗位的示范和引领作用)

    跟着小编一起来看一看吧!如何立足岗位发挥好示范引领作用首先要做实践的模范。要忠实履行政协会议的各种决议,自觉遵守各项工作制度,正确行使自己的民主权力。中共党员中的政协委员,不论是在政协组织的活动中,还是在日常工作生活中,都要积极地进行调查研究,了解最新动态,了解社会各方面的真实情况,了解群众的情绪、困难和诉求,充分反映他们的要求和呼声,使党委和政府能及时采纳他们对党和政府工作的意见建议。

  • 海底捞 摄像头(海底捞包间内安装摄像头遭质疑)

    对于安装摄像头是否会侵犯隐私,网友各执一词。安装了摄像头的门店也表示,安装主要是为了防止客人丢失东西,方便找回。不过,北青报记者进一步采访其安装摄像头的必要性时,截至发稿时,海底捞方面暂时没有回应。图像信息系统在营业期间应当正常运行,不得中断。在这一规定中,包间并未罗列其中。此前曾有调查称,在30家火锅店中,有19家在包间装有摄像头;在14家非火锅店中,也有2家的包间装有摄像头。

  • 讯飞智能语音服务(IQEQ齐上阵讯鸟软件打造更有)

    讯飞智能语音服务埃森哲调研显示:多达75%的高管表示,自己的组织将在未来三年积极部署某种人工智能技术,AI将作为一名同事、合作者和值得信赖的顾问,在企业中与人类并肩协作。智能客服语音机器人能够支持语音情感三分类、四分类和六分类,在各类应用场景下识别率均超过85%,在成熟的业务场景下识别准确率可高达95%。

  • 提高fps的方法csgo(FPS游戏CSGO之身位控制)

    FPS游戏CSGO之身位控制​高手与菜鸟最大的差距也许还不是枪法,而是存活率同样的一个点位,菜鸟去看点,永远是拉一个大身位,同时暴露在复数架枪点的准星内,所以死亡率奇高无比高手的身法多变,身位控制良好,知道适当切换行进节奏与路线。

  • 怎么用微信支付(用微信支付的方法介绍)

    怎么用微信支付?最简单的,看到各个超市或者别的地方的收银台都会贴有一张二维码图片,上面写着微信支付,就可以使用手机微信来支付了,打开手机微信,右上角有一个的标志,点击它,下面我们就来聊聊关于怎么用微信支付?接下来我们就一起去了解一下吧!这是把商家的二维码放到相机前,就可以自动扫描了,扫描出来后,可以看到要付款的别人的微信名称,可以核对一下,没问题就输入金额,完成付款。

  • 白萝卜多久能煮熟(白萝卜怎么煮)

    下面更多详细答案一起来看看吧!白萝卜多久能煮熟通常情况下,白萝卜水只要煮十五到二十分钟就差不多了。白萝卜煮水的做法非常简单,我们平时如果想要喝白萝卜水的话都可以自己在家里制作。制作它首先要把准备好的白萝卜清洗干净并切成片状或是块状,注意这里是不需要给萝卜去皮的。在白萝卜处理好之后,我们就可以准备一口锅并往里面倒入适量的清水加热。

  • 键盘和电脑怎么清洁(干货清洁电脑屏幕)

    键盘和电脑怎么清洁DTECH帝特,传递精彩画面,分享快乐时光!这种情况,我们可以购买专用液晶屏幕清洁剂进行清洁,价格大概在20~50元之间,通常专用清洁剂都有详细的使用说明。以上几个清洁方法都需要有规则地轻轻擦拭屏幕,不可以用力按着擦,否则容易给屏幕造成坏点。

  • 茉莉飘雪茶的功效与作用(关于茉莉飘雪茶的功效与作用)

    茉莉飘雪茶的功效与作用茉莉花茶是花茶中的典型,茉莉飘雪花茶能够帮助人体降血脂,有利于人体内脂肪的分解,还有一定的清除氧自由基作用,所以能够起到抗氧化、防衰老的功效。茉莉飘雪花茶能够起到保肝护肝、美容养颜的作用,同时还有一定杀菌、抗菌、增强机体免疫力的作用,可以预防感染性疾病,因为茉莉花茶中含有的营养物质比较丰富,能够提高机体的免疫力,也能够对抗疾病的发生。

  • 堕仙是指什么意思(堕仙出现在哪位人物身上呢)

    堕仙是指什么意思是指堕落的仙人,也指走火入魔,因为面对让自己万分痛苦的事而无法承受,后变为魔的紫薰上仙。紫薰上仙堕仙成魔是因一直守护她的檀凡上仙为救她而死,紫薰上仙觉得对不起檀凡上仙,又很愤怒于白子画的漠不关心,所以成为堕仙。求而不得,一念成魔。本是仙界的紫薰仙子,五上仙之一,擅长制香,因痴恋白子画而成为堕仙,坠入魔道。后被花千骨感动,放下执念,将所有功力传给白子画,成全白子画与花千骨。

  • 想让学习强国由青铜变成骨灰吗(想让学习强国由青铜变成骨灰吗)

    A、正确B、错误正确答案:A135、我国鼓励各类市场主体在有效保护旅游资源的前提下,依法合理利用旅游资源。A、正确B、错误正确答案:A137、2021年1月22日,我国首部战疫纪录电影上映,影片以平实的语言讲述了武汉人与来自全国各地医疗系统及其他行业的一线人员,一起打响武汉抗击新冠肺炎疫情阻击战。A、50%B、60%C、70%D、80%正确答案: