Docker - 卷



Docker 卷是 Docker 数据管理的重要组成部分,因为它为 Docker 容器提供了数据持久性。卷允许数据存在于容器的可写层之外,保证数据在移除或升级容器时不会丢失。这对于数据库、配置文件或需要跨容器重启或部署生存的应用程序数据尤其重要。

与将主机文件系统中的目录映射到容器中的绑定挂载不同,Docker 卷由 Docker 本身管理,并提供更高的抽象性和可移植性。由于卷可以在多个容器之间共享,因此当不同的服务需要访问相同数据时,它们非常有用。

Docker 卷的工作原理是什么?

Docker 卷是独立的文件系统,存在于容器生命周期之外。这种分离确保数据持久存在,并且可以轻松地在多个容器之间共享。

Docker 卷的工作方式如下:

  • 创建 - 可以使用“docker volume create”命令显式创建卷,也可以在使用卷挂载启动容器时隐式创建。
  • 存储 - 卷存储在主机的特定目录中,在 Linux 系统上默认为 /var/lib/docker/volumes。
  • 挂载 - 卷被挂载到容器中的特定路径:写入这些路径的数据存储在卷中,而不是容器的可写层。
  • 持久性 - 即使停止、更新或删除容器也不会影响卷中的数据。因此,这使得在不同容器实例之间保持持久性相对容易。
  • 共享 - 多个容器可以同时共享卷。它允许不同的容器访问或修改相同的数据。
  • 管理 - 可以使用 Docker 命令(例如列出、检查和删除卷)轻松管理卷。此外,可以使用卷驱动程序将卷存储在远程主机或云提供商上。

卷和绑定挂载的区别

Docker 中的卷和绑定挂载都有助于在容器和主机之间存储和共享数据,但方式不同。让我们讨论 Docker 卷和绑定挂载之间的主要区别。

特性 Docker 卷 绑定挂载
管理 由 Docker 管理 由主机系统管理
位置 存储在 Docker 管理的目录 (/var/lib/docker/volumes/) 中 可以是主机文件系统上的任何目录
可移植性 更具可移植性,适用于容器编排 可移植性较差,取决于主机的目录结构
性能 由 Docker 优化 I/O 操作 性能取决于主机文件系统
隔离性 提供更好的数据隔离和安全性 直接访问主机文件系统,隔离性较差
易用性 通过 Docker 命令更易于使用和管理 需要了解主机文件系统路径
数据共享 易于在多个容器之间共享 可以共享,但更复杂
数据持久性 数据在容器生命周期结束后仍然存在 数据也持久存在,但由 Docker 范围之外管理
备份和恢复 使用 Docker 命令更容易备份和恢复 需要手动备份和恢复过程
灵活性 存储路径固定,灵活性较差 更灵活,允许任意主机路径
安全性 在 Docker 上下文中具有更好的安全管理 依赖于主机的安全设置和访问控制
配置 使用 docker volume 命令创建和管理 直接在 docker run 命令中指定
设置 需要 Docker 处理卷生命周期 可以使用主机路径在没有 Docker 的情况下设置
权限 由 Docker 使用卷选项管理 继承自主机的目录权限

Docker 卷命令

如前所述,Docker 卷帮助我们创建和管理 Docker 容器中的持久存储。Docker 卷命令使管理它们更容易。让我们讨论一些用于创建、管理和对 Docker 卷执行各种操作的命令。

创建 Docker 卷

如果要创建新的 Docker 卷,可以使用 docker volume create 命令。使用此命令创建的卷可以被一个或多个容器使用。

$ docker volume create my_volume
Docker Volumes 1

列出 Docker 卷

列出本地主机上的 Docker 卷将是帮助您管理卷的最常用命令之一。如果要列出系统上的所有 Docker 卷,可以使用 docker volume ls 命令。

$ docker volume ls
Docker Volumes 2

检查 Docker 卷

如果要获取有关特定卷的详细信息,可以使用 docker volume inspect 命令。此命令需要指定卷的名称或 ID,您可以使用 volume list 命令获取。它将提供有关卷在主机上的位置及其配置的详细信息。

$ docker volume inspect my_volume
Docker Volumes 3

删除 Docker 卷

如果要清理本地机器并删除不再需要的 Docker 卷,可以使用 docker volume rm 命令。它允许您仅删除当前未被任何容器使用的卷。

$ docker volume rm my_volume
Docker Volumes 4

将 Docker 卷与容器一起使用

运行容器时,可以使用 -v 或 --mount 选项指定卷。-v 选项更简单,更常用,而 --mount 提供更高级的配置选项。

使用 -v -

$ docker run -d -v my_volume:/data my_image
Docker Volumes 5

使用 --mount -

$ docker run -d --mount source=my_volume,target=/data my_image

删除未使用的卷

Docker volume remove 命令一次只能删除一个卷。但是,如果要删除所有未使用的 Docker 卷以释放机器中的一些空间,可以使用 docker volume prune 命令。运行此命令时,它会在删除所有悬空卷之前提示您进行确认。

$ docker volume prune
Docker Volumes 6

备份 Docker 卷

备份卷中存储的数据始终很有用,因为如果意外删除卷,它将帮助您恢复丢失的数据。您可以将卷中的数据存储到 tarball 文件中。为此,您可以使用容器来压缩卷的内容并将其输出到主机系统上的文件。以下是名为 my_volume 的卷的示例命令:

$ docker run --rm -v my_volume:/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /data
Docker Volumes 7

从备份恢复 Docker 卷

一旦将数据备份到 tarball 文件中,就可以使用以下命令将其恢复到 Docker 卷。以下是将名为 my_volume 的卷从备份文件恢复的示例命令:

$ docker run --rm -v my_volume:/data -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar -C /data
Docker Volumes 8

结论

在本章中,我们讨论了 Docker 卷是什么以及它们与绑定挂载的不同之处。然后,我们讨论了几个 Docker 卷命令,这些命令将帮助您轻松管理和使用 Docker 环境中的持久存储。使用这些命令,您可以创建、检查、列出、删除、备份和恢复卷。这确保了容器中的应用程序在需要时拥有可靠且灵活的存储。

关于 Docker 卷的常见问题

1. 如何使用卷在 Docker 容器中持久化数据?

您可以将 Docker 卷挂载到容器内的任何路径,并在容器生命周期中持久化数据。您可以使用 docker volume create 创建命名卷,然后在启动新容器时使用 -v 或 --mount 标志将其挂载。

2. 我可以在容器之间共享 Docker 卷吗?

是的,这是可能的。多个容器可以访问同一个卷并能够更改它们。要共享卷,您只需要将同一个卷挂载到多个不同的容器中一次。Docker 本身会同步正在运行的实例之间的数据。

广告
© . All rights reserved.