Docker(5)——数据管理

一、Docker数据管理理解

1.1 解决的问题

docker 容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:

  • 不能在宿主机上很方便地访问容器中的文件
  • 无法在多个容器之间共享数据
  • 当容器删除时,容器中产生的数据将丢失

1.2 解决方法

为了能够保存(持久化)数据以及共享容器间的数据,docker 引入了数据卷(volume) 机制。数据卷是存在于一个或多个容器中的特定文件或文件夹,它可以绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上。

其生存周期独立于容器的生存周期。

容器中主要有两种管理数据方式:数据卷(Data Volumes)数据卷容器(Data Volume Containers)

二、数据卷(Data Volumes)

2.1 数据卷理解

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

  1. 数据卷可以在容器之间共享和重用。
  2. 对数据卷的更改会立即生效。
  3. 对数据卷的更新不会影响镜像。

数据卷的使用类似 linux 下对目录或文件进行 mount 操作,目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中,分别是

  • volume
  • bind mount
  • tmpfs mount

其中volumebind mount比较常用,tmpfs mount基本不会用.

2.2 方式1:volumes(卷)

2.2.1 新建空白卷作为数据卷(Volumes)

volumes作为Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中,不是宿主机已有数据,而是新建的。

docker 专门提供了 volume 子命令来操作数据卷:

  • create 创建数据卷
  • inspect 显示数据卷的详细信息
  • ls 列出所有的数据卷
  • prune 删除所有未使用的 volumes,并且有 -f 选项
  • rm 删除一个或多个未使用的 volumes,并且有 -f 选项

先创建一个名称为 hello 的数据卷并通过ls命令进行查看:

数据卷:hello

然后可以使用inspect命令看看数据卷hello的详细信息

hello数据卷信息

该数据卷使用的Driver为默认的 local,表示数据卷使用宿主机的本地存储;

Mountpointvolumes的挂载点,默认是本机/var/lib/docker/volumes下的一个目录。

所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名卷。

匿名数据卷

2.2.2 使用本地目录作为数据卷(Volumes)

使用 -v 选项也可以指定挂载一个本地的已有目录到容器中去作为数据卷:
docker run -it –-name robot1 -v /var/data:/opt/mydata ros/kinetic /bin/bash
上面的命令挂载主机的 /var/data目录到容器的/opt/mydata目录。

这个功能在测试的时候特别方便,比如用户可以放置一些程序或数据到本地目录中,然后在容器中使用。另外,本地目录的路径必须是绝对路径,如果目录不存在,Docker 会自动创建。
Docker 挂载数据卷的默认权限是可读写rw,用户也可以通过ro标记指定为只读:
docker run -it –-name robot1 -v /var/data:/opt/mydata:ro ros/kinetic /bin/bash
加了:ro之后,容器内挂载的数据卷内的数据就变成只读的了。

2.2.3 使用云主机作为数据卷(Volumes)

除了把数据卷中的数据存储在宿主机,docker 还允许我们通过指定 volume driver 的方式把数据卷中的数据存储在其它的地方,比如 Azrue Storge 或 AWS 。

①安装sshfs

通过 vieux/sshfs 驱动把数据卷的存储在云主机上,docker 默认是不安装 vieux/sshfs 插件的,我们可以通过下面的命令进行安装:
docker plugin install --grant-all-permissions vieux/sshfs

②Volumes挂载远程目录

然后通过vieux/sshfs 驱动创建数据卷,并指定远程主机的登录用户名、密码和数据存放目录:

docker volume create --driver vieux/sshfs \
    -o sshcmd=nick@10.32.2.134:/home/nick/sshvolume \
    -o password=yourpassword \
    mysshvolume

注意:确保指定的远程主机上的挂载点/home/nick/sshvolume目录是存在的,否则在启动容器时会报错。

③容器挂载Volumes

最后在启动容器时指定挂载这个数据卷:

docker run -id \
    --name testcon \
    --mount type=volume,volume-driver=vieux/sshfs,source=mysshvolume,target=/world \
    ubuntu /bin/bash

在容器中/world目录下操作的文件都存储在远程主机的/home/nick/sshvolume 目录中。进入容器 testcon然后在/world 目录中创建一个文件,然后打开远程主机的/home/nick/sshvolume目录进行查看,新建的文件会出现在那里。

2.3 方式2:bind mounts

当使用bind mounts将主机上的目录挂载到容器中时,目录由其在主机上的完整或相对路径引用。

bind mountvolume其实都是利用宿主机的文件系统,不同之处在于volume是docker自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,不需要关心路径

bind mounts可以挂载在宿主机系统的任意位置,但bind mount在不同的宿主机系统是不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

如果使用Bind mounts挂载宿主机目录容器内非空目录,那么此容器中的非空目录中的文件会被隐藏,容器访问这个目录时能够访问到的文件均来自于宿主机目录。这也是Bind mounts模式和Volumes模式最大的行为上的不同。

2.4 方式3:tmpfs

挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;

2.5 三种挂载方式的区别

三种方式挂载数据

这张图说明bind mountvolume其实都是利用宿主机的文件系统,Bind mounts模式是将宿主机上的任意文件或文件夹挂载到容器,而Volumes本质上是将Docker服务管理的一块区域(默认是/var/lib/docker/volumes下的文件夹)挂载到容器。所以volume不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,不需要关心路径。

相对于bind mountvolume是Docker Engine在自己的“地盘”分配了一个路径作为挂载点,自己地盘的权限肯定是安排的明明白白。所以,以上挂载宿主机路径的问题都解决了。

在使用volume作为数据卷挂载到容器时,直接用volume名称代替宿主机路径名就行:
docker run -d -v test_vol:/var/data some_image

这样就将数据卷test_vol挂载到了容器内的/var/data目录下。

挂载一个主机目录作为数据卷

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

三、数据卷容器(Data Volume Containers)

3.1 数据卷容器的理解

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

3.2 数据卷容器功能1:共享数据

3.3 数据卷容器功能2:迁移数据

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

备份
使用下面的命令来备份 mydata 数据卷容器内的数据卷:

sudo docker run --volumes-from mydata -v $(pwd):/backup –-name worker ubuntu tar cvf /backup/backup.tar /data
这个命令首先利用 Ubuntu 镜像创建了一个容器 worker。又使用 --volumes-from mydata 参数来让 worker 容器挂载 mydata 容器的数据卷。接下来使用 -v $(pwd):/backup 参数来挂载本地的当前目录到 worker 容器的 /backup 目录。
在 worker 容器启动后,使用了 tar cvf /backup/backup.tar /data 命令来将 /data 下内容备份为容器内的 /backup/backup.tar,即宿主主机的当前目录下的backup.tar。

恢复
如果要恢复数据到一个容器,可以按照下面的操作。首先创建一个带有数据卷的容器 mydata2:

sudo docker run -v /data –-name mydata2 ubuntu /bin/bash
然后创建另一个新的容器,挂载 mydata2 的数据卷,并使用 tar 解压缩备份文件到所挂载的容器卷中:

sudo docker run --volumes-from mydata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载。下面简单介绍其使用方法。

首先要创建一个数据卷容器 mydata,并在其中创建一个数据卷挂载到 /data 目录。

sudo docker run -it -v /data –-name mydata ubuntu
然后在其他容器中使用 --volumes-from 来挂载 mydata 容器中的数据卷。例如创建两个容器 mycon1 和 mycon2,并从 mydata 容器挂载数据卷:

sudo docker run -it --volumes-from mydata –-name mycon1 ubuntu
sudo docker run -it --volumes-from mydata –-name mycon2 ubuntu
(注意,命令中没有指定数据卷的信息,也就是说新容器中挂载数据卷的目录和源容器中是一样的。)

此时容器 mycon1 和 mycon2 都挂载同一个数据卷到相同的目录 /data。三个容器任何一个在该目录下写入数据其他容器都能看到。
可以多次使用 --volumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器的容器来挂载数据卷。并且使用 --volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。
但删除挂载了数据卷的容器时,数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式的使用 docker rm -v 命令来指定同时删除关联的容器。

四、清理数据卷

如何对已经运行的容器挂载目录?
https://blog.51cto.com/hjun169/2440799
手动修改mount挂载的json文件,狂神的那个视频里面也有写。

深刻理解Docker镜像大小
https://blog.csdn.net/shlazww/article/details/47375009

理解docker的分层镜像实现 base 镜像共享(DockerFile)
https://blog.csdn.net/lu_1110/article/details/106533490

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

推荐阅读更多精彩内容