从本节开始,我们准备花点时间讨论Docker的数据持久化。在docker中有一个概念叫:数据卷,官方的解释是:数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS(UFS即是UNIX文件系统的简称)。数据卷有以下特点:     

  1. 数据卷可以在容器之间共享和重用
  2. 对数据卷的修改会立马生效
  3. 对数据卷的更新,不会影响镜像
  4. 数据卷默认会一直存在,即使容器被删除 

     一、挂载数据卷  

     数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。 如创建容器时使用参数v指定一个目录:

docker run -it --name DataTest -v /home/test/docker docker.io/ubuntu:12.04

        上述命令的意思是:我们创建了一个名称为  DataTest 的容器,同时,我们在容器中挂载了一个数据卷,我们进入容器后,可以看到容器中有一个:/home/test/docker的目录,如果/home/test/docker 目录不存在,Docker会自动创建该目录。我们也可以使用 -v 标记来指定挂载一个本地主机的目录到容器中去。如:

$ mkdir -p docker_tmp_test
$ docker run -it --name DataTest -v /home/docker_tmp_test:/home/test/docker docker.io/ubuntu:12.04

       通过使用上面的命令,我们将本机/home/docker_tmp_test挂载到了容器的/home/test/docker目录中,特别指出的是,本地目录的路径必须是绝对路径。另外,Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

docker run -it --name DataTest -v /home/docker_tmp_test:/home/test/docker:ro
--privileged=true  如:
 $ docker run -it --name DataTest -v /home/docker_tmp_test:/home/test/docker --privileged=true

二、数据卷共享

     既然可以将本地的目录挂在到Docker容器中,那么挂载的数据卷是否可以再被其他的Docker容器使用呢?答案是:可以。我们首先创建两个容器DataTest1 、DataTest2:

$docker run -it --name DataTest1 -v /home/docker_tmp_test:/home/test/docker docker.io/ubuntu:12.04     
 $ docker run -it --name DataTest2 -v /home/docker_tmp_test:/home/test/docker docker.io/ubuntu:12.04

       可以发现name为”DataTest1 ”和”DataTest2”的容器都是启动的.同时他们挂在了宿主主机的同一个目录,在各自的容器中看到的是一致的。然后在”DataTest2”创建一个文件–“test.txt “,在去查看”DataTest1 ”的挂在目录和宿主本地的被挂载目录,发现新建的”test.txt”文件都存在。

三、数据卷的删除

      通过上面的介绍可以了解到:数据卷是被设计用来持久化数据的.那么,它的生命周期和容器有什么关系?删除容器数据卷会不会被连带删除? 

     我们退出容器DataTest1并使用docker rm -f 删除这个容器,我们发现home/docker_tmp_test这个目录在我们主机中仍然存在,我们创建的文件也存在,这说明了数据卷的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,同时也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。