1.是什么  
  我们对数据的要求希望是持久化的,且容器之间希望有可能共享数据
  Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了,为了能保存数据在docker中我们使用卷。 
    卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性
    卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
    特点:
    1:数据卷可在容器之间共享或重用数据
    2:卷中的更改可以直接生效
    3:数据卷中的更改不会包含在镜像的更新中
    4:数据卷的生命周期一直持续到没有容器使用它为止

 

2.容器创建数据卷

 指令: docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash  

  多个容器数据卷docker run -it -v /宿主机目录:/容器内目录 -v /宿主机目录:/容器内目录 centos /bin/bash  

     这样子,宿主机的这个目录和容器的这个目录就会数据同步,两个目录里面的内容同步保持一致

  在两边发生的变更都会同步到另一边

  即便容器停止了,对宿主机目录进行修改,容器内的目录也会同步

   

2.1示例

1)启动centos容器,并且创建容器卷

  宿主机目录为:/usr/local/myData,容器内的目录为/usr/local/myContainerData,这两个目录的数据会同步(目录随意,不存在的会自动创建)

 

2)进入容器查看目录

发现文件夹myContainerData

 

 

3)退出容器,查看宿主机目录

发现文件夹myData,在文件夹创建文件11.txt

 

4)重新进入容器,查看myContainerData目录,发现存在11.txt文件

说明两个文件夹数据已同步

 

3.带权限创建数据卷

 指令:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

 ro标识read only

 这样子创建的,容器这边的目录只读,不允许编辑

 

4.使用dockerfile创建数据卷

上面我们创建一个容器数据卷,那么创建多个该怎么办呢?使用dockerfile来实现

1)创建文件Dockerfile

2)写入内容

# volume test
FROM centos:6.8
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
 

FROM centos:6.8表示,表示继承自centos:6.8

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] 这里是定义数据卷,定义了两个数据卷,只有容器里面的目录没有宿主机的目录,会在宿主机自动生成对应的目录

CMD echo "xxx" 表示执行命令打印内容

3)执行命令build

docker build -f /usr/local/Dockerfile -t zzyy/centos .

注意,命令最后面有个空格和点

 执行完成后查看镜像,新的镜像已生成

4)启动该镜像,进入容器查看,发现这两个目录

 

5)查看日期目录对应的数组及目录

docker inspect 容器id

可以看到对应的宿主机的目录

 

5.容器之间传递数据卷

1)创建并切动一个容器,且创建数据卷

容器名称为mycentos2,宿主机目录:/usr/local/myData,容器目录 /usr/local/myContainerData

myContainerData创建文件11.txt

 

2)创建第二个容器,继承第一个容器

docker run -it --name mycentos3 --volumes-from mycentos2 centos:6.8

这样子,第二个容器会继承第一个容器的数据卷的配置,它的目录/usr/local/myContainerData也和宿主机的目录/usr/local/myData同步

 进入第二个容器,发现11.txt文件,说明已同步

 后面,即便第一个容器停止了,删除了,也不影响第二个容器的数据卷的配置,数据卷依旧有效