目录
什么是存储卷
为什么要用存储卷
Docker存储卷的特性:
Docker为容器提供了两种存放数据的资源:
storage driver
Data Volume
bind mount(实例)
docker managed volume(实例)
bind mount与 docker managed volume对比
Docker存储卷(Docker volumes)是Docker中用于持久化存储容器数据的一种机制。它提供了一种方便的方式来在容器与宿主机之间共享和保留重要数据
存储卷是Docker中的一种特殊目录或文件,它可以在容器中独立存在,并且不受容器生命周期的影响。即使容器被删除或重新创建,存储卷中的数据仍然保持不变。这使得存储卷成为了容器化应用程序中持久化存储数据的理想选择
存储卷可以提供数据的持久性,即使容器被删除或重新创建,数据仍然保持不变。
存储卷可以实现容器之间的数据共享和通信。
存储卷可以将数据从容器中分离出来,使得容器更易于管理和迁移。
数据持久性
数据共享
数据可移植性
数据备份与回复
由storage driver管理的镜像层和容器层
Data Volume
Docker 镜像的分层结构
容器是由上面的一个可写的容器层以及多个只读的镜像层组成,容器的数据就存放在这些层中
Data Volume本质上是Docker Host文件系统中的目录或文件,能够直接被mount到容器的文件系统中。Data Volume有以下特点:
Data Volume是目录或文件,而非没有格式化的磁盘
容器可以读写volume中的数据
volume数据可以被永久的保存,即使它的容器已经销毁
docker提供了两种类型的volume:bind mount和docker managed volume
bind mount是将host上以已经存在的目录或文件mount到容器
[root@localhost ~]# cat /web/index.html
this is nginx
把这个目录mount到容器
[root@localhost ~]# docker run -d -p 80:80 -v /web/:/usr/share/nginx/html 192.168.8.6:5000/nginx:v1
059b391341083dc52a43e5085c41607608f6bef213196f1c6e02418e5a319f1e
然后访问这个网站
[root@localhost ~]# curl 192.168.8.6
this is nginx
可以看到我们本地的web目录里的index的网页
而且我们想要修改网页内容是可以在本地的web目录里修改index文件
[root@localhost ~]# vim /web/index.html
this is httpd
然后我们再次访问这个网站
[root@localhost ~]# curl 192.168.8.6
this is httpd
可以看到我们修改网页成功了直接在本地修改就可以不需要重启什么服务
还可以给容器设置权限,就是在容器里无法对bind mount数据进行修改,只能在本地mount的地方修改(ro是只读权限,rw是可写权限)
[root@localhost ~]# docker run -d -p 81:80 -v /web/:/usr/share/nginx/html:ro 192.168.8.6:5000/nginx:v1
0b2745883c5bb278c0ff27de7229490e79c6a3b7a0366c89e1632e36b214e431
使用单一文件一点要注意:host的源文件必须要存在,不然会当作一个新目录bind mount给容器
docker managed volume与bind mount 的区别是不需要指定mount源
[root@localhost ~]# docker run -d -p 83:80 -v /usr/share/nginx/html 192.168.8.6:5000/nginx:v1
9c1db4f7c4bd5f6d384c2ac1a63d1a90463be5c31514ce63bd8d0214ef2029cb
我们要想知道mount源在哪,可以执行docker inspect 命令
[root@localhost ~]# docker inspect 9c1db4f7c4bd5
"Mounts": [
{
"Type": "volume",
"Name": "546e1d818fda0aa0e0c4ea98e4c4bfca98de8cb0b019c3bc3d90b1d2d4fd6b43",
"Source": "/var/lib/docker/volumes/546e1d818fda0aa0e0c4ea98e4c4bfca98de8cb0b019c3bc3d90b1d2d4fd6b43/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
找到mounts模块这里可以看到source源路径在哪
可以进到这个目录里修改网页内容
[root@localhost ~]# cd /var/lib/docker/volumes/546e1d818fda0aa0e0c4ea98e4c4bfca98de8cb0b019c3bc3d90b1d2d4fd6b43/_data
[root@localhost _data]# cat index.html
{{{{{{默认挂载的位置}}}}}}}
上面是我修改的网页内容,然后在访问网站看看是不是修改的默认位置的网页
[root@localhost _data]# curl 192.168.8.6:83
{{{{{{默认挂载的位置}}}}}}}
可以看到这种mount也是不需要进到容器里修改网页
bind mount | docker managed volume | |
---|---|---|
volume位置 | 可任意指定 | /var/lib/docker/volumes/... |
对已有的mount point影响 | 隐藏并替换为volume | 原有的数据复制到volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认为读写 | 无控制,均为读写权限 |
移植性 | 移植性弱,与host path绑定 | 移植性强,无需指定host目录 |