目录
[1. Docker Volume 存储卷分类](#1. Docker Volume 存储卷分类)
[2. 管理卷 Volume](#2. 管理卷 Volume)
[2.1 创建卷](#2.1 创建卷)
[2.1.1 方式一:Volume 命令操作](#2.1.1 方式一:Volume 命令操作)
[2.1.2 方式二:-v 或者 --mount 指定](#2.1.2 方式二:-v 或者 --mount 指定)
[2.1.3 方式三:Dockerfile 匿名卷](#2.1.3 方式三:Dockerfile 匿名卷)
[3. 管理卷的操作示例详解](#3. 管理卷的操作示例详解)
[3.1 docker 命令创建管理卷](#3.1 docker 命令创建管理卷)
[3.2 Docker -v 创建管理卷](#3.2 Docker -v 创建管理卷)
[3.3 Docker mount 创建管理卷](#3.3 Docker mount 创建管理卷)
[3.4 Docker 卷生命周期](#3.4 Docker 卷生命周期)
[3.5 Docker 卷共享](#3.5 Docker 卷共享)
正文开始:
1. Docker Volume 存储卷分类
目前 Docker 提供了三种方式将数据从宿主机挂载到容器中:
-
volume docker****管理卷,默认映射到宿主机的/var/lib/docker/volumes 目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎daemon****自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合
-
bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关****联关系
-
tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

2. 管理卷 Volume
2.1 创建卷
存储卷可以通过命令方式创建,也可以在创建容器的时候通过 -v and --mount 指定。
2.1.1 方式一:Volume 命令操作
命令清单如下:可仅作了解学习

1. docker volume create:
功能:创建存储卷
语法:
bash
docker volume create [OPTIONS] [VOLUME]
对于[VOLUME]参数,如果添加了就是命名卷,未添加就是匿名卷
关键参数:
- -d, --driver**:**指定驱动,默认是 local
- --label**:**指定元数据
样例:



2. docker volume inspect:
功能:查看卷详细信息
语法:
bash
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
关键参数:
- -f**:**指定相应个格式,如 json
样例:


3. docker volume ls
功能:列出卷
语法:
bash
docker volume ls [OPTIONS]
关键参数:
- --format**:**指定相应个格式,如 json,table
- **--filter,-f:**过滤
- **-q:**仅显示名称
样例:



4. docker volume rm
功能:删除卷,需要容器不使用。卷删除后,里面的数据也会清除
语法:
bash
docker volume rm [OPTIONS] VOLUME [VOLUME...]
关键参数:
- **-f,--force:**强制删除
样例:
bash
docker volume prune mytestvol5
5. docker volume prune
功能:删除不使用的本地卷
语法:
bash
docker volume prune [OPTIONS]
关键参数:
-
**--filter:**过滤
-
-f, --force:不提示是否删除
样例:
bash
docker volume prune
该命令,对不使用的卷做一个清理,但是命名卷不会做清理
2.1.2 方式二:-v 或者 --mount 指定
-v 和-mount 都可以完成管理卷的创建
-v****参数:
功能:完成目录映射
语法:
bash
docker run -v name:directory[:options] .........
参数:
- 第一个参数:卷名称
- 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如 ro 表示 readonly
样例:



加入 ro参数创建后,文件不可删除:


--mount****参数:
功能:完成目录映射
语法:
bash
--mount '<key>=<value>,<key>=<value>'
关键参数:
- type: 类型表示 bind, volume, or tmpfs
- source**,**src:对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
- destination**,**dst,target:文件或目录挂载在容器中的路径
- **ro,readonly:**只读方式挂载
完成目录映射
样例:
采用 mount 创建 volume:



创建匿名卷:

可通过该命令:docker inspect mynginxvol4,来查看创建的匿名卷的绑定,在 "Mounts" 字段可看到相关信息。
bash
docker inspect mynginxvol4

2.1.3 方式三:Dockerfile 匿名卷
我们也可以通过 dockerfile 的 VOLUME 指令在镜像中创建 Data Volume,这样只要通过该镜像创建的容器都会存在挂载点,但值得注意的是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是由 docker 随机生成的。
3. 管理卷的操作示例详解
3.1 docker 命令创建管理卷
命令创建管理卷并查看管理卷:

查看其中的一个管理卷,可以看到对应的宿主机目录如下:

将创建的管理卷与创建的容器的目录通过 -v 做了一个绑定映射:

再次查看 test1管理卷中的内容发现,与容器绑定后,卷会拷贝容器中的文件内容,所以容器中的的内容就放在了宿主机上了,因为管理卷的生命周期独立于容器,受docker控制,且管理卷的数据会落在宿主机上:

通过 docker inspect mynginx1 查看该容器的详细信息,在里面的 "Mounts" 字段就会记录该容器所有挂载点的详细配置信息,因为我们将管理卷test1挂载在了该容器下,所以,该字段能查看该管理卷的详细配置信息

在宿主机上修改首页:
在我们忘记了我们之前在容器中创建的卷所在何处的情况下:

在宿主机修改首页:可借助vi/vim工具修改


在宿主机修改后,我们进入容器,看首页有没有动态发生变化:

总结:管理卷的绑定(更准确地说是"绑定挂载"):绑定挂载在宿主机路径与容器路径之间建立直接关联。在宿主机上修改被挂载目录中的内容后,容器内对应路径会立即感知到变化(反之亦然),因为双方访问的是同一份文件系统数据。这种机制非常适合开发场景,例如将源代码目录挂载进容器,保存即生效,无需重建镜像。
Docker 存储挂载辨析 :卷(Volume) 由 Docker 管理,适合持久化数据,但不应直接在宿主机上手动修改其内部文件;绑定挂载(Bind Mount) 则将宿主机上的指定目录或文件直接映射进容器,实现宿主机与容器间的实时双向同步------宿主机改动文件,容器内立即可见,是开发调试时共享代码的常用手段。
要理解"管理卷"的存在,关键在于抓住它要解决的核心矛盾:容器的"临时性"与数据的"持久性"之间的冲突。容器本身被设计为无状态、可随时创建或销毁的,一旦删除容器,其内部写入的数据也会随之丢失。管理卷就是 Docker 为此提供的、由守护进程统一管理的一种数据持久化机制。
3.2 Docker -v 创建管理卷





下一步,回到宿主机shell,进入容器所在目录,再对首页进行修改操作,看是否能执行成功。

bash
可通过vi/vim进行修改
vim index.html



3.3 Docker mount 创建管理卷
创建管理卷,将其绑定在容器首页所在目录






3.4 Docker 卷生命周期
创建管理卷,并且启动容器:


bash
docker inspect mynginx4


到这里,我们成功创建了一个容器,并且把它的nginx首页所在目录绑定到了我们test4这个卷上。
现在我们删除刚刚创建的容器:

容器虽然删除了,但是我们卷里的内容依然存在


总结:我们创建了一个卷,其容器的删除并不会影响卷里面的内容,卷可通过 docker volume rm 命令来删除
3.5 Docker 卷共享
启动三个nginx容器,都绑定到同一个管理卷上:




再执行:vim index.html:

发现三个容器都被同步修改了。

