Docker 卷 - Amazon Elastic Container Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Docker 卷

当使用 Docker 卷时,可以使用内置的 local 驱动程序或第三方卷驱动程序。Docker 卷由 Docker 管理,而目录在包含卷数据的容器实例上的 /var/lib/docker/volumes 中创建。

要使用 Docker 卷,请在任务定义中指定 dockerVolumeConfiguration。有关更多信息,请参阅使用卷

Docker 卷的一些常见使用案例包括:

  • 提供持久性数据卷以用于容器

  • 在同一个容器实例上不同容器中的不同位置共享一个定义的数据卷

  • 定义空的非持久性数据卷,并将其挂载到同一任务内的多个容器上

  • 向由第三方驱动程序管理的任务提供数据卷

Docker 卷注意事项

使用 Docker 卷时应注意以下事项:

  • 仅当使用 EC2 启动类型时,才支持 Docker 卷。

  • Windows 容器仅支持使用 local 驱动程序。

  • 如果使用第三方驱动程序,则应在容器代理启动之前在容器实例上安装并激活该驱动程序。如果在代理启动之前第三方驱动程序未处于活动状态,则可以使用下列命令之一重新启动容器代理:

    • 对于Amazon ECS-optimized Amazon Linux 2 AMI:

      sudo systemctl restart ecs
    • 对于Amazon ECS-optimized Amazon Linux AMI:

      sudo stop ecs && sudo start ecs

在任务定义中指定 Docker 卷

在您的容器可以使用数据卷之前,您必须在任务定义中指定卷和挂载点配置。此部分描述容器的卷配置。对于使用 Docker 卷的任务,请指定 dockerVolumeConfiguration。对于使用绑定挂载主机卷的任务,请指定 host 和可选的 sourcePath

下面显示的任务定义 JSON 显示容器的 volumesmountPoints 对象的语法。

{ "containerDefinitions": [ { "mountPoints": [ { "sourceVolume": "string", "containerPath": "/path/to/mount_volume", "readOnly": boolean } ] } ], "volumes": [ { "name": "string", "dockerVolumeConfiguration": { "scope": "string", "autoprovision": boolean, "driver": "string", "driverOpts": { "key": "value" }, "labels": { "key": "value" } } } ] }
name

类型:字符串

必需:否

卷的名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。此名称已在容器定义 sourceVolumemountPoints 参数中引用。

dockerVolumeConfiguration

类型:对象

必需:否

使用 Docker 卷时将指定此参数。仅当使用 启动类型时,才支持 Docker 卷。Windows 容器仅支持使用 驱动程序。要使用绑定挂载,请改为指定 host

scope

类型:字符串

有效值:task | shared

必需:否

Docker 卷的范围,可确定其生命周期。当任务开始时,将自动预置范围限定为 task 的 Docker 卷;而当任务清除时销毁此卷。任务停止后,范围限定为 的 Docker 卷将持续存在。

autoprovision

类型:布尔值

默认值:false

必需:否

如果此值为 true,则将创建 Docker 卷(如果此卷不存在)。仅在 scopeshared 时使用此字段。如果 scopetask,则必须省略此参数或将其设置为 false

driver

类型:字符串

必需:否

要使用的 Docker 卷驱动程序。由于驱动程序值用于任务放置,因此,它必须与 Docker 提供的驱动程序名称匹配。如果已使用 Docker 插件 CLI 创建驱动程序,则使用 docker plugin ls 可从容器实例中检索驱动程序名称。如果已使用其他方法创建驱动程序,则使用 Docker 插件发现功能可检索驱动程序名称。有关更多信息,请参阅 Docker 插件发现。此参数映射到 Docker Remote API创建卷部分中的 Driverdocker volume create--driver 选项。

driverOpts

类型:字符串

必需:否

要传递的 Docker 驱动程序特定的选项的映射。此参数映射到 Docker Remote API创建卷部分中的 DriverOptsdocker volume create--opt 选项。

labels

类型:字符串

必需:否

要添加到 Docker 卷的自定义元数据。此参数映射到 Docker Remote API创建卷部分中的 Labelsdocker volume create--label 选项。

mountPoints

类型:对象数组

必需:否

您的容器中数据卷的装载点。

此参数将映射到 Docker Remote API创建容器部分中的 Volumes 以及 docker run--volume 选项。

Windows 容器可在 $env:ProgramData 所在的驱动器上装载整个目录。Windows 容器无法在其他驱动器上装载目录,并且装载点不能跨驱动器。

sourceVolume

类型:字符串

必需:是,当使用 mountPoints

要挂载的卷的名称。

containerPath

类型:字符串

必需:是,当使用 mountPoints

要将卷装载到的容器上的路径。

readOnly

类型:布尔值

必需:否

如果此值为 true,则容器具有对卷的只读访问权。如果此值为 false,则容器可对卷进行写入。默认值为 false

示例

以下示例显示 Docker 卷的使用。

使用 Docker 卷为容器提供非持久性存储

在此示例中,您希望容器使用一个空数据卷,但您不希望在完成任务后保留该卷。例如,您可能具有一个需要在任务期间访问某个临时文件存储位置的容器。可以使用 Docker 卷实现此任务。

  1. 在任务定义 volumes 部分中,使用 nameDockerVolumeConfiguration 值定义数据卷。在此示例中,我们将范围指定为 task,以便在任务停止后删除此卷并使用内置的 local 驱动程序。

    "volumes": [ { "name": "scratch", "dockerVolumeConfiguration" : { "scope": "task", "driver": "local", "labels": { "scratch": "space" } } } ]
  2. containerDefinitions 部分中,使用引用已定义卷的名称的 mountPoints 值和将卷挂载到容器上所在的 containerPath 值定义容器。

    "containerDefinitions": [ { "name": "container-1", "mountPoints": [ { "sourceVolume": "scratch", "containerPath": "/var/scratch" } ] } ]

使用 Docker 卷为容器提供持久性存储

在本示例中,您希望多个容器使用一个共享卷,并希望在使用此卷的任何单个任务停止后该卷持续存在。正在使用的是内置的 local 驱动程序,以便该卷仍绑定到容器实例的生命周期。

  1. 在任务定义 volumes 部分中,使用 nameDockerVolumeConfiguration 值定义数据卷。在此示例中,指定 shared 范围以便此卷持久存在,将自动预置设置为 true 以便创建此卷进行使用,并使用内置的 local 驱动程序。

    "volumes": [ { "name": "database", "dockerVolumeConfiguration" : { "scope": "shared", "autoprovision": true, "driver": "local", "labels": { "database": "database_name" } } } ]
  2. containerDefinitions 部分中,使用引用已定义卷的名称的 mountPoints 值和将卷挂载到容器上所在的 containerPath 值定义容器。

    "containerDefinitions": [ { "name": "container-1", "mountPoints": [ { "sourceVolume": "database", "containerPath": "/var/database" } ] }, { "name": "container-2", "mountPoints": [ { "sourceVolume": "database", "containerPath": "/var/database" } ] } ]