本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 显示容器的 volumes
和 mountPoints
对象的语法。
{ "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 个字母 (大写和小写字母)、数字、连字符和下划线。此名称已在容器定义
sourceVolume
的mountPoints
参数中引用。 dockerVolumeConfiguration
-
类型:对象
必需:否
使用 Docker 卷时将指定此参数。只有在使用 EC2 启动类型时,才支持 Docker 卷。Windows 容器仅支持使用
local
驱动程序。要使用绑定挂载,请改为指定host
。scope
-
类型:字符串
有效值:
task
|shared
必需:否
Docker 卷的范围,可确定其生命周期。当任务开始时,将自动预配置范围限定为
task
的 Docker 卷;而当任务停止时销毁此卷。任务停止后,范围限定为shared
的 Docker 卷将持续存在。 autoprovision
-
类型:布尔值
默认值:
false
必需:否
如果此值为
true
,则将创建 Docker 卷(如果此卷不存在)。仅在scope
为shared
时使用此字段。如果scope
为task
,则必须省略此参数或将其设置为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 卷实现此任务。
-
在任务定义
volumes
部分中,使用name
和DockerVolumeConfiguration
值定义数据卷。在此示例中,我们将范围指定为task
,以便在任务停止后删除此卷并使用内置的local
驱动程序。"volumes": [ { "name": "
scratch
", "dockerVolumeConfiguration" : { "scope": "task
", "driver": "local
", "labels": { "scratch
": "space
" } } } ] -
在
containerDefinitions
部分中,使用引用已定义卷的名称的mountPoints
值和将卷挂载到容器上所在的containerPath
值定义容器。"containerDefinitions": [ { "name": "
container-1
", "mountPoints": [ { "sourceVolume": "scratch
", "containerPath": "/var/scratch
" } ] } ]
使用 Docker 卷为容器提供持久性存储
在本示例中,您希望多个容器使用一个共享卷,并希望在使用此卷的任何单个任务停止后该卷持续存在。正在使用的是内置的 local
驱动程序。以便该卷仍绑定到容器实例的生命周期。
-
在任务定义
volumes
部分中,使用name
和DockerVolumeConfiguration
值定义数据卷。在此示例中,指定shared
范围以便卷持续存在,将自动预置设置为true
。这样就可以创建卷以供使用。然后,还可使用内置的local
驱动程序。"volumes": [ { "name": "
database
", "dockerVolumeConfiguration" : { "scope": "shared
", "autoprovision": true, "driver": "local
", "labels": { "database
": "database_name
" } } } ] -
在
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 卷实现此目标。
-
在任务定义
volumes
部分中,使用name
和DockerVolumeConfiguration
值定义数据卷。在此示例中,指定task
范围以便在任务停止后卸载卷。使用local
驱动程序并使用type
、device
和o
选项相应地配置driverOpts
。NFS_SERVER
替换为 NFS 服务器端点。"volumes": [ { "name": "NFS", "dockerVolumeConfiguration" : { "scope": "task", "driver": "local", "driverOpts": { "type": "nfs", "device": "$
NFS_SERVER
:/mnt/nfs", "o": "addr=$NFS_SERVER
" } } } ] -
在
containerDefinitions
部分中,使用引用已定义卷的名称的mountPoints
值和将卷挂载到容器上所在的containerPath
值定义容器。"containerDefinitions": [ { "name": "
container-1
", "mountPoints": [ { "sourceVolume": "NFS
", "containerPath": "/var/nfsmount
" } ] } ]