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

How to use a separate file system for the Docker daemon related files at start up on AWS EC2

我想为 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"(左 菜单)。然后 select 附加到 EC2 实例的卷和 select "Actions" -> "Create Snapshot"。然后需要几分钟时间来创建快照。

正在启动一个实例

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

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

然后我使用下面的 BlockDeviceMappings 配置来挂载这个 启动实例时将快照作为卷。替换所有大写值 与你的价值观。您应该使用您创建的 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.