在 AWS beanstalk 下将特定的 EBS 卷挂载到 Docker
Posted
技术标签:
【中文标题】在 AWS beanstalk 下将特定的 EBS 卷挂载到 Docker【英文标题】:Mount specific EBS volume to Docker under AWS beanstalk 【发布时间】:2014-09-27 09:49:03 【问题描述】:AWS Beanstalk 可以从 Docker 容器运行应用程序。 如文档 (http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_image.html) 中所述,可以将目录映射写入 Dockerrun.aws.json 中的 EC2 卷:
"Volumes": [
"HostDirectory": "/var/app/mydb",
"ContainerDirectory": "/etc/mysql"
但是,是否可以挂载特定的 EBS 卷?
F.e.我需要在 Docker 容器中运行 db 并使用 Beanstalk 部署它。很明显,我需要对数据进行持久化、数据库的备份/恢复等。
【问题讨论】:
【参考方案1】:我猜leg100/docker-ebs-attach Docker 容器可以满足您的需求,即使特定的现有 EBS 卷可用。您可以复制 .py 文件和相关的 Dockerfile 语句,也可以创建多容器 EB 设置并从此容器挂载卷。
顺便说一句,我已尝试按照 Rohit 的建议安装一个新的 EBS 卷(+ 格式化和安装它的命令),它可以工作,但 Docker does not see the mount until the docker daemon is restarted。
【讨论】:
【参考方案2】:您可以在任何 Beanstalk 环境中挂载 EBS 卷。此卷将在 EC2 实例上可用。
您可以使用 ebextensions 选项设置来执行此操作。在您的应用源.ebextensions/01-ebs.config
中创建一个文件,其中包含以下内容:
option_settings:
- namespace: aws:autoscaling:launchconfiguration
option_name: BlockDeviceMappings
value: /dev/sdj=:100,/dev/sdh=snap-51eef269,/dev/sdb=ephemeral0
映射的格式是设备名称=卷,其中设备映射指定为单个字符串,映射用逗号分隔。此示例将一个空的 100 GB Amazon EBS 卷、一个快照 ID 为 snap-51eef269 的 Amazon EBS 卷以及一个实例存储卷附加到自动扩展组中的所有实例。
阅读有关此选项设置的更多详细信息here。 阅读有关 ebextensions 的更多信息here。
为 beanstalk 环境实例安装 EBS 卷后,您可以使用上述卷映射来根据需要映射目录。
【讨论】:
它也适用于 Docker 吗?这种情况下该文件放在哪里? 该文件应保存在根目录下。它将与 Docker 一起使用,并且 EBS 卷将附加到 EC2 实例。您仍然必须将其映射到您的容器中。 根据我的经验,如果我按照此处所述安装它,它不适用于 Docker:blogs.aws.amazon.com/application-management/post/…,因为 Docker 卷是在 EBS 卷之前安装的(因此 Docker 看到 /host/mountpoint/ 为空dir 在 EBS 安装到它之前的状态)。但也许我只是搞砸了一些事情...... 顺便说一句,这不能挂载 特定卷 - 它会创建一个新卷,或者充其量是基于现有快照的新卷(这是有道理的,因为 EB 用于自动缩放,但您不能将相同的 EBS 卷附加到多个实例 [我相信])。但是您仍然可以使用 .ebextensions 和 AWS API 手动挂载特定卷(如果您的 EB 应用程序只有一个实例)以上是关于在 AWS beanstalk 下将特定的 EBS 卷挂载到 Docker的主要内容,如果未能解决你的问题,请参考以下文章
如何在启用默认 EBS 加密的情况下使用 Beanstalk?
如果 AWS_SECRET_KEY 必须存储在 EBS 环境变量中,AWS Secrets Manager 如何在 Elastic Beanstalk 应用程序中安全使用?
AWS 自动将 EBS 卷附加到 Elastic Beanstalk 后面的 EC2 实例