如何使用Doctl使用DigitalOcean块存储

来自菜鸟教程
跳转至:导航、​搜索
      1. Introduction 块存储允许您以类似于使用硬盘驱动器的方式管理 DigitalOcean Droplets 的额外存储。 只需从 DigitalOcean 的流线型 GUI 或图形用户界面单击几下,即可将块存储添加到我们的 Droplets。 但是,这不是在更大和更复杂的环境中操作的实用方法,因此 DigitalOcean 提供了一个 API 来大规模工作。 我们可以通过 DigitalOcean 的官方命令行工具 doctl 直接与 API 交互。

在本教程中,我们将学习如何使用 doctl 从我们的 Droplets 中创建、列出、附加、分离和删除块存储卷。

    1. Prerequisites 在开始本教程之前,您应该熟悉 doctl 和 DigitalOcean 的块存储。 以下文章将有所帮助:

在继续之前,您应该确保已安装并验证了最新版本的 doctl(在撰写本文时为 1.7.1)。 通过运行 doctl version 检查您的 doctl 版本。 您还需要将 SSH 密钥添加到您的 DigitalOcean 帐户

最后但同样重要的是,要遵循本教程,您需要在允许使用块存储的区域之一上创建一个 Droplet(在撰写本文时,以下区域提供块存储:BLR1FRA1LON1NYC1NYC3SFO2SGP1 和 [ X316X]TOR1)。

注意:虽然上述区域支持块存储,但该功能目前不适用于上述区域的所有Droplet。 为确保您正在使用的 Droplet 支持块存储,您必须在创建时将卷附加到它。


    1. Creating Volumes 为了使用 doctl 创建卷,您需要向命令提供以下参数:
  • 卷名:在我们的示例中,它将是 firstvolume
  • region:对于我们的教程,我们将在 NYC3 中创建卷
  • size(默认为 4TB):在本例中,我们将其设置为 100 GiB

您还可以使用 desc 标志提供描述,但这完全是可选的。 完整的命令将如下所示:

doctl compute volume create firstvolume --region nyc3 --size 100GiB

您应该会看到与此类似的输出:

OutputID                                      Name           Size      Region    Droplet IDs
______your_volume_ID1_______             firstvolume    100 GiB    nyc3    

至此,您知道了doctl命令以及创建新卷需要哪些信息。 接下来,您将学习如何打印现有卷的完整列表。

    1. Listing Volumes doctl 为我们提供了在格式化列表中显示现有卷的能力。 您想要列出您的卷有几个原因。 最常见的两个是显示每个卷的 ID,以便在以后的命令中使用,并显示哪些 Droplet 分配了卷。

要列出所有当前的块存储卷,您可以运行以下命令。

doctl compute volume list

这是在我们的示例中运行的 list 命令的输出:

OutputID                                      Name              Size        Region    Droplet IDs
______your_volume_ID1______             firstvolume       100 GiB     nyc3      
______your_volume_ID1______             secondvolume      4096 GiB    nyc3      
______your_volume_ID1_______            thirdvolume       100 GiB      nyc3      [ID]

在本节中,您学习了 doctl 命令来查看您创建的卷列表。 在下一节中,我们将讨论如何将卷附加到 Droplet。

    1. 附加卷

有时,您的 Droplet 可能需要额外的空间来处理应用程序数据和配置文件等资产。 添加卷是在不中断服务的情况下添加此空间的好方法。

要附加卷,您将需要两条信息:

  • 卷 ID
  • 液滴 ID

在上一节中,我们已经了解了如何使用 doctl compute volume list 命令获取 卷 ID

我们可以通过运行以下命令来获取我们的 Droplet ID 以显示有关我们帐户的 Droplets 的信息:

doctl compute droplet list

一旦我们有了卷 ID 和 Droplet ID,我们就可以继续使用以下命令将卷附加到 Droplet:

doctl compute volume-action attach your_volume_ID your_droplet_ID

这将产生类似于以下的输出:

OutputID           Status         Type             Started At                       Completed At    Resource ID    Resource Type    Region
346253669    in-progress    attach_volume    2017-12-28 19:53:28 +0000 UTC    <nil>           0              backend          nyc3

在本教程的前面部分,建议您在创建时将卷附加到 Droplet,以确保 Droplet 使用支持块存储的基础架构。 如果您在创建 Droplet 时未附加卷,则在尝试向其附加卷时可能会看到以下错误:

OutputError: POST https://api.digitalocean.com/v2/volumes/your_volume_ID/actions: 422 Droplet can't attach volumes due to a region restriction

如果遇到此错误,您将无法将卷附加到指定的 Droplet,需要重试。

将卷成功附加到接受该卷的 Droplet 后,您可以继续下一节了解如何在不再需要额外空间的情况下分离该卷。

    1. 分离卷

有时您可能只需要临时将卷附加到 Droplet,例如在调试需要大量日志的问题或创建某些有时限数据的备份时。 在这些情况下,我们需要能够在使用完卷后将其分离。

分离卷类似于附加卷并使用相同的信息。 命令和输出略有不同。

doctl compute volume-action detach your_volume_ID your_droplet_ID
OutputID           Status         Type             Started At                       Completed At    Resource ID    Resource Type    Region
346254931    in-progress    detach_volume    2017-12-28 19:57:51 +0000 UTC    <nil>           0              backend          nyc3

至此,您知道如何使用 doctl 分离卷。 在下一部分中,您将了解如何删除不再需要的卷。

    1. Deleting Volumes 当您不再需要某个块存储卷时,您可以将其分离,然后通过删除将其从您的帐户中移除。 分离卷后,要删除它,您将需要它的 ID。
doctl compute volume delete your_volume_id

运行此命令将提示确认:

OutputWarning: Are you sure you want to delete volume (y/N) ?

如果您对要删除的音量感到满意,请按 y 确认。

删除卷后,您将返回到命令提示符。 您可以使用 list 命令验证卷是否已被删除。

    1. Getting Information About a Volume 如果您需要有关特定卷的信息,可以通过调用以下命令来请求它
doctl compute volume get your_volume_id

您会发现此命令的输出很熟悉,因为它会在创建卷时自动运行。

OutputID                                      Name           Size      Region    Droplet IDs
______your_volume_ID1_______       firstvolume    100 GiB    nyc3

在本节中,您了解了如何删除不再需要的卷。

您现在拥有成功使用 doctl 处理 DigitalOcean 块存储卷所需的所有信息。

    1. Conclusion 在本教程中,我们学习了如何使用 doctl 从我们的 Droplets 中添加、附加、分离、列出和删除卷。

既然您知道如何执行此操作,您可能想要探索创建脚本并将这些脚本添加到您最喜欢的自动化工具中,例如 JenkinsDrone