一文详解Docker数据卷(volume)
目录
基本介绍
docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了。而且,如果不进行数据卷挂载的话,对容器配置文件进行修改需要进入容器内部修改,十分麻烦,我们对容器为了能够保存数据并且方便修改,在docker容器中使用卷。
卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点。
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录,它们的修改是双向同步的,类似于vue中的双向绑定。多个容器也可以绑定到相同的数据卷目录上
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
两个作用:
- 持久化数据
- 共享数据
一个特点:
- 即时生效
- 卷的更新不影响镜像
- 即使容器停止或被删除,卷默认也一致存在
数据卷操作命令
数据卷操作的基本语法:
语法解析:docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作
文档中提供的COMMAND有5个:
- create 创建一个数据卷(volume)
- inspect 显示一个或多个数据卷(volume)的信息
- ls 列出所有的数据卷(volume)
- prune 删除全部未使用的数据卷(volume)
- rm 删除一个或多个指定的数据卷(volume)
创建数据卷
查看数据卷创建数据卷
查看数据卷详细信息
删除全部未使用的数据卷
删除一个或多个指定的数据卷
注意:所有docker容器内的卷,没有指定目录的情况下在/var/lib/docker/volumes/xxxx/_data
数据卷挂载
容器挂载数据卷时,数据卷可以存在也可以不存在,数据卷不存在的话,会自动去创建数据卷。
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
这里的-v就是挂载数据卷的命令:
-v html:/root/htm
:把html数据卷挂载到容器内的/root/html这个目录中
以修改Nginx
主页内容为例:
第一步: 创建容器并挂载数据卷到容器内的HTML目录
第二步:查看数据卷所在的位置
此时html数据卷的Mountpoint就已经指向宿主机的/var/lib/docker/volumes/html/_data目录。
第三步:在宿主机中进入html
数据卷所在位置,并修改HTML内容
注意点:
- 一个容器可以挂载多个目录,一个目录也可以被多个容器挂载。
- 如果创建容器时忘记挂载,是无法再去挂载数据卷的。只能删除容器,再创建新容器时挂载数据卷。
覆盖关系:
- 数据卷中没有文件时,会将容器目录中的文件挂载到数据卷中。
- 数据卷中有文件时,会将数据卷中的文件覆盖容器目录中的文件。
本地磁盘挂载 (直接挂载模式)
容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:
带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录
直接挂载模式:宿主机目录 ---> 容器内目录
磁盘挂载的语法:
在这里我们演示使用磁盘挂载MySql
的数据保存目录和MySql
的配置文件。
第一步、拉取镜像
第二步:准备宿主机中的文件目录
第三步:进行挂载
数据卷挂载和磁盘挂载的优缺点
数据卷挂载方式:使用数据卷挂载的方式,Docker会自动在宿主机上帮我们创建数据卷对应的真实目录。容器挂载时只需要挂载到数据卷上,而不用关心数据卷指向的真实目录在哪里。即使将来容器被删除了,数据卷中或者宿主机挂载到容器的目录中的内容是不会随着容器的删除而丢失的。
- 优点:这种方式相当于把挂载全部交给Docker本身处理,方便快捷。
- 缺点:真实挂载目录由Docker生成,目录较深,不方便查找。
磁盘挂载方式:直接挂载到宿主机目录上,不再有中间的数据卷,而是容器和宿主机的直接交互。
- 优点:目录和文件更好找也更好维护,并且能直接把目录或者文件挂载到容器上。
- 缺点:目录和文件需要我们自行创建和维护。
- 点赞
- 收藏
- 关注作者
评论(0)