Docker Volume -- 管理卷Volume详解

目录

[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:

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

相关推荐
沫璃染墨36 分钟前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
Felven1 小时前
华为鲲鹏920s芯片serdestool工具使用说明
linux·运维·服务器·华为·鲲鹏920·serdestool
江湖有缘1 小时前
Docker实战 | 使用Docker部署lemonitor镜像站点列表程序
运维·docker·容器
莫晓燚1 小时前
mall 电商项目完整部署---实战
linux·运维·docker·容器
爱和冰阔落2 小时前
【Linux网络】JsonCpp 怎么实现序列化?从 Request/Response 到网络计算器消息设计
linux·运维·网络·php
Decay__2 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
我是koten7 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
修己xj15 小时前
服务器无法解析域名?一次 DNS 配置缺失的排查与修复
运维
xbzb20 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo