一、是什么
    一句话,有点类似我们Redis里面的rdb和aof文件 image.png

    二、能干嘛
    1、容器的持久化
    2、容器间继承+共享数据
    image.png

    三、如何添加数据卷
    1、直接命令添加
    语法: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
    例:

    1. docker run -it -v /myDataVolume:/dataVolumeContainer centos

    一开始我们的宿主机里面并没有/myDataVolume目录,我们以平常方式启动centos容器,里面也没有/dataVolumeContainer目录,如下图所示
    image.png
    image.png
    执行命令后
    image.png

    image.png
    宿主机和容器中均出现了对应的文件夹, 接下来查看数据卷是否挂载成功
    docker inspect e4643738cfce
    image.png
    centos 7可能有些不太一样
    image.png
    image.png
    为了验证数据共享我们现在宿主机host的/myDataVolume中添加 host.txt
    首先我们的容器中的/dataVolumeContainer中什么都没有
    image.png
    宿主机中进入到/myDataVolume 运行touch host.txt
    image.png
    然后我们在绑定的容器中查看是否有host文件
    image.png
    我们看到 /dataVolumeContainer 里面已经有我们的host.txt了,为了验证容器所修改或者创建的文件我们宿主机可以共享到,我们修改host.txt的内容并创建container.txt
    image.png
    image.png
    然后我们在主机上观察

    image.png
    打开host.txt查看
    image.png
    我们看到,我们在容器中所记录的文字在宿主机显示了,所以现在宿主机跟容器的数据卷现在是工作的

    提问1:容器停止退出后,主机修改后数据是否同步
    ① 我们先将容器退出
    image.png
    ② 我们在宿主机中再次建立host02.txt,并且在host.txt中加入host updata 01
    touch host02.txt
    image.png
    ③ 重启我们之前关闭的容器
    image.png
    docker attach 9515cd7fea02 重新进入我们的服务器
    image.png
    进入/dataVolumeContainer 发现,在容器关闭的情况下,我们在宿主机上建立的东西还在
    image.png
    并且 更新的内容 也在
    image.png

    1.1 加只读权限
    docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    我们在容器内目录后加了个ro,加了这个只读权限后,我们容器内便不可以在我们指定的容器内目录中修改或创建任何数据
    并且容器详情信息中也会有对应改变
    image.png

    2、DockerFile添加
    前言:如图就为官网的tomcat的DockerFile
    image.png
    image.png
    用dockerfile可以构建我们新的镜像,所以我们可以在构建镜像时就写好有关于数据卷的代码,这样镜像构建完成后,我们无需多余的工作,只需要启动该镜像对应的容器,便可将数据卷构建完毕

    例:
    1、在我们的根目录下新建mydocker文件夹并进入
    image.png

    2、编写属于我们的简单的DockerFile
    技术点:可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
    image.png
    创建文件Dockerfile ,将下面的脚本粘贴至该文件中

    1. # volume test
    2. FROM centos
    3. VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    4. CMD echo "finished,--------success1"
    5. CMD /bin/bash

    解释:from 大概的意思就是java里的继承的意思
    VOLUME 是容器中数据卷的文件夹,可以设立多个
    CMD echo “finished,————success1” 为打印一个日志代表成功
    CMD /bin/bash 加上这一行整个dockerfile的意思差不多为 image.png

    3、build后生成镜像

    1. docker build -f /mydocker/Dockerfile -t spz/centos .

    image.png
    image.png
    如同花卷一般,一层层的构建我们的镜像并返回镜像id
    image.png
    这下面便是我们根据dockerfile构建的我们自己的centos
    image.png

    4、run容器
    这下面两个文件夹便是我们创建的容器数据卷
    image.png
    进入容器数据卷创建 containt01.txt
    image.png

    5、通过上述步骤,容器内的卷目录地址已经知道,那对应的主机目录地址哪??
    说明:因为用这种方法创建数据卷,我们并没有指定宿主机的卷的目录地址,docker会给我们默认分配一个,我们需要使用docker inspect 容器id命令来查看
    centos 6.8如下
    image.png
    centos 7如下
    image.png

    我们进入对应的文件夹内,便可以看到我们在容器内创建的文件
    image.png

    备注:
    Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
    解决办法:在挂载目录后多加一个—privileged=true参数即可
    例:image.png