一. 介绍
Docker的存储卷称之为volume,本质上容器上的一个或者多个目录,而这些目录绕过了联合文件系统,与宿主机中的目录或者其他容器目录进行了绑定关系,这种绑定关系可以看作Linux的mount操作,当容器中的程序对这些目录写入数据时,其实写入到的是与之绑定的宿主机目录上,这样就实现了数据的存储功能。
默认情况下,容器不使用任何 volume时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的删除而被删除,而想要持久化的存储这些数据,就得使用存储卷。特别的,保存容器中的数据也可以使用 docker commit 命令将容器提交为一个新的镜像,这个镜像中会保存容器运行时的所有数据(绑定的数据卷除外),但此种方法非常不推荐,因为这样的镜像通常会很大,镜像拉取以及运行容器都会变慢。当容器使用了存储卷,即使容器被删除了,但是与绑定的存储卷还在,对应目录的数据都会保存,如果想要恢复该容器,只要新建的容器绑定该存储卷,对应目录的数据也会随之恢复。
docker的存储卷分为两类:
绑定挂载卷:在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关联关系
docker管理卷: 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎daemon自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合。
二. 绑定挂载卷
指定宿主机上一个目录与容器上某个目录绑定,建立链接。
docker run -v 宿主机目录:容器上目录
当我们在容器上对index.html进行操作时,改变会同步到宿主机上对应目录下。
查看宿主机下对应文件:
当我们使用docker inspect 来查看该容器时,可以看到其与宿主机绑定的目录:
三. docker管理卷
仅仅指定容器下挂载点目录,而宿主机与之对应挂载点目录交由容器进行创建。
docker run -v 容器挂载点
我们可以用docker inspect 查看容器挂载目录绑定到宿主机上哪个目录:
我们可以在该目录下创建一个文件,来看看容器b1的挂载目录下有没有该文件:
在容器b1下的挂载点:
我们修改容器b1下挂载目录下index.html文件的内容,也会同步到宿主机上挂载目录下对应文件。
四. 共享卷。
多个容器的卷使用同一个宿主机目录。
容器b1:
容器b2:
当我们修改容器b1下/data/index.html内容时,也会共享同步到b2: