Docker 卷管理命令必备指南

学习 Docker 卷的创建、列出、检查、挂载、备份、删除和清理持久化数据的命令。

Docker 卷管理命令完全指南

当你的容器写入重要数据时,Docker 卷管理命令就变得至关重要。容器的可写层会在删除容器时消失,但 Docker 卷可以跨容器重建保留数据库文件、上传文件、缓存数据或应用程序状态。

本指南将介绍核心的 docker volume 命令、如何将卷附加到容器,以及清理命令可能带来的意外情况。

什么是 Docker 卷?

Docker 卷是 Docker 管理的存储对象。它们位于容器的可写层之外,通常在使用默认的 local 驱动时位于主机上 Docker 管理的目录中。命名卷在停止、删除或重新创建使用它的容器后仍然可用。

卷之所以有用,是因为它们提供:

  • 持久性: 数据在容器替换后仍然存在。
  • 隔离性: 应用程序数据与镜像和可写层分离。
  • 驱动支持: 卷驱动可以使用本地磁盘、网络存储或特定平台的存储后端。
  • 操作清晰性: 命名卷比匿名容器层更容易检查、备份和重用。

核心 docker volume 命令

docker volume 命令是创建、列出、检查和删除卷的主要接口。

docker volume create

创建命名卷:

docker volume create my-app-data

创建 Docker 自动生成名称的卷:

docker volume create

使用非默认设置时,还可以传递驱动选项:

docker volume create --driver local my-app-data

docker volume ls

列出卷:

docker volume ls

仅显示名称:

docker volume ls -q

过滤悬空卷:

docker volume ls --filter dangling=true

dangling=true 表示 Docker 认为该卷未被任何容器引用。但这并不意味着数据不重要。

docker volume inspect

检查卷:

docker volume inspect my-app-data

对于本地卷,输出类似如下:

[
  {
    "CreatedAt": "2026-05-23T10:00:00Z",
    "Driver": "local",
    "Labels": null,
    "Mountpoint": "/var/lib/docker/volumes/my-app-data/_data",
    "Name": "my-app-data",
    "Options": null,
    "Scope": "local"
  }
]

Mountpoint 对故障排除很有用,但避免在容器使用卷时直接编辑其中的文件。让应用程序或受控的维护容器来写入数据。

docker volume rm

删除一个或多个卷:

docker volume rm my-app-data

如果仍有任何容器引用该卷(即使容器已停止),Docker 将不会删除它。先找到并删除这些容器:

docker ps -a --filter volume=my-app-data
docker rm <容器名称或ID>
docker volume rm my-app-data

此命令会删除卷数据。如果数据重要,请先备份。

docker volume prune

Prune 删除未使用的本地卷。在当前的 Docker 版本中,docker volume prune 默认删除未使用的匿名卷。如果要同时删除未使用的命名卷,请使用 --all

删除未使用的匿名卷:

docker volume prune

跳过确认提示:

docker volume prune --force

删除所有未使用的本地卷,包括命名卷:

docker volume prune --all

使用标签使清理更安全:

docker volume create --label app=myapp myapp-cache
docker volume prune --filter label=app=myapp

Prune 操作会永久删除数据。在清理命名应用程序数据之前,请检查卷中的内容。

将卷挂载到容器

在创建容器时附加卷。如果命名卷不存在,Docker 可以自动创建它。

使用 -v

docker run --name my-postgres \
  -v pgdata:/var/lib/postgresql/data \
  -d postgres

这里,pgdata 是卷名称,/var/lib/postgresql/data 是容器内的路径。

使用 --mount

--mount 更明确,在脚本中更易读:

docker run --name my-redis \
  --mount type=volume,source=redisdata,target=/data \
  -d redis

两种形式都有效。当你想要更清晰的键值语法,特别是带有额外挂载选项时,请使用 --mount

备份和恢复卷

Docker 卷是持久化存储,但不是备份。一个简单的备份模式是运行一个临时容器,挂载卷并将归档文件写入当前目录:

docker run --rm \
  -v my-app-data:/data:ro \
  -v "$PWD":/backup \
  alpine \
  tar czf /backup/my-app-data.tgz -C /data .

恢复到空卷:

docker volume create my-app-data-restored

docker run --rm \
  -v my-app-data-restored:/data \
  -v "$PWD":/backup \
  alpine \
  tar xzf /backup/my-app-data.tgz -C /data

对于数据库,当一致性很重要时,优先使用数据库原生的备份工具。除非数据库已停止或支持该备份方法,否则对正在运行的数据库卷进行文件系统归档可能不安全。

Docker 卷管理的最佳实践

  • 对计划保留的数据使用命名卷。
  • 为属于应用程序或环境的卷添加标签。
  • 在删除或清理卷之前进行检查。
  • 在 Docker 主机之外备份重要卷。
  • 避免将不可替代的数据仅存储在匿名卷中。
  • 测试恢复,而不仅仅是备份。
  • 当需要在本地 Docker 主机之外存储时,使用卷驱动。

总结

对要保留的状态使用命名 Docker 卷,在删除任何内容之前进行检查,并将 prune 视为具有真实数据丢失风险的清理命令。日常操作很简单:创建或让 Docker 创建卷,使用 docker run 挂载它,在故障排除时检查它,在重要时备份它,并且仅在没有任何容器引用它之后才删除它。