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_data
和 db_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 目录。
web
和 web-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 提供了各种与卷相关的命令,帮助你有效监督应用程序资源。利用这些命令,您可以轻松创建、检查和清理卷。
原文地址:https://www.wbolt.com/docker-compose-volumes.html