数据卷(Data Volume)
概念:数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问
目的:在于数据的持久化,它完全独立于容器的生命周期,因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理。
特点:
-
数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。
-
数据卷可以在多个容器之间共享和重用
-
对数据卷的更新,不会影响镜像
-
可以对数据卷里的内容直接进行修改,立马生效
-
卷会一直存在,即使挂载数据卷的容器已经被删除
创建一个数据卷
挂载目录
在docker run时通过-v参数来挂载
docker run -it -v 宿主机目录:容器内目录 容器id[:ro]
-v:挂载目录参数,如果宿主机目录不存在,会自动创建
[:ro]可选参数,是否只读,默认读写权限,则容器内目录只读
挂载文件
docker run -it -v 宿主机文件:容器内文件 容器id
注意:如果直接挂载一个文件,类似于vi这样的文本编译工具可能会造成文件的inode的改变,导致docker1.1.0以后会报错误信息。
-v 参数后宿主机文件可以不写,则随机生成一个目录挂载到容器内的文件
在Dockerfile中通过VOLUME来添加一个或者多个新的卷由该镜像创建的任意容器,但是不能映射到宿主机已经存在的目录。docker会自动在宿主机上创建目录来映射容器的目录,这样导致多个容器无法共享同一个数据卷。
语法:VOLUME["容器内目录"]
FROM ubuntu:12.04
VOLUME ["/datavolume1","/datavolume2"]
CMD "/bin/bash"
通过docker insepect 容器id可以查看挂载地址。
数据卷容器
概念:创建一个容器A挂载数据卷,其他容器通过挂载这个容器A实现数据共享,挂载数据卷的容器A,就叫做数据卷容器。
命令:
docker run --volimes-from 容器名称
注意:
-
数据卷容器不需要启动
-
如果想要删除数据卷,就需要删除最后一个挂载的容器时,使用docker rm -v命令来删除容器
示例:
已知构建的镜像ubuntu3已经挂在了目录/datavolume1和/datavolume2,通过镜像ubuntu3启动容器dvt4,此时dvt4是一个数据卷容器
通过命令可查看docker inspect dvt4
此时创建一个容器,dvt5,挂载dvt4上,查看发现dvt5也存在2个挂载的目录
通过docker inspect dvt5可以查看挂载的目录与dvt4的一致
数据卷的备份和还原
备份
原理:
通过创建一个容器来挂载一个数据卷容器,并在容器中将数据卷目录压缩,并将压缩目录映射到宿主机目录上。
docker run —-volumes-from 数据卷容器 -v 宿主机目录:压缩文件目录 - -name 容器名 镜像id tar cvf 压缩文件路径 数据卷目录1 数据卷目录2...
示例:
创建一个数据卷容器
创建一个容器来备份数据卷
查看备份文件
还原
示例:
第一种方式:
第二种方式:
-
创建一个数据卷容器
将容器内/dbdata挂载在本机的Users/wujian/dbdata目录上
docker run -v /Users/wujian/dbdata:/dbdata --name dvt-test centos:7
-
创建一个容器,挂载在数据卷容器上
并且此容器与宿主机的压缩文件目录映射,并启动容器后,将压缩文件解压在/dbdata中,则就会映射到之前的数据卷容器中
docker run --volumes-from dvt-test --name dvt-untar -v /Users/wujian/backup:/backup centos:7 tar xvf /backup/backup.tar -C /dbdata