Docker有两种数据管理的方式docker
数据卷是一个可供容器使用的特殊==目录==, 它将主机操做系统目录直接映射进容器ubuntu
数据卷的特性:安全
$ docker volume create 数据卷名
可用的选项post
local
建立的数据卷在/var/lib/docker/volumes
路径下操作系统
挂载数据卷通常是在docker run
命令中使用--mount
或者-v
选项code
最初,-v 或 --volume 标志用于独立容器,而 --mount 标志用于群集服务。可是,从 Docker 17.06 开始,也能够在独立容器上使用 --mount。通常来讲,--mount 更明确和详细。最大的不一样在于 -v 语法将全部选项组合在一个字段中,而 --mount 语法将它们分开。建议使用 --mount语法。orm
$ docker run --mount,type=xxx,source=xxx,destination=xxx,readonly,bind-propagation=xxx
/var/lib/docker/volumes
路径下建立一个新目录,Docker会管理该目录内容,将容器目录下的数据同步到该目录src
,匿名卷忽略这个参数;若是目录不存在,会报错
$ docker run -v source:destination:option
-v的语法比较简单,经过两个冒号分隔出三个位置内存
bind
绑定数据卷volume
普通数据卷关于数据卷,还有其余命令同步
$ docker volume ls
须要注意,只会显示volume
类型的数据卷string
$ 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
上
由于上一步是用绝对路径压缩的,而咱们当前容器目录结构和备份时容器目录结构是相同的,因此不用指定解压目录.