容器存储

容器存储

docker为容器准备了两种存放数据的方法
1、docker storage driver 管理的镜像层和容器层
2、data volume

storage driver

容器由最上面的容器层和若干数量的只读镜像层组成,容器的数据就存放在这些层中。
这样分层结构的最大特性是 copy-on-write

  1. 新数据会放在最上层的容器层中
  2. 修改原有镜像层的数据,会将镜像层中的数据复制到容器层,修改后的数据就保存在容器层中,镜像层的数据保持不变。
  3. 如果多个层中有命名相同的文件,用户只能看到最上一层的那个文件

分层结构使构建镜像和容器的创建共享、分发变得高效

storage driver 实现了多层数据的堆叠并为用户提供了一个单一合并之后的视图

docker 支持多种 storage driver

  • AUFS
  • Device Mapper
  • Btrfs
  • OverlayFS
  • VFS
  • ZFS
    他们都支持分层的架构,同时有拥有不同的特性
    1、没有drvier可以适用所有场景
    2、drvier本身在快速迭代

docker 安装时会根据当前系统的配置选择默认的driver
运行# docker info 可以查看

Server Version: 17.12.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs

对于某些容器,直接将数据放在storage driver 维护的层中,比如无状态的应用。无状态意味着没有需要持续化的数据,随时从镜像中直接创建

data volume

Data Volume本质上是 docker host文件系统内的目录或文件,能够被直接mount到容器文件系统中
1、data volume是目录或文件,而非没有格式化的磁盘(块设备
2、容器可以读写 volume 中的数据
3、volume的数据可以被永久保存,即使使用它的容器已经被销毁

如何选择数据存储方式
1、database 软件 databases数据
2、web 应用 web应用产生的日志
3、Apache server 静态HTML文件

无状态的应该作为镜像的一部分,需要持续化的数据应该与镜像分开存放

docker volume 提供了两种方式

bind mount

将host文件系统上已存在的目录或文件mount到容器
# docker run -d -p 8080:80 -v /data/html:/usr/local/apache2/htdocs httpd
-v 的格式为<host path>:<container path>

# docker run -d -p 9999:80 -v /data/html:/usr/local/apache2/htdocs:ro httpd
还可以指定读写权限

bind mount的使用直观高效易于理解 但是需要指定host文件系统的特定路径,这样就限制了容器的可移植性

docker managed volume

Managed volume 和 bind mount 最大的区别是不需要指定mount源 指明mount point就可以了
# docker run -d -p 8080:80 --name=httpd_8080 -v /usr/local/apache2/htdocs httpd
通过-v 告诉容器我们需要data volume(数据卷) 并将其挂载到容器指定位置
docker 数据卷的位置 /var/lib/docker/volumes/

# docker inspect 命令结果的mounts区域里显示了mount的详细信息
# docker volume ls 数据卷列表
# docker volume inspect 数据卷详情 命令的对象为数据卷
如果volume 挂载到容器中有已经有数据的目录,原有的数据会被复制到volume中
但此时容器中挂载的数据已经不是storage driver管理的层数据了

数据共享

容器与host数据共享
bind mount 直接将要共享的目录直接mount到容器
managed volume 就需要在容器创建后生成了mount路径 再进行数据复制

容器与容器之间数据共享
1、将数据放在bind mount 目录中,然后将其mount到多个容器中
2、volume container

volume container是用来为其他容器提供volume的容器。他提供的卷可以是bind mount 也可以是managed volume的

# docker create --name=data_vc -v /data/:/usr/local/apache2/htdocs -v /root/data busybox
创建一个volume container 不需要运行 ;
# docker volume ls
查看卷列表
# docker run -d -p 8888:80 --name=httpd0 --volumes-from data_vc httpd
# docker run -d -p 9999:80 --name=httpd1 --volumes-from data_vc httpd
创建httpd容器并指定使用data_vc容器为volume container (以data_vc为模版)

# 检查httpd容器是否关联,并再次查看卷列表,没有新增的volume
# docker inspect httpd

检查容器的mounts区域配置。发现httpd容器的配置与data_vc一致

与 bind mount 相比,不必为每一个容器指定 host path,所有 path 都在 volume container 中定义好了,容器只需与 volume container 关联,实现了容器与 host 的解耦。使用 volume container 的容器其 mount point 是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑

data-packed volume container

Volume container 中数据还是在host中
data-packed volume container 其原理就是将数据打包到镜像中,通过docker managed volume 共享
# vim dockerfile

FROM busybox
ADD htdocs /usr/local/apache2/htdocs 复制到镜像层
VOLUME /usr/local/apache2/htdocs 将数据同步到host

# docker build -t datapacked .
构建镜像
# docker create --name vc_data datapacked
创建模版容器
# docker run -d -p 1111:80 --volumes-from vc_data httpd
启动容器并指定volume

volume生命周期管理
volume的创建、共享和使用
备份、恢复、迁移、销毁volume

备份##########

因为volume实际上是host文件系统中的目录和文件,备份volume实际上就是对文件系统的备份

恢复

迁移

假如使用更高版本的Registry,这就涉及数据迁移的问题
1、 docker stop 停止当前容器
2、启动新版本容器并mount原有volume
docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest

销毁

可以删除不再需要的volume,但是无法找回了

docker不会销毁bind mount ,删除数据的工作只能由host负责。
对于docker managed volume ,在执行 # docker rm 删除容器时可以带上-v参数 ,docker 会将容器使用到的volume一并删除
但前提是没有其他容器mount该volume,目的是保护数据

如果删除容器时没有带有 -v 选项 docker的volume就会遗留下来。

可以通过 docker volume ls 查看全部的volume

# docker volume rm xxx xxx
批量删除
# docker volume rm $(docker volume ls -q)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容