Docker数据卷
概念
Volume是存在于一个或多个容器中的特定文件或文件夹,这个目录能够以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供一下便利:
- Volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件。
- Volume能在不同的容器之间共享和重用。
- 对Volume中的数据操作会马上生效。
- 对Volume中数据的操作不会影响到镜像本身。
- Volume的生存周期独立于容器的生存周期,即使删除容器,Volume仍然会存在,没有任何容器使用的Volume也不会被Docker删除。
使用
Volume类似于linux的mount操作,用户将一个文件夹作为Volume挂载到容器上,可以很方便的将数据添加到容器中提供其中的进程使用。多个容器可以共享同一个Volume,为不同容器之间的数据共享提供了便利。
从容器挂载Volume
在使用docker run或docker create命令创建容器时,可以使用-v标签为容器添加Volume。docker run -itd --name redis-master -v /data centos bash
在创建容器时,会将容器中的/data目录作为一个Volume挂载点。可以使用docker inspect -f {{.Volumes}} redis-slave
命令来查看该容器卷在宿主机的位置:
map[/data:/var/lib/docker/volumes/fea37bc27b3ea5111f115502d539415b9d7744ae0356e43ba062f1272d825c0d/_data]
接下来来验证下:cp unstable.tar.gz /var/lib/docker/volumes/fea37bc27b3ea5111f115502d539415b9d7744ae0356e43ba062f1272d825c0d/_data
docker exec -it redis-slave bash
ls /data/
unstable.tar.gz
从宿主机挂载Volume
创建新容器的时候挂载一个主机上的特定目录到容器中docker run -itd --name redis-slave -v /data/package:/data/apps centos /bin/bash
将宿主机中的/data/package目录文件夹作为一个Volume挂载到容器中的/data/apps下。
挂载镜像时可以指定挂载权限/data/package:/data/apps:ro
使用Dockerfile添加Volume
使用VOLUME指令向容器添加Volume:VOLUME /data
VOLUME ["/data1","/data2"]
:添加多个Volume
在执行docker build
命令时会生成镜像并且以此镜像启动一个容器时会挂载一个Volume到/data。但是和docker run -v
不同的是,VOLUME指令不能挂载主机指定文件夹,这是因为我们要保证Dockerfile的可移植性,我们不能确保每个使用此Dockerfile的宿主机都有对应这个文件夹。
共享Volume
在使用docker run/create
命令创建新容器时,可以使用--volume-from
标签使得容器与已有的容器共享Volume。docker run -itd --name mysql --volume-from redis-master centos /bin/bash
新创建的容器mysql与原容器redis-master共享Volume,也就是说此时redis-master拥有的Volume同样会挂载到mysql上。
可以使用多个--volume-from使容器与多个已有容器共享Volume
删除Volume
如果创建容器时在容器中挂载了Volume,在/var/lib/docker/vfs/dir下会生成与Volume对应的目录,使用docker rm 删除容器并不会删除与Volume对应的目录,这些目录会占据不必要的存储空间,即便可以手动删除,也非常麻烦,所以在删除容器时需要对容器的Volume进行妥善处理。
再删除容器时同时删除Volume有以下两种方法:
docker rm -v
- 运行容器时使用
docker run --rm
--rm标签会在容器停止运行时删除容器及容器所挂载的Volume。
当然如果是从宿主机挂载的Volume,无论对容器进行任何操作都不会导致其在宿主机上被删除,如果不需要这些文件了,只能手动删除它们。