上一篇:Docker的那些事儿—Docker数据管理(28)
数据卷是一个或多个容器专门指定绕过Union File System,为持续性或共享数据提供一些有用的功能:
(1)数据卷可以在容器间共享和重用。
(2)数据卷数据的改变是直接修改的。
(3)数据卷数据的改变不会被包括在容器中。
(4)数据卷是持续性的,直到没有容器使用它们。
数据卷操作
Docker启动的时候可以通过-v选项添加数据卷,实现将主机上的目录或者文件挂载到容器中。完整的参数为:
-v host-dir:container-dir:[rw|wo]
-v container-dir:[rw|wo]
-v volume-name:container-dir:[rw|wo]
其中,
host-dir:表示主机上的目录,如果不存在,Docker 会自动在主机上创建该目录。必须是绝对路径。
container-dir:表示容器内部对应的目录,如果该目录不存在,Docker 也会在容器内部创建该目录。
volume-name:表示卷名,如果该卷不存在,docker将自动创建。
rw|ro:用于控制volume的读写权限。
(1)docker run -itd -P -v /test:/data --name myhttp httpd
在宿主机/test目录下创建test.txt文件,观察容器内/data目录下内容变化
docker container inspect myhttp查询Mounts参数如下:
删除容器,宿主机上/test目录及内容未发生任何变化。
(2)docker run -itd -P -v /data --name myhttp httpd
我们看到容器内出现了/data目录。那这一次又是宿主机上哪个目录挂载到/data下的呢?
我们使用docker volume ls查询,发现多了一个本地卷:f343bc68303155c111bea58a907131d9fe1751bc8ef6528cc53d5b7dce292dee
使用docker volume inspect查询到如下的挂下点目录:
/var/lib/docker/volumes/f343bc68303155c111bea58a907131d9fe1751bc8ef6528cc53d5b7dce292dee/_data
当在上述目录下创建test.txt文件后,容器内也查询到该新增文件。
删除容器后,宿主机上的目录及内容也未发生任何变化。
(3)docker run -itd -P -v my_volume:/data --name myhttp httpd
docker自动创建了卷:my_volume,并且这个卷对应的宿主机的挂载点是:
/var/lib/docker/volumes/my_volume/_data。这和第二种方式几乎一样,不同点在于未指定volume名是docker会在/var/lib/docker/volumes随机创建一个目录。
docker container inspect myhttp查询Mounts参数如下:
对于docker数据卷的总结:
(1) 三种方式都可以将宿主机目录或者文件挂载到容器。
(2) Docker提供了docker volume命令专门对volume进行管理。对于第一种方式Type为bind,是无法使用docker volume进行管理的。我们也可以使用docker volume create命令创建volume。
(3) 删除容器是如果使用docker rm container将不会删除对应的Volume。如果想要删除可以使用docker rm -v container。另外也可以单独使用docker volume rm volume_name删除volume。
(4) 对于已运行的数据卷容器,不能动态的调整其卷的挂载。Docker官方提供的方法是先删除容器,然后启动时重新挂载。