Docker数据管理

Docker有两种数据管理的方式docker

  • 数据卷: 容器内数据直接映射到本地主机环境;
  • 数据卷容器: 使用特定容器维护数据卷.

数据卷

数据卷是一个可供容器使用的特殊==目录==, 它将主机操做系统目录直接映射进容器ubuntu

数据卷的特性:安全

  1. 能够在容器之间共享和重用, 容器间传递数据将变得高效与方便;
  2. 对数据卷内数据的修改会当即生效,不管是容器内操做仍是本地操做;
  3. 对数据卷的更新不会影响镜像,解耦开应用和容器;
  4. 卷会一直存在,直到没有容器使用,能够安全地卸载它

建立数据卷

$ docker volume create 数据卷名

可用的选项post

  • -d --driver string 指定卷驱动程序名,默认为local
  • --label 为卷设置元数据
  • -o --opt map 设置驱动程序特定选项

建立的数据卷在/var/lib/docker/volumes路径下操作系统

挂载数据卷

挂载数据卷通常是在docker run命令中使用--mount或者-v选项code

最初,-v 或 --volume 标志用于独立容器,而 --mount 标志用于群集服务。可是,从 Docker 17.06 开始,也能够在独立容器上使用 --mount。通常来讲,--mount 更明确和详细。最大的不一样在于 -v 语法将全部选项组合在一个字段中,而 --mount 语法将它们分开。建议使用 --mount语法。orm

使用--mount(推荐)

$ docker run --mount,type=xxx,source=xxx,destination=xxx,readonly,bind-propagation=xxx
  • type为数据卷类型,有三种类型的数据卷
    • volume 普通数据卷,在主机/var/lib/docker/volumes路径下建立一个新目录,Docker会管理该目录内容,将容器目录下的数据同步到该目录
    • bind 绑定数据卷,主机上的文件或目录被挂载到容器中,覆盖容器相关目录内容;依赖宿主机特定的目录结构,DockerFile不能使用这种方式
    • tmpfs 临时数据卷,只存在于内存中
  • source 宿主机位置 也能够替换为 src,匿名卷忽略这个参数;若是目录不存在,会报错
    • type是volume时填写已建立好数据卷的名字
    • type是bind时填写绑定文件夹的绝对路径
  • destination 容器内位置 必须是容器内绝对路径
  • readonly为只读,容器只有数据卷挂载目录的只读权限
  • bind-propagation子属性
    • shared 原始mount的次级mount会显示在重复mount中, 且重复mount的次级mount的内容也会在原始mount中显示
    • slave 与shared mount类似,只是内容单方向可见,重复mount的内容不会在原始mount中显示。
    • private 次级mount在原始mount和重复mount之间互不可见
    • rshared 与shared mount同样,只是传播范围扩展至嵌套的重复mount和原始mount
    • rslave 与slave mount同样,只是传播范围扩展至嵌套的重复mount和原始mount
    • rprivate 默认值,与private mount同样,即原始mount和重复mount之间都不会传播内容。

使用-v

$ docker run -v source:destination:option

-v的语法比较简单,经过两个冒号分隔出三个位置内存

  • 第一个位置是宿主机位置,若是目录不存在,会建立数据卷或者目录
    • 若是填写绝对路径,数据卷类型为bind绑定数据卷
    • 若是填写相对路径,数据卷类型为volume普通数据卷
  • 第二个位置是容器内位置,必须是绝对路径
  • 第三个位置是可选的,是一个使用逗号分隔的选项列表
    • ro 只读
    • delegated
    • cached
    • z
    • Z

关于数据卷,还有其余命令同步

查看数据卷

$ docker volume ls

须要注意,只会显示volume类型的数据卷string

  • -f, --filter 指定过滤规则
    • 'dangling=true' 未经任何容器使用的卷
    • 'driver=xxx' 过滤卷上的驱动程序名
  • --format 使用模板规则打印
  • -q 只显示卷名

查看数据卷详细信息

$ docker volume inspect 数据卷名

删除数据卷

$ docker volume rm 数据卷名

# 清理无用数据卷
$ docker volume prune

数据卷容器

数据卷容器是一个用于多个容器之间共享更新数据的==容器==

建立数据卷容器

首先,建立一个数据卷容器dbdata,并在其中建立一个数据卷挂载到/dbdata

$ docker run -it -v /dbdata --name dbdata ubuntu

这个例子中使用的是匿名数据卷,将一个随机名字的数据卷挂载到容器的/dbdata目录

经常使用的镜像均可以生成数据卷容器

能够在其余容器中使用--volumes-from来挂载dbdata容器中的数据卷

$ docker run -it --volumes-from dbdata -name dbl ubuntu 
$ docker run -it --volumes-from dbdata -name db2 ubuntu

这三个容器任意一方在该目录写入,其它容器均可以看到

能够屡次使用--volumes-from 参数来从多个容器挂载多个数据卷,还能够从其余已 经挂载了容器卷的容器来挂载数据卷:

$ docker run -d --name db3 --volumes-from dbl training/postgres

简单来讲,就是获取其余容器上挂载的数据卷,同时挂载在本身这个容器上

利用数据卷容器来迁移数据

备份

$ docker run --name worker --volumes-from dbdata -v /dataDir:/backer busybox tar -cvf /backer/backup.tar /dbdata

这句命令的意思是,建立一个镜像,获取dbdata的数据卷,挂载到当前容器同名目录(dbdata挂载在/dbdata,因此咱们的容器中也挂载在/dbdata),而后新建一个bind类型数据卷,挂载宿主机/dataDir到容器内部的/backer

启动容器后执行命令tar -cvf /backer/backup.tar /dbdata 将dbdata的数据卷内数据打包,放在新建数据卷内

这样,咱们宿主机的/dataDir就能够获取dbdata数据卷内的打包数据backup.tar

使用busybox的缘由是,这个容器的使命就是运行打包这条命令,运行以后容器就执行完毕,因此不必使用拥有完善功能的镜像,busybox就几个MB却包含了常常使用的命令,很是适合这种场景

恢复

首先咱们再建立一个和dbdata1相同的数据卷容器,命名为dbdata2

$ docker run -it -v /dbdata --name dbdata2 ubuntu

下面咱们将上一步备份的数据,恢复到数据卷容器中

$ docker run --name worker2 --volumes-from dbdata2 -v /dataDir:/backer busybox tar -xvf /backer/backup.tar

和备份的思路相同,获取dbdata2的数据卷,挂载在容器/dbdata;而后主机含有tar文件的dataDir挂载到容器/backer

由于上一步是用绝对路径压缩的,而咱们当前容器目录结构和备份时容器目录结构是相同的,因此不用指定解压目录.

相关文章
相关标签/搜索