Amazon Elastic Container Service
开发人员指南 (API 版本 2014-11-13)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

存储配置

默认情况下,Amazon ECS-optimized Amazon Linux AMI 附带 30GiB 的总存储量。您可以在启动时修改此值,以增加或减少您的容器实例上的可用存储。此存储用于操作系统和 Docker 映像与元数据。下面几节介绍基于 AMI 版本的Amazon ECS-optimized Amazon Linux AMI 的存储配置。

版本 2015.09.d 及更高版本

2015.09.d 版及更高版本中的Amazon ECS-optimized Amazon Linux AMI 使用 8GiB 卷进行启动,该卷用于在 /dev/xvda 挂载并装载为文件系统根的操作系统。另外还有一个在 /dev/xvdcz 挂载并供 Docker 用于映像和元数据存储的 22 GiB 卷。此卷将配置为逻辑卷管理 (LVM) 设备,并且可由 Docker 通过 devicemapper 后端直接访问。因为未装载此卷,所以无法使用标准存储信息命令(如 df -h)确定可用存储。但您可以使用 LVM 命令和 docker info 通过以下过程查找可用存储。有关更多信息,请参阅 Linux 文档项目中的 LVM HOWTO

注意

您可以通过在启动实例时更改其块储存设备映射设置来增加这些默认卷大小;但是,您不能指定小于默认值的卷大小。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的块储存设备映射

docker-storage-setup 实用程序在实例启动时为 Docker 配置 LVM 卷组和逻辑卷。默认情况下,docker-storage-setup 创建一个名为 docker 的卷组,并将 /dev/xvdcz 作为物理卷添加到该组。然后,它将创建一个名为 docker-pool 的逻辑卷,该卷使用卷组中 99% 的可用存储。剩余 1% 的可用存储将为元数据保留。

注意

早期版本的Amazon ECS-optimized Amazon Linux AMI(2015.09.d2016.03.a)将创建一个使用卷组中 40% 的可用存储的逻辑卷。当逻辑卷的容量已占用 60% 时,逻辑卷的大小将增加 20%。

确定 Docker 的可用存储

  • 您可以使用 LVM 命令、vgslvsdocker info 命令来查看 Docker 的可用存储。

    注意

    LVM 命令输出显示以 GiB(2^30 字节)为单位的存储值,而 docker info 显示以 GB(10^9 字节)为单位的存储值。

    1. 您可以使用 vgs 命令查看卷组中的可用存储。此命令显示卷组的总大小以及卷组中可用于增大逻辑卷的可用空间。以下示例显示一个 22 GiB 卷,其可用空间为 204 MiB。

      [ec2-user ~]$ sudo vgs

      输出:

      VG #PV #LV #SN Attr VSize VFree docker 1 1 0 wz--n- 22.00g 204.00m
    2. 您可以使用 lvs 命令查看逻辑卷中的可用空间。以下示例显示一个大小为 21.75 GiB 的逻辑卷,该卷的 7.63% 的空间已占用。此逻辑卷能够增大,直到卷组中不再有可用空间。

      [ec2-user@ ~]$ sudo lvs

      输出:

      LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert docker-pool docker twi-aot--- 21.75g 7.63 4.96
    3. docker info 命令还提供有关其占用的数据空间以及可用数据空间的信息。不过,其可用空间值基于其正在使用的逻辑卷的大小。

      注意

      因为 docker info 以 GB(10^9 字节)而不是 GiB(2^30 字节)为单位显示存储值,所以,对于相同的存储量,此处显示的值看起来大于使用 lvs 命令显示的值。但是,这两个值是相等的 (23.35 GB = 21.75 GiB)。

      [ec2-user ~]$ docker info | grep "Data Space"

      输出:

      Data Space Used: 1.782 GB Data Space Total: 23.35 GB Data Space Available: 21.57 GB

扩展 Docker 逻辑卷

向您的容器实例添加存储的最简单方式是终止现有实例,然后启动具有更大的数据存储卷的新实例。但如果您无法执行此操作,则可以向 Docker 使用的卷组添加存储,然后执行这些步骤来扩展其逻辑卷。

注意

如果您的容器实例存储是填满速度过快,则可采取以下几个措施来减小影响:

  • (Amazon ECS 容器代理 1.8.0 及更高版本)减少已停止或已退出的容器在您的容器实例上的保留时间。ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION 代理配置变量可设置从任务停止到 Docker 容器被删除所需等待的时间段 (默认情况下,此值为 3 小时)。这将删除 Docker 容器数据。如果此值设置得过低,您可能无法检查已停止的容器或无法在日志删除前查看它们。有关更多信息,请参阅 Amazon ECS 容器代理配置

  • 从您的容器实例中删除未运行的容器和未使用的映像。您可以使用以下示例命令来手动删除已停止的容器和未使用的映像。稍后将无法检查已删除的容器,而且必须先重新拉取已删除的映像,然后再从中启动新容器。

    要删除未运行的容器,请在容器实例上执行下面的命令:

    $ docker rm $(docker ps -aq)

    要删除未使用的映像,请在容器实例上执行下面的命令:

    $ docker rmi $(docker images -q)
  • 删除容器内未使用的数据块。您可以在任何正在运行的容器上使用下面的命令运行 fstrim 来丢弃该容器文件系统未使用的任何数据块。

    $ sudo sh -c "docker ps -q | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/"
  1. 在容器实例所在的可用区中创建新的 Amazon EBS 卷。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的创建 Amazon EBS 卷

  2. 将卷附加到您的容器实例。Docker 数据卷的默认位置为 /dev/xvdcz。为了保持一致,从该设备名称 (例如,/dev/xvdcy) 以逆字母顺序挂载其他卷。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的将 Amazon EBS 卷挂载到实例

  3. 使用 SSH 连接到您的容器实例。有关更多信息,请参阅 连接到您的容器实例

  4. 检查您的 docker-pool 逻辑卷的大小。以下示例显示一个大小为 409.19 GiB 的逻辑卷。

    [ec2-user ~]$ sudo lvs

    输出:

    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert docker-pool docker twi-aot--- 409.19g 0.16 0.08
  5. 检查您的卷组中的当前可用空间。以下示例在 VFree 列中显示 612.75 GiB。

    [ec2-user ~]$ sudo vgs

    输出:

    VG #PV #LV #SN Attr VSize VFree docker 1 1 0 wz--n- 1024.00g 612.75g
  6. 将新卷添加到 docker 卷组,并替换您将新卷添加到的设备名称。在此示例中,1 TiB 卷之前已添加并挂载到 /dev/xvdcy

    [ec2-user ~]$ sudo vgextend docker /dev/xvdcy Physical volume "/dev/sdcy" successfully created Volume group "docker" successfully extended
  7. 使用 vgs 命令验证卷组大小是否已增加。VFree 列应显示增加的存储大小。以下示例现在在 VFree 列中有 1.6 TiB,此值比其之前的值大 1 TiB。您的 VFree 列应是原始 VFree 值和您附加的卷的大小的和。

    [ec2-user ~]$ sudo vgs

    输出:

    VG #PV #LV #SN Attr VSize VFree docker 2 1 0 wz--n- 2.00t 1.60t
  8. 利用之前添加的卷的大小扩展 docker-pool 逻辑卷。以下命令向逻辑卷添加 1024 GiB,输入形式为 1024G

    [ec2-user ~]$ sudo lvextend -L+1024G /dev/docker/docker-pool

    输出:

    Size of logical volume docker/docker-pool_tdata changed from 409.19 GiB (104752 extents) to 1.40 TiB (366896 extents). Logical volume docker-pool successfully resized
  9. 验证逻辑卷的大小是否已增加。

    [ec2-user ~]$ sudo lvs

    输出:

    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert docker-pool docker twi-aot--- 1.40t 0.04 0.12
  10. (可选)验证 docker info 是否也识别已添加的存储空间。

    注意

    因为 docker info 以 GB(10^9 字节)而不是 GiB(2^30 字节)为单位显示存储值,所以,对于相同的存储量,此处显示的值看起来大于使用 lvs 命令显示的值。但是,这两个值是相等的 (1.539 TB =1.40 TiB)。

    [ec2-user ~]$ docker info | grep "Data Space"

    输出:

    Data Space Used: 109.6 MB Data Space Total: 1.539 TB Data Space Available: 1.539 TB

2015.09.c 版及早期版本

2015.09.c 版及更早版本中的Amazon ECS-optimized Amazon Linux AMI 使用单个 30GiB 卷进行启动,该卷在 /dev/xvda 挂载并安装为文件系统根。此卷共享操作系统和所有 Docker 映像和元数据。您可以使用标准存储信息命令(如 df -h)确定容器实例上的可用存储。

在不停止通过这些 AMI 启动的实例的情况下,没有可行的方法向这些实例添加存储(Docker 可使用)。如果发现容器实例需要的存储量大于默认值 30 GiB,应终止每个实例。然后,在其位置上使用最新的Amazon ECS-optimized Amazon Linux AMI 和足够大的数据存储卷启动另一个实例。