Docker 命令 之 数据卷(Volume)

摘要

什么是Volume(数据卷)?

  • Volume 是由 Docker 管理的特殊目录,位于宿主机文件系统中(/var/lib/docker/volumes/),用于存储和共享容器的数据。

  • 当容器被删除后,容器内的文件系统也会一起删除,但挂载在 Volume 中的数据不会丢失,可供多个容器共享。

  • Volume 的特点

特性 说明
数据持久化 即使容器删除,数据仍保留在卷中
多容器共享访问 多个容器可以挂载同一个卷,实现数据共享
不依赖容器路径 卷与容器生命周期解耦,支持灵活的容器重建和升级
管理简便 可用 docker volume 命令进行查看、创建、删除等操作
安全隔离 Docker 管理的路径比绑定挂载更安全

docker volume 相关命令

命令 作用说明 示例
docker volume create 创建一个新的卷,名称可选(不指定会自动生成) docker volume create myvolume
docker volume ls 列出所有已存在的卷 docker volume ls
docker volume inspect <name> 查看指定卷的详细信息,包括挂载点、驱动等 docker volume inspect myvolume
docker volume rm <name> 删除一个卷(前提是没有容器正在使用该卷) docker volume rm myvolume
docker volume prune 删除所有未被使用的卷(会有确认提示) docker volume prune

docker volume create : 创建一个新的卷

  • 语法

1
docker volume create [OPTIONS] [VOLUME]
  • 参数详解

选项 说明 示例
-d, --driver string 指定卷驱动程序,默认是 local(本地存储) -d local 或 第三方驱动名称(需要安装第三方插件)
--label list 给卷添加标签(元数据),可用于分类、过滤 --label env=prod
-o, --opt map 设置驱动的特定选项,格式为 key=value,多个选项可重复使用 -o type=tmpfs -o device=tmpfs
  • 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建一个默认卷(local 驱动)
docker volume create myvolume
# 也可以在启动容器的时候创建默认数据卷,如下命令,若 myvolume 卷不存在,则会自动创建
docker run -d -v myvolume:/data nginx
docker run -d --mount type=volume,source=myvolume,target=/data nginx

# 创建一个带有标签的卷
docker volume create --label env=dev --label team=backend myvolume

# 创建匿名卷(不指定名称)
docker volume create

# 使用 tmpfs 类型卷(只存于内存中,不落盘),适用于高速读写但不需要持久化的数据
docker volume create \
-d local \ # 指定驱动程序为 local
-o type=tmpfs \ # 指定底层文件系统类型为 tmpfs(内存文件系统)
-o device=tmpfs \ # 设置挂载设备为 tmpfs,用于与 type=tmpfs 配合
-o o=size=100m \ # 设置 tmpfs 的最大容量为 100MB
mytmpfs # 卷的名称,可通过 docker volume ls 查看


# 创建一个自定义驱动的卷(如 nfs)
docker volume create \
-d local \ # 默认驱动程序为 local
-o type=nfs \ # 底层文件系统类型为 nfs
-o o=addr=192.168.1.100,rw \ # 设置 nfs 的地址和读写权限,若只读为 ro
-o device=:/path/to/share \ # 挂载设备为 nfs,格式为:nfs://192.168.1.100:/path/to/share
mynfs # 卷的名称,可通过 docker volume ls 查看
  • 创建的数据卷会保存在 /var/lib/docker/volumes/ 目录下,比如我们创建了一个卷 myvolume,那么该卷会保存在 /var/lib/docker/volumes/myvolume/_data 目录下

docker volume ls : 列出所有已存在的卷

1
2
3
4
5
6
7
8
9
10
# 列出所有卷
docker volume ls
# 列出所有卷的ID
docker volume ls -q
# 列出指定驱动的卷
docker volume ls -f driver=local
# 列出指定标签的卷
docker volume ls -f label=env=dev
# 列出所有未使用的卷,包括匿名卷和命名卷
docker volume ls -f dangling=true

docker volume inspect <name> : 查看指定卷的详细信息

1
2
3
4
5
6
# 列出指定卷的详细信息
docker volume inspect myvolume
# 列出指定卷的详细信息,并使用json格式输出
docker volume inspect -f json myvolume
# 列出指定卷的挂载点
docker volume inspect myvolume --format "{{.Mountpoint}}"

docker volume prune : 删除所有未被容器使用的卷

1
2
3
4
5
6
# 删除所有未被使用的匿名数据卷,会提示确认
docker volume prune
# 删除所有未被使用的数据卷,会提示确认
docker volume prune -a
# 删除所有未被使用的卷,无需确认立刻删除
docker volume prune -a -f
  • 匿名卷 vs 命名卷

    • 匿名卷:没有名称,只在 docker run -v /container/path 时自动创建;
    • 命名卷:有名称,例如 docker run -v mydata:/container/path

docker volume rm <name> : 删除数据卷

1
2
3
4
5
6
7
8
# 删除指定数据卷
docker volume rm myvolume
# 删除所有数据卷
docker volume rm $(docker volume ls -q)
# 删除所有未使用的数据卷
docker volume rm $(docker volume ls -qf dangling=true)
# 删除所有未使用的数据卷,无需确认
docker volume rm $(docker volume ls -qf dangling=true) -f