Docker系列五:容器的存储

容器的存储

1.容器内部挂载和使用宿主机的存储卷。挂载到一个容器的卷也可以让其他容器使用。
2.Docker自身会使用宿主机的一个存储区来管理该宿主机上Docker镜像和容器。

讨论保证数据持久性的几种模式:

  • 默认模式:不支持任何持久性
  • 数据卷:容器持久性
  • 仅含数据的容器:容器持久性
  • 从主机映射而得的卷:容器持久性
  • 从主机映射而得的卷,存储后端是共享存储:主机持久性
  • Convoy 卷插件:主机持久性

上述几种持久性(我自己发明的)是什么意思呢?

  • 容器持久性:升级容器并不会移除数据
  • 主机持久性:主机失效也不会引起数据丢失

http://dockone.io/article/1283

数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

创建数据卷

创建一个名为 web 的容器,并加载一个数据卷到容器的 /webapp 目录。

docker run -d -P --name web -v /webapp webapp

删除数据卷

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v

挂载主机目录作为数据卷

使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去。

docker run -d -P --name web -v /src/webapp:/opt/webapp webapp

Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

docker run -d -P --name web -v /src/webapp:/opt/webapp:ro webapp

注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。

查看数据卷的具体信息

docker inspect --format "{{json .Mounts }}" dock_registry_1

挂载一个本地主机文件作为数据卷

记录在容器输入过的命令

sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

注意:如果直接挂载一个文件,很多文件编辑工具,包括 vi 或者 sed --inplace ,可能会造成文件 inode 的改变,从 Docker 1.1.0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。

数据卷容器

如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

首先,创建一个名为 webapp_code 的数据卷容器

docker run -d -v /webapp --name webapp_code centos

在其他容器中使用 --volumes-from 来挂载 webapp_code 容器中的数据卷。--volumes-from支持级联挂载。

docker run -it --volumes-from webapp_code --name webapp_1 centos /bin/bash
docker run -it --volumes-from webapp_1 --name webapp_2 centos /bin/bash

数据卷的容器自己并不需要保持在运行状态。

借助于容器进行数据恢复

备份

image.png

首先使用 --volumes-from 标记来创建一个加载 database 容器卷容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:

docker run -d --volumes-from webapp_code -v $(pwd):/backup --name backup centos tar cf /backup/webapp.tar /webapp

容器启动后,使用了 tar 命令来将 database 卷备份为容器中 /backup/backup.tar.gz文件,也就是主机当前目录下的名为 backup.tar 的文件。

此处为何不直接从数据卷容器备份文件呢?
数据卷容器无法再次挂载用来备份的数据卷,所以只能将数据卷容器挂载到新的容器的同时挂载用来备份的数据卷,将备份文件备份到本地的文件系统中。

备份到本地后,直接解压,启动新的数据卷容器时将解压后的内容直接挂载到新的数据卷容器中。

为何不直接从本地文件系统备份数据卷容器中的内容?

恢复

如果要恢复数据到一个容器,首先创建一个带有空数据卷容器 dbdata2。

docker run -d -v /webapp --name new_webapp_code centos

然后创建另一个容器(这个容器只作为解压使用),挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。

docker run -it --volumes-from new_webapp_code -v $(pwd):/backup --name temp_data centos tar xf /backup/webapp.tar

为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看

docker run -it --volumes-from new_webapp_code centos /bin/bash

使用文件系统进行数据恢复

创建数据卷容器

创建时挂载本地的文件目录

docker run -d -v /webapp:/webapp --name webapp_code centos

在其他容器中使用 --volumes-from 来挂载 webapp_code 容器中的数据卷。--volumes-from支持级联挂载。

docker run -it --volumes-from webapp_code --name webapp_1 centos /bin/bash
docker run -it --volumes-from webapp_1 --name webapp_2 centos /bin/bash

本地文件系统备份

cp /webapp /webapp_backup

创建新的数据卷容器

docker run -d -v /webapp_backup:/webapp --name webapp_code centos

清理容器

docker将其数据保存在/var/lib/docker/目录结构中,需要确保该目录有足够的磁盘空间。

[root@localhost text]# df -h /var/lib/docker/
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G   17G   34G   34% /

删除无用镜像

docker image ls

精确一点搜索,镜像的唯一标识是 ID 和摘要,而一个镜像可以有多个标签。
进行镜像删除docker rmi (IMAGE ID)

删除容器并进行回收

注意删除前需要对容器进行打包备份

docker ps查看正在运行或暂停的容器,这里面的是无法进行容器删除的
docker ps -a里面已经停止的容器可以进行删除
删除容器命令docker rm CONTAINER ID

实际运维过程需要节省空间
https://blog.fundebug.com/2017/04/19/docker-system-explain/
https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/

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

推荐阅读更多精彩内容