使用Docker Compose卷管理持久性数据

使用Docker Compose卷管理持久性数据

Docker Compose 是一款功能强大的协调工具,旨在使用 Docker 简化多容器应用程序的管理和部署。docker-compose.yml 文件通过在一个文件中定义具有多个服务、网络和卷的复杂应用程序来简化部署。使用 Docker Compose 的一个重要方面是使用卷管理持久化数据。

本文探讨了在 Docker Compose 中使用卷处理持久性数据的重要性,并提供了有效使用卷的实践指南。

什么是 Docker 卷?

Docker 卷是一个重要的生态系统组件,用于存储和管理由短暂容器生成的持久数据。即使在移除或更新容器后,数据也能持久存在,这样就不会在日常操作中丢失重要的应用程序数据。

卷与容器的文件系统是分离的,因此你可以轻松地对它们进行备份,在多个容器之间共享它们,并在主机之间迁移它们。

与绑定挂载(即从主机系统到容器的目录挂载)相比,使用卷的一个关键优势是可移植性。你可以在不同主机或容器之间快速移动卷,但必须将绑定挂载绑定到主机系统上的特定目录。

这种可移植性使基于容器的应用中的数据管理更灵活、更高效。卷还兼容各种存储驱动程序,让您可以根据具体的使用情况选择最佳的存储解决方案。

Docker 卷的类型

Docker 卷对于管理基于容器的应用程序中的数据至关重要。它们有两种不同的类型:命名卷和匿名卷。本节将深入探讨这两种类型的主要区别,并演示如何实施它们来管理应用程序中的数据。

命名卷和匿名卷的用途不同,提供的控制和管理功能也各不相同。由于命名卷具有人类可读的标识符,且易于管理,因此在大多数使用案例中,命名卷通常是首选,但要最大限度地发挥这两种类型的优势,必须了解它们的功能。

已命名卷

命名卷有一个用户定义的名称,便于识别、管理和在多个容器之间共享。Docker 创建并管理命名卷,并将其数据存储在主机系统的特定位置。该位置通常位于 Docker 安装目录下,有一个与卷名相对应的唯一 ID。

命名卷提供了更大的控制性和灵活性,因为你可以使用它们的人可读标识符轻松地引用和操作它们。

要在 Docker 中创建命名卷,请运行:

docker volume create my_named_volume

匿名卷

与命名卷不同,匿名卷没有用户定义的名称。相反,Docker 会在你创建容器时自动创建它们,并为卷分配一个唯一的 ID。

由于缺乏人类可读的标识符,管理和存储卷通常比较困难。由于 Docker 会自动创建卷,因此通常使用匿名卷进行临时存储。如果在创建容器时没有指定命名卷,也会出现匿名卷。

要使用匿名卷创建容器,请运行:

docker run -v /data nginx

此命令将匿名卷挂载到容器 nginx 内的 /data 目录。可以用挂载卷的容器名称替换 nginx

如何使用 Docker Compose 创建和管理卷

Docker Compose 可以在 docker-compose.yml 文件中定义卷,从而简化了卷的创建和管理。该文件包含应用程序的服务、网络和卷的配置,可在一个地方轻松管理应用程序的资源。

1. 在 Docker Compose 中定义卷

要在 docker-compose.yml 文件中创建一个已命名的卷,请在 volumes 关键字下定义它。如有必要,还可以指定卷驱动程序和选项。

2. 将卷挂载到容器

要把卷附加到容器上,请在 docker-compose.yml 文件的 service 定义中使用 volumes 关键字。指定卷名称后的冒号和要挂载卷的容器路径。

你还可以使用相同的卷名,在多个容器之间共享卷。

下面是在 docker-compose.yml 文件中创建名为 web_datadb_data 的卷的例子:

version: '3.8'
services:
web:
image: nginx
volumes:
- web_data:/var/www/html
web-test:
image: nginx
volumes:
- web_data:/var/www/html # Web and web test share the web_data volume
db:
image: mysql
volumes:
- db_data:/var/lib/mysql
volumes:
web_data:
db_data:
driver: local # Define the driver and options under the volume name
driver_opts:
type: none
device: /data/db_data
o: bind

此示例定义了两个命名卷。然后,它将卷挂载到各自容器的特定路径下。接下来,它将 web_data 卷挂载到 web 容器中的 /var/www/html 目录,将 db_data 卷挂载到 db 容器中的 /var/lib/mysql 目录。

webweb-test 容器共享 web_data 卷,允许它们访问和修改相同的数据卷。

通过在 docker-compose.yml 文件中定义和管理卷,你可以根据需要轻松创建、更新和删除卷,而无需使用 Docker 命令手动管理它们。这种简化的流程让您可以专注于开发和部署应用程序,而 Docker Compose 则负责处理底层资源管理。

如何使用 Docker Compose 和 Volume 命令

Docker Compose 提供了多种命令,可帮助您有效管理应用程序及其资源。让我们详细回顾一下这些命令及其与卷的关系:

  •  docker compose up 会创建并启动你的应用程序,包括它的服务、网络和卷。如果你在 docker-compose.yml 文件中定义了已命名的卷,这条命令会自动创建它。
  •  docker compose down 停止并删除应用程序的服务和网络。默认情况下,它不会删除已命名的卷。要删除已命名的卷,请使用 --volumes-v 标志。
  •  docker compose ps 会列出容器及其当前状态,包括与卷相关的信息。
  •  docker compose config 验证并显示从 docker-compose.yml 文件生成的有效配置,包括卷定义。

列表卷

要列出所有卷,请使用 ls

docker volume ls

输出会显示所有已命名的卷,包括由 Docker Compose 创建的卷。

检查卷

要查看特定卷的详细信息,请使用 inspect 。它会输出卷的相关信息,如名称、驱动程序、挂载点和选项:

docker volume inspect db_data

卷的详细信息以 JSON 格式给出。例如,考虑到上面提供的 docker-compose.yml 文件,这就是返回的输出结果:

[
{
"CreatedAt": "some-date-here",
"Driver": "local",
"Labels": null,
"Mountpoint": "/path/on/host/where/volume/is/mounted",
"Name": "db_data",
"Options": {
"device": "/data/db_data",
"o": "bind",
"type": "none"
},
"Scope": "local",
"Status": {
"Mounts": [
...
]
}
}
]

按名称删除 Docker 卷

要删除 Docker 卷,可以使用 docker volume rm ,后面跟卷名:

docker volume rm volume-name

清理未使用的卷

删除未使用的卷,请使用 prune

docker volume prune

该命令有助于清理开发环境并回收存储空间。它会删除所有与容器无关的未使用卷,包括 Docker Compose 创建的卷。

利用这些命令及其与卷相关的功能,你可以有效地管理应用程序的资源,确保最佳性能和存储空间的高效利用。

Docker Compose 版本

自 2023 年 7 月起,Docker Compose V1 停止接收更新。在新发布的 Docker Desktop 中,它也不再可用。不过,Docker Desktop 仍然支持 docker-compose 别名,以便将命令重定向到 docker compose ,从而提高与第三方工具和脚本的兼容性。

要将现有代码从 Docker Compose 版本 1 切换到版本 2,只需将破折号换成空格即可。例如, docker-compose up 变成 docker compose up

有了版本 2,你就可以直接在 Docker 命令行界面(CLI)中使用 & compose 命令,切换 Docker 上下文以在云服务上构建容器,并使用亚马逊 ECS 和微软 ACI。

小结

这篇文章强调了在 Docker Compose 中使用卷管理持久性数据的重要性。卷是 Docker 生态系统中的一个重要组件,它使您能够存储和管理 Docker 容器生成的数据。有了 Docker 卷,即使在您删除或更新容器后,重要的应用程序数据也会持续存在,有助于保持应用程序的完整性和一致性。

Docker Compose 提供了一种在 docker-compose.yml 文件中创建和管理卷的简化方法。这种方法简化了开发过程,确保了资源的高效利用。

使用卷还能使开发变得灵活高效,Docker Compose 提供了各种与卷相关的命令,帮助你有效监督应用程序资源。利用这些命令,您可以轻松创建、检查和清理卷。

评论留言