目录

🍉什么是存储卷

🍉为什么要用存储卷

🍉Docker存储卷的特性:

🍎Docker为容器提供了两种存放数据的资源:

🍎storage driver

🍎Data Volume

🍎bind mount(实例)

🍎docker managed volume(实例)

🍎bind mount与 docker managed volume对比


什么是存储卷

Docker存储卷(Docker volumes)是Docker中用于持久化存储容器数据的一种机制。它提供了一种方便的方式来在容器与宿主机之间共享和保留重要数据

存储卷是Docker中的一种特殊目录或文件,它可以在容器中独立存在,并且不受容器生命周期的影响。即使容器被删除或重新创建,存储卷中的数据仍然保持不变。这使得存储卷成为了容器化应用程序中持久化存储数据的理想选择

为什么要用存储卷

  • 存储卷可以提供数据的持久性,即使容器被删除或重新创建,数据仍然保持不变。
  • 存储卷可以实现容器之间的数据共享和通信。
  • 存储卷可以将数据从容器中分离出来,使得容器更易于管理和迁移。

Docker存储卷的特性:

  • 数据持久性
  • 数据共享
  • 数据可移植性
  • 数据备份与回复

Docker为容器提供了两种存放数据的资源:

  1. 由storage driver管理的镜像层和容器层
  2. Data Volume

storage driver

Docker 镜像的分层结构

docker 临时目录设置 docker存储目录_docker

容器是由上面的一个可写的容器层以及多个只读的镜像层组成,容器的数据就存放在这些层中

Data Volume

Data Volume本质上是Docker Host文件系统中的目录或文件,能够直接被mount到容器的文件系统中。Data Volume有以下特点:

  1. Data Volume是目录或文件,而非没有格式化的磁盘
  2. 容器可以读写volume中的数据
  3. volume数据可以被永久的保存,即使它的容器已经销毁

docker提供了两种类型的volume:bind mount和docker managed volume

bind mount(实例)

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(实例)

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对比

bind mount

docker managed volume

volume位置

可任意指定

/var/lib/docker/volumes/...

对已有的mount point影响

隐藏并替换为volume

原有的数据复制到volume

是否支持单个文件

支持

不支持,只能是目录

权限控制

可设置为只读,默认为读写

无控制,均为读写权限

移植性

移植性弱,与host path绑定

移植性强,无需指定host目录