amazon-web-services - 如何在 AWS EC2 上启动时为 Docker 守护程序相关文件使用单独的文件系统

标签 amazon-web-services amazon-ec2 docker amazon-ami

我想为 AWS EC2 上的 Docker 守护程序使用单独的 overlayfs 文件系统卷。我已经能够通过登录并运行命令来手动配置和设置它。我现在想创建一个在启动时自动执行此操作的 AWS AMI,这样我就不必每次都自己执行此操作。

我试过用谷歌搜索这个,但我似乎找不到一个 AMI 已经这样做了。谁能就将其烘焙到我的自定义 AMI 中的最佳方式提出建议?

最佳答案

我最终自己弄清楚了如何做到这一点。我发布我的结果以防万一 这对其他任何人都有用。

创建 AMI

假设一个基础 AMI 已经安装了 docker 并使用 systemctl 来 管理启动服务。我运行以下命令从 docker 守护进程从使用 devicemapper 到使用 overlayfs。此外旧 /var/lib/docker/devicemapper 目录被删除,标志 --graph=/mnt/ 指定目录/mnt 将用于存储所有 docker 镜像、容器等

sudo service docker stop
sudo rm -rf /var/lib/docker/devicemapper
sudo sed -i -e "/ExecStart/s/$/ --storage-driver=overlay --graph=\/mnt\//" /lib/systemd/system/docker.service
sudo systemctl daemon-reload

接下来创建将挂载文件系统的目录。更新 /etc/fstab EC2实例启动时挂载

sudo mkdir -p /mnt
echo '/dev/xvdf       /mnt    ext4    defaults,nofail 0 2' | sudo tee --append /etc/fstab

使用这些更改创建一个新的 amazon AMI。我用了packer为此和 发现它非常简单。

EBS 快照

您需要一个已经格式化的 EBS 快照来附加到每个启动的 EC2 实例。我通过创建一个带有新 EBS 卷的 EC2 实例来做到这一点, 格式化附加的 EBS 卷。 AWS website has documentation , 例如格式化为 Ext4 是:

sudo mkfs -t ext4 device_name

完成此操作后,您需要将 EBS 卷转换为 EBS 快照。 您可以通过进入 AWS 并单击“EC2”->“Volumes”(左 菜单)。然后选择附加到 EC2 实例的卷并选择“操作” -> “创建快照”。然后需要几分钟时间来创建快照。

启动实例

完成所有这些后,您应该拥有以下内容:

  • AMI 期望在 /dev/xvdf 中安装设备。
  • Docker 守护进程配置为将其图形数据库保存到/mnt 下的卷。
  • 用作此卷的 Ex4 格式的 EBS 快照。

然后我使用以下 BlockDeviceMappings 配置来挂载它 启动实例时将快照作为卷。替换所有大写值 与你的值(value)观。您应该使用您创建的 AMI 来启动实例。我 使用 DeleteOnTermination : true 因为我不关心 docker 关闭实例后的相关文件。

"BlockDeviceMappings": [
  {
    "DeviceName": "/dev/sdf",
    "Ebs": {
      "SnapshotId": "SNAPSHOT_ID",
      "Encrypted": false,
      "DeleteOnTermination": true,
      "VolumeSize": VOL_SIZE
    }
  }
],

疑难解答

  • 确保使用可以使用 EBS 卷的基本 AMI
  • 确保您的 EBS 卷已格式化为文件系统,例如Ext4
  • 检查/dev/xvdf是否为挂载设备,如果有则相应调整 不是。
  • 查看我的 packer github repository对于我用来构建我的命令 AMI。

关于amazon-web-services - 如何在 AWS EC2 上启动时为 Docker 守护程序相关文件使用单独的文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36657108/

相关文章:

amazon-web-services - AWS 中类似于 Google Bigquery 的分析工具是什么?

reactjs - Cognito 忘记密码 api 对发送的验证码(成功)或失败没有给出任何响应

amazon-web-services - 即使在有足够的分片后也会出现 Kinesis ProvisionedThroughputExceededException

clojure - Clojure Web 应用程序中的内存泄漏

java - 启动实例 : VPC security groups may not be used for a non-VPC launch

docker - 如何访问 docker-for-desktop 上的 PersistentVolume 文件?

azure - 无法使用SSL通过Nginx实现与redis容器的安全连接

amazon-web-services - 如何仅为 AWS Glue 脚本启用粘合日志记录

docker - 从远程注册表拉取镜像 - docker

amazon-web-services - 如何部署具有多个角色的 Terraform 模块?