在 Docker Compose 中定义和管理卷
卷是容器引擎实现的持久数据存储。Compose 提供了一种中立的方式,让服务挂载卷,以及配置参数来将它们分配给基础设施。顶层的 `volumes` 声明允许您配置可在多个服务中重用的命名卷。
要在多个服务中使用卷,您必须通过在 `services` 顶层元素中使用 volumes 属性来显式授予每个服务访问权限。`volumes` 属性具有提供更精细控制的其他语法。
提示正在处理大型仓库或monorepos,或者虚拟文件系统无法再与您的代码库一起扩展?Compose 现在利用了 同步文件共享,并自动为绑定挂载创建文件共享。请确保您已使用付费订阅登录 Docker,并在 Docker Desktop 的设置中启用了 **访问实验性功能** 和 **使用 Compose 管理同步文件共享**。
示例
以下示例展示了一个双服务设置,其中数据库的数据目录与另一个服务共享为名为 `db-data` 的卷,以便可以定期备份。
services:
backend:
image: example/database
volumes:
- db-data:/etc/data
backup:
image: backup-service
volumes:
- db-data:/var/lib/backup/data
volumes:
db-data:`db-data` 卷分别挂载到备份的 `/var/lib/backup/data` 和后端的 `/etc/data` 容器路径。
运行 `docker compose up` 会创建卷(如果它尚不存在)。否则,将使用现有卷,如果手动在 Compose 之外删除,则会重新创建。
属性
顶层 `volumes` 部分下的条目可以为空,在这种情况下,它使用容器引擎的默认配置来创建卷。或者,您可以使用以下键进行配置
驱动程序
指定应使用哪个卷驱动程序。如果驱动程序不可用,Compose 会返回错误并且不部署应用程序。
volumes:
db-data:
driver: foobardriver_opts
`driver_opts` 指定要作为键值对传递给此卷的驱动程序的选项列表。这些选项是驱动程序特定的。
volumes:
example:
driver_opts:
type: "nfs"
o: "addr=10.40.0.199,nolock,soft,rw"
device: ":/docker/example"外部
如果设置为 `true`
- `external` 指定此卷已存在于平台上,并且其生命周期在其应用程序生命周期之外进行管理。如果卷不存在,Compose 则不会创建该卷并返回错误。
- 除了 `name` 之外的所有其他属性都无关紧要。如果 Compose 检测到任何其他属性,它将拒绝 Compose 文件为无效。
在以下示例中,Compose 不会尝试创建名为 `{project_name}_db-data` 的卷,而是查找名为 `db-data` 的现有卷,并将其挂载到 `backend` 服务的容器中。
services:
backend:
image: example/database
volumes:
- db-data:/etc/data
volumes:
db-data:
external: truelabels
`labels` 用于向卷添加元数据。您可以使用数组或字典。
建议您使用反向 DNS 表示法,以防止您的标签与其他软件使用的标签发生冲突。
volumes:
db-data:
labels:
com.example.description: "Database volume"
com.example.department: "IT/Ops"
com.example.label-with-empty-value: ""volumes:
db-data:
labels:
- "com.example.description=Database volume"
- "com.example.department=IT/Ops"
- "com.example.label-with-empty-value"Compose 设置 `com.docker.compose.project` 和 `com.docker.compose.volume` 标签。
name
`name` 为卷设置自定义名称。名称字段可用于引用包含特殊字符的卷。该名称按原样使用,并且不与堆栈名称关联。
volumes:
db-data:
name: "my-app-data"这使得将此查找名称作为 Compose 文件的参数成为可能,这样卷的模型 ID 就被硬编码,但平台上的实际卷 ID 在部署时在运行时设置。
例如,如果 `DATABASE_VOLUME=my_volume_001` 在您的 `.env` 文件中
volumes:
db-data:
name: ${DATABASE_VOLUME}运行 `docker compose up` 将使用名为 `my_volume_001` 的卷。
它还可以与 `external` 属性结合使用。这意味着用于在平台上查找实际卷的名称与用于在 Compose 文件中引用卷的名称是分开设置的
volumes:
db-data:
external: true
name: actual-name-of-volume