DigitalOcean 的Container Registry为您在云中提供了一个私有空间来存储和分发您的 Docker 映像。除了提供图像存储库外,该服务还集成到 DigitalOcean 的其他服务中。您可以将存储的映像部署到App Platform并将它们与托管 Kubernetes集群一起使用。
优点和特点
Container Registry 是 Docker Hub 的竞争对手,可让您将 Docker 映像保存在 DigitalOcean 帐户中。当您将使用其他 DigitalOcean 功能访问这些图像时,这是理想的选择。您无需为应用的私有映像设置单独的付费 Docker Hub 帐户。
Container Registry 中保存的数据在多个 DigitalOcean 数据中心区域之间自动进行负载平衡。当您启动容器并将它们拉到您的机器上时,这会加速图像检索。与其他 DigitalOcean 功能不同,您无法手动选择 Container Registry 的数据中心。
DigitalOcean 的注册表实现符合 OCI,因此您可以使用熟悉的生态系统工具与之交互。将注册表的凭据添加到 CLI 后,类似docker push的命令将“正常工作”。docker pull同样,Kubernetes 等编排器在您的注册表中引用图像也不会遇到问题。
创建注册表
Container Registry 是免费提供的,但免费计划确实有一些严重的限制。您将获得一个映像存储库(顶级映像名称)、500MB 存储空间和 500MB 出站数据传输上限——足以评估服务,但可能不适合长期使用。每月 5 美元的基本计划为您提供五个存储库和 5GB,而 20 美元/专业版则提供无限存储库和 100GB 存储空间。存储超额按 0.02 美元/GB 计费。
通过登录 DigitalOcean 控制面板并单击左侧栏中的“容器注册表”链接来创建注册表。为您的新注册表命名并选择您的存储计划。该名称必须在每个 DigitalOcean 注册表中都是全局唯一的,因此您的首选可能不可用。它最多需要包含 63 个字符,包括字母、数字和连字符。
创建新注册表可能需要几秒钟。该过程完成后,您将被带到注册表的仪表板屏幕。
连接你的 Docker CLI
下一步是将 Docker CLI 连接到注册表。您需要向 Docker 提供您的注册表凭据,以便它可以使用您的帐户推送和拉取图像。有三种不同的方法可以实现这一目标。
使用 Doctl
DigitalOcean 的官方命令行实用程序 Doctl 包含一个便捷脚本,可将您的 Docker 客户端配置为与您的 Container Registry 一起使用。
您需要安装 Doctl 并对您的 DigitalOcean 帐户进行身份验证才能使用此方法。运行以下命令来设置集成:
doctl registry login
使用 DigitalOcean API 令牌
DigitalOcean API 令牌可用于向 Container Registries 进行身份验证。通过单击 DigitalOcean 帐户左侧边栏底部的“API”链接生成令牌。单击“生成新令牌”,为其命名,然后在以下弹出窗口中按“生成令牌”。
将显示令牌值。记下这一点,因为您以后将无法检索它。现在返回您的 CLI 并使用docker login命令连接到您的注册表:
docker login registry.digitalocean.com
系统将提示您提供用户名和密码。将您生成的 API 令牌的值用于这两个字段。Docker 现在将能够与属于您帐户的 DigitalOcean 注册表进行交互。
下载 Docker 凭证文件
如果您不想生成 API 密钥或使用 Doctl,请前往 Container Registry 仪表板页面并单击右上角的蓝色“操作”按钮。从菜单中选择“下载 Docker 凭据”。
此文件与 Docker 兼容config.json,其中包含注册表的凭据。您可以将其与主~/.docker/config.json文件合并,也可以将–config标志与docker命令一起使用:
docker --config ~/downloaded-config.json pull registry.digitalocean.com/<your-registry-name>/example-image:latest
使用 Docker 推送和拉取镜像
正确配置 Docker 后,您现在可以使用 CLI 通过 Container Registry 推送和拉取镜像。图像必须以以下格式标记:
registry.digitalocean.com/<your-registry-name>/example-image:latest
这是一个将现有图像的副本推送到注册表的简单示例:
docker pull httpd:latest
docker tag httpd:latest registry.digitalocean.com/<your-registry-name>/httpd:latest
docker push registry.digitalocean.com/<your-registry-name>/httpd:latest
前往 DigitalOcean 控制面板中的注册表仪表板。您新推送的图像应显示在您的注册表中。您可以单击图像以查看可用的标签。通过单击最右侧的三个点图标并从菜单中进行选择,删除特定标签或可用于图像的所有标签。
垃圾收集
从注册表中删除图像可能会留下多余的层,这些层不再被任何剩余的清单使用。这些层仍将计入您的存储成本。
DigitalOcean 提供了一个垃圾收集工具来删除孤立的层和清单。当垃圾收集可以释放存储空间时,您会在注册表的仪表板屏幕上看到一个磁贴。单击“清空垃圾”开始该过程。
您将看到一个弹出对话框,让您选择是否在清理过程中删除未标记的清单。这些是没有分配标签的有效图像,因此只能通过其完整 ID 引用它们,例如registry.digitalocean.com//example-image:a1bc23. 除非您有意保留它们,否则通常需要删除这些清单。
垃圾收集将您的注册表置于只读状态,直到所有未使用的层都被删除。在清理期间新的推送将被拒绝。收集在现有写入完成之前不会开始,因此在您启动该过程后可能会有一点延迟。进度显示在控制面板中注册表的仪表板页面上。
DigitalOcean 不提供自动垃圾收集。但是,可以使用Doctl和 DigitalOcean API运行该过程,这样您就可以编写自己的脚本并使用cron.
结论
DigitalOcean 的 Container Registry 为您提供了一种方便的方式来存储 Docker 映像。您使用现有的 DigitalOcean API 令牌对注册表进行身份验证。您应该记住,API 令牌可以完全访问您的帐户——它们不仅限于注册表访问。
您是否应该使用 Container Registry 来支持 Docker Hub 取决于您将如何处理映像。如果您要将它们部署到 DigitalOcean,则将图像与基础架构放在一起是有意义的,从而最大限度地提高性能。不过,Docker Hub 在其他领域也有好处,例如可以快速标记安全问题的自动映像重建和漏洞扫描。DigitalOcean 的服务没有这些,而是专注于纯粹简单的图像存储。