1. 使用数据卷目的
将Docker容器中的数据保存到本地服务器中,实现数据持久化,防止删除容器的同时,把需要的数据也一并删除掉。
2. 数据卷的本质
数据卷的本质,实际上是目录的挂载。将容器内的目录,通过Docker命令挂载到Linux的目录上。
多个容器的目录,可以同时挂载到同一个Linux的目录上。
3. 数据卷的使用
3.1 方式一 指定路径挂载
# 使用命令进行挂载
docker run -it -v 主机绝对路径目录:容器内目录 镜像名
# 挂载多个目录
docker run -it -v 主机绝对路径目录1:容器内目录1 -v 主机绝对路径目录2:容器内目录2 -v 主机绝对路径目录3:容器内目录3 镜像名
(1)开始挂载
docker run -it -v /home/test001:/home centos
(2)查看挂载结果
docker inspect c6f1549df213
(3)测试
在容器中写一个test.java文件,发现在主机的挂载目录中,该文件被同步过去
touch test.java
同样的,在主机的挂载目录中,新增一个hello.java文件,发现在容器的相应目录中,该文件也被同步进来。
这说明,主机的挂载目录和容器内的目录,是双向绑定的,任何一端的改动,都会同步到另一端。
touch hello.java
(4)挂载的好处
进行挂载后,修改数据,只需要在Linux上进行就可以了,而不用进入到容器内,并且修改后的数据会自动同步到容器内,不用管容器是否启动。
3.2 方式二 匿名挂载
(1)命令
# 匿名挂载,不指定主机目录,不指定卷名,只指定容器内的目录
docker run -d -v 容器内目录 镜像名
(2)示例
# 示例
docker run -d -P --name nginx01 -v /ect/nginx nginx
# 查看所有的volume的情况
docker volume ls
3.3 方式三 具名挂载
(1)命令
# 具名挂载,不指定主机目录,但指定卷名和容器内的目录
docker run -d -v 卷名:容器内目录 镜像名
(2)示例
# 示例
docker run -d -P --name nginx02 -v juming-nginx:/ect/nginx nginx
# 查看所有的volume(卷)的情况
docker volume ls
# 查看某个卷的信息
docker volume inspect juming-nginx
所有docker容器内的卷,在没有指定主机目录的情况下,都是挂载在/var/lib/docker/volumes/xxxx
目录下。
在不指定主机路径的情况下,推荐使用具名挂载(不建议使用匿名挂载),方便找到需要的卷。
4. 数据卷容器
利用同一个镜像创建多个容器,多个容器之间数据的共享,也可以使用数据卷。
例如,利用centos镜像,创建3个容器,3个容器名称分别为centos01、centos02、centos03
# 1、利用centos镜像创建centos01容器
docker run -it --name centos01 centos
# 2、利用centos镜像创建centos02容器,并挂载centos01
docker run -it --name centos02 --volumes-from centos01 centos
# 3、利用centos镜像创建centos03容器,并挂载centos01
docker run -it --name centos03 --volumes-from centos01 centos
上面的3个容器中,centos02与centos03都是挂载了centos01,那么centos01就称为数据卷容器
。由于它们之间的挂载关系,所以它们是互相打通的,彼此间数据同步共享。
容器中的数据,只要还有一个容器在使用,就不会消失,除非所有容器都被删除,并且没有保存到本地服务器。
5. 拓 展
# ro代表只读,readly
# 如果设置了容器的目录权限为ro,说明容器内部是无法操作的,只能通过宿主机来操作,然后再自动同步到容器内
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
# rw代表读写,readwrite
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx