如何将 EBS 卷与 ECS 容器一起使用

Posted

技术标签:

【中文标题】如何将 EBS 卷与 ECS 容器一起使用【英文标题】:How do I use EBS volume with ECS container 【发布时间】:2016-11-17 20:03:15 【问题描述】:

我创建了一个 EBS 卷,将其附加并安装到我的容器实例中。在任务定义卷中,我将卷源路径设置为安装目录。 容器数据没有在挂载的目录中创建,挂载的 EBS 之外的所有其他目录都可以正常工作。

目的是将数据保存在容器外,并用另一个卷备份它。

有没有办法将此附加卷与我的容器一起使用?或者是处理卷和备份的更好方法。

编辑:它使用随机 docker 镜像进行测试,运行它指定卷,我遇到了同样的问题。我设法使其重新启动 Docker 服务工作,但我仍在寻找无需重新启动 Docker 的解决方案。

检查具有已挂载 EBS 的卷目录的容器

"HostConfig": 
  "Binds": [
  "/mnt/data:/data"
],
...
"Mounts": [
  
    "Source": "/mnt/data",
    "Destination": "/data",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  
],

目录显示:

$ ls /mnt/data/
lost+found

检查卷目录不是已挂载的 EBS 的容器

"HostConfig": 
  "Binds": [
    "/home/ec2-user/data:/data"
  ],
...
"Mounts": [
  
    "Source": "/home/ec2-user/data",
    "Destination": "/data",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  
]

目录显示:

$ ls /home/ec2-user/data
databases dbms

【问题讨论】:

我不知道您想要实现什么,但我更喜欢制作 EBS 快照,您可以根据需要安排它,如果发生任何事情,您已经准备好所有 vm以前做的,以后省了很多工作,而且可以把这个快照传到其他地区。 @FernandoZamperin 是的,我想为此 EBS 安排快照,但首先我需要容器正确使用它 也许这有帮助:***.com/questions/28792272/… 共享卷的任务定义? 我认为问题不在于 ECS 本身。如果我运行任何 docker 容器来指定新安装的 EBS 的卷,它不会按预期工作。我设法让它在安装卷后重新启动 docker,但不幸的是它不是一个优雅的解决方案。 【参考方案1】:

听起来您可能想要做的是利用 AWS EC2 Launch Configurations。使用启动配置,您可以指定在启动时创建 EBS 卷并将其附加到您的实例。这发生在 docker 代理和后续任务启动之前。

作为启动配置的一部分,您还需要更新配置详细信息下的用户数据,内容如下:

mkdir /data;
mkfs -t ext4 /dev/xvdb;
mount /dev/xvdb /data;
echo '/dev/xvdb /data ext4 defaults,nofail 0 2' >> /etc/fstab;

然后,只要您的容器设置为访问主机上的/data,一切都会先运行。

奖励:如果您使用的是 ECS 集群,我想您已经在使用启动配置来让您的实例加入集群。如果没有,您也可以自动添加新实例,使用类似:

#!/bin/bash 
docker pull amazon/amazon-ecs-agent
docker run --name ecs-agent --detach=true --restart=on-failure:10 --volume=/var/run/docker.sock:/var/run/docker.sock --volume=/var/log/ecs/:/log --volume=/var/lib/ecs/data:/data --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro   --volume=/var/run/docker/execdriver/native:/var/lib/docker/execdriver/native:ro --publish=127.0.0.1:51678:51678 --env=ECS_LOGFILE=/log/ecs-agent.log --env=ECS_AVAILABLE_LOGGING_DRIVERS=[\"json-file\",\"syslog\",\"gelf\"] --env=ECS_LOGLEVEL=info --env=ECS_DATADIR=/data --env=ECS_CLUSTER=your-cluster-here amazon/amazon-ecs-agent:latest

具体来说,您需要编辑此部分:--env=ECS_CLUSTER=your-cluster-here

希望这会有所帮助。

【讨论】:

【参考方案2】:

Using Data Volumes in Tasks 上的当前文档似乎解决了这个问题:

在发布经 Amazon ECS 优化的 AMI 版本 2017.03.a 之前,只有在 Docker 守护程序启动时可用的文件系统才可用于 Docker 容器。 您可以使用最新的 Amazon ECS-optimized AMI 来避免此限制,也可以将 docker 包升级到最新版本并重新启动 Docker。

【讨论】:

以上是关于如何将 EBS 卷与 ECS 容器一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ECS(容器存储)上验证 AWS EBS(Beanstalk)? AccessDeniedException

如何将映像创建的卷与 docker-compose 指定的命名卷链接?

使用 ECS 的 Docker 级别负载均衡

使用 EBS 部署多容器 docker 环境(flask 和 nginx)

Amazon ECS - 实例之间的持久数据

Docker的数据卷与数据卷容器操作