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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Docker 卷

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

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

Docker 卷的一些常见使用案例如下:

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

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

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

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

Docker 卷注意事项

使用 Docker 卷时考虑以下事项:

  • 只有在使用 EC2 启动类型或外部实例时,才支持 Docker 卷。

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

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

    • 对于经 Amazon ECS 优化的 Amazon Linux 2 AMI:

      sudo systemctl restart ecs
    • 对于经 Amazon ECS 优化的 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 卷时将指定此参数。只有在使用 EC2 启动类型时,才支持 Docker 卷。Windows 容器仅支持使用 local 驱动程序。要使用绑定挂载,请改为指定 host

scope

类型:字符串

有效值:task | shared

必需:否

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

autoprovision

类型:布尔值

默认值:false

必需:否

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

driver

类型:字符串

必需:否

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

driverOpts

类型:字符串

必需:否

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

labels

类型:字符串

必需:否

要添加到 Docker 卷的自定义元数据。此参数映射到 Docker Remote API创建卷部分中的 Labels 以及 docker 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" } ] } ]
使用 Docker 卷为容器提供 NFS 持久性存储

在此示例中,容器使用 NFS 数据卷,该数据卷在任务启动时自动挂载,在任务停止时自动卸载。这使用了 Docker 内置 local 驱动程序。一个示例使用案例为,您可能具有本地 NFS 存储,并且需要从 ECS Anywhere 任务访问该存储。可以通过带有 NFS 驱动程序选项的 Docker 卷实现此目标。

  1. 在任务定义 volumes 部分中,使用 nameDockerVolumeConfiguration 值定义数据卷。在此示例中,指定 task 范围以便在任务停止后卸载卷。使用 local 驱动程序并使用 typedeviceo 选项相应地配置 driverOptsNFS_SERVER 替换为 NFS 服务器端点。

    "volumes": [ { "name": "NFS", "dockerVolumeConfiguration" : { "scope": "task", "driver": "local", "driverOpts": { "type": "nfs", "device": "$NFS_SERVER:/mnt/nfs", "o": "addr=$NFS_SERVER" } } } ]
  2. containerDefinitions 部分中,使用引用已定义卷的名称的 mountPoints 值和将卷挂载到容器上所在的 containerPath 值定义容器。

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