Docker 卷管理命令必备指南

借助这份必备指南,精通 Docker 卷管理。学习如何使用 `docker volume` 命令来创建、列出、检查、删除和修剪持久化数据卷。探索最佳实践和实用示例,以确保数据完整性和无缝的应用程序生命周期。对于任何管理有状态应用程序的 Docker 用户而言都至关重要。

36 浏览量

Docker 卷管理命令必备指南

Docker 容器本质上是瞬态的。这意味着一旦容器停止并被移除,写入容器内部的任何数据都将丢失。对于需要持久化数据存储的应用程序(如数据库、配置文件或用户上传),这种瞬态性带来了巨大的挑战。Docker 卷管理为此问题提供了一个强大的解决方案,使您能够独立于容器生命周期管理持久化数据。

理解并有效利用 Docker 卷命令对于任何使用 Docker 的开发人员或系统管理员都至关重要。本指南将带您了解基本的 docker volume 命令,演示如何创建、列出、检查和管理您的持久化数据,从而确保数据完整性和应用程序的无缝运行。

什么是 Docker 卷?

Docker 卷是持久化由 Docker 容器生成和使用的数据的首选机制。卷由 Docker 创建、管理和控制。它们存储在容器的可写层之外,通常位于由 Docker 守护进程管理的主机上的某个位置。这种分离确保即使容器被删除、更新或移动到不同的主机,数据也能保持完整。

Docker 卷的主要特点包括:

  • 持久性: 存储在卷中的数据在容器重启、移除和更新后仍然存在。
  • 隔离性: 卷与容器的文件系统分离,简化了数据管理。
  • 可移植性: 卷可以在不同环境之间轻松移动或复制。
  • 性能: 卷通常比绑定挂载提供更好的性能,特别是对于 I/O 密集型操作。

核心 docker volume 命令

docker volume 命令是管理卷的主要接口。让我们探索最重要的子命令。

docker volume create

此命令创建一个新的 Docker 卷。您可以选择为卷指定一个名称。如果没有提供名称,Docker 将生成一个唯一的名称。

语法:

docker volume create [OPTIONS] [VOLUME_NAME]

示例 1:创建具有特定名称的卷

此命令创建一个名为 my-app-data 的卷。

docker volume create my-app-data

示例 2:创建匿名卷(Docker 生成名称)

docker volume create

当您运行此命令时,Docker 将输出新卷的随机生成名称。

docker volume ls

此命令列出系统上的所有 Docker 卷。它显示每个卷的 DRIVERNAME

语法:

docker volume ls [OPTIONS]

选项:

  • -f, --filter filter:根据条件过滤输出(例如,dangling=true)。
  • --format string:使用 Go 模板美观地打印卷。
  • -q, --quiet:仅显示卷名称。

示例 1:列出所有卷

docker volume ls

示例 2:仅列出卷名称

docker volume ls -q

示例 3:列出悬空卷(未与任何容器关联的卷)

docker volume ls -f dangling=true

docker volume inspect

此命令显示一个或多个卷的详细信息。输出采用 JSON 格式,包括卷在主机上的挂载点、驱动程序和标签等详细信息。

语法:

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

示例:检查特定卷

假设您有一个名为 my-app-data 的卷,您可以这样检查它:

docker volume inspect my-app-data

输出将类似于:

[
    {
        "CreatedAt": "2023-10-27T10:00:00Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-app-data/_data",
        "Name": "my-app-data",
        "Options": {}
    }
]

docker volume rm

此命令删除一个或多个卷。重要提示: 如果卷当前正被运行中的容器使用,则无法删除它。您必须先停止并移除使用该卷的任何容器,然后才能删除它。

语法:

docker volume rm [OPTIONS] VOLUME [VOLUME...]

选项:

  • -f, --force:强制删除卷,即使它尚未完全与容器分离(请谨慎使用)。

示例:删除卷

首先,确保没有容器正在使用该卷。然后,运行:

docker volume rm my-app-data

警告: 如果您尝试删除正在使用的卷,Docker 将返回错误。

docker volume prune

此命令移除所有未使用的本地卷。未使用的卷是指当前未连接到任何容器的卷。这是一个用于清理磁盘空间的强大命令。

语法:

docker volume prune [OPTIONS]

选项:

  • -f, --force:不提示确认。

示例:移除所有未使用的卷

docker volume prune

Docker 将提示您确认操作。如果您想跳过确认,请使用 -f 标志:

docker volume prune -f

注意: 此命令将永久删除所有未使用的卷。在运行它之前,请确保您了解哪些卷是未使用的。

将卷与容器一起使用

卷通常在容器创建或运行时附加到容器。这是通过 docker run 命令的 -v--mount 标志完成的。

使用 -v 标志

这是挂载卷的简写。

语法:

docker run -v <volume_name>:<container_path> <image_name>

示例:使用命名卷运行 PostgreSQL 容器

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

在此示例中:

  • --name my-postgres:命名容器。
  • -v pgdata:/var/lib/postgresql/data:将名为 pgdata 的卷挂载到容器内的 PostgreSQL 数据目录。如果 pgdata 不存在,Docker 将创建它。
  • -d:在分离模式下运行容器。
  • postgres:要使用的 Docker 镜像。

使用 --mount 标志

--mount 标志提供了一种更明确和详细的方式来配置挂载,包括卷。

卷的语法:

docker run --mount type=volume,source=<volume_name>,target=<container_path> <image_name>

示例:使用 --mount 标志运行带有命名卷的 Redis 容器

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

在这里,type=volume 指定我们正在使用 Docker 卷。source=redisdata 是卷的名称(如果不存在,Docker 将创建它),而 target=/data 是卷将被挂载到容器内部的路径。

Docker 卷管理的最佳实践

  • 使用命名卷: 优先使用命名卷(my-app-data)而不是匿名卷(Docker 生成的名称),以提高可读性和可管理性。
  • 组织卷: 为您的卷制定一个命名约定,以反映其用途或它们支持的应用程序。
  • 定期清理未使用的卷: 磁盘空间会迅速累积。安排定期的 docker volume prune 操作来清理旧的、未使用的卷。
  • 检查卷: 使用 docker volume inspect 来了解您的数据在主机上的存储位置,并排查挂载问题。
  • 备份重要数据: 卷存储持久化数据,但它们本身不是备份。为存储在卷中的关键数据实施单独的备份策略。
  • 考虑卷驱动程序: 对于更高级的用例(例如,将数据存储在网络存储上),除了默认的 local 驱动程序外,还可以探索不同的卷驱动程序。

结论

Docker 卷是使用 Docker 构建有状态应用程序的基本组件。通过掌握 docker volume 命令——createlsinspectrmprune——您可以对持久化数据进行细粒度控制。这种控制确保您的应用程序数据在其整个生命周期中是安全、可访问且有效管理的,从而使您的 Docker 部署更加健壮和可靠。