S3存储驱动

预计阅读时间:7分钟

该页面包含有关使用开源Docker Registry托管自己的注册表的信息。有关Docker Hub的信息,它提供了托管注册表以及其他功能,例如团队,组织,Web挂钩,自动构建等,请参阅Docker Hub

storagedriver.StorageDriver使用Amazon S3或S3兼容服务进行对象存储的接口的实现。

参数

范围 必需的 描述
accesskey 您的AWS访问密钥。如果您使用IAM角色,请省略以从IAM中获取临时凭证。
secretkey 您的AWS秘密密钥。如果您使用IAM角色,请省略以从IAM中获取临时凭证。
region 是的 存储桶所在的AWS区域。目前,使用中的Go AWS库未使用较新的基于DNS的存储桶路由。
regionendpoint S3兼容存储服务的端点(Minio等)。
bucket 是的 您要在其中存储注册表数据的存储桶名称。
encrypt 指定注册表是否以加密格式存储映像。布尔值。默认值为false
keyid 用于加密的可选KMS密钥ID(encrypt必须为true,否则此参数将被忽略)。默认值为none
secure 指示是否使用HTTPS而不是HTTP。布尔值。默认值为true
skipverify 将该值设置为时,跳过TLS验证true。默认值为false
v4auth 指示注册表是否使用AWS身份验证的版本4。默认值为true
chunksize S3 API要求分段上传的块至少为5MB。此值应为大于5 * 1024 * 1024的数字。
rootdirectory 这是一个前缀,应用于所有S3键,以便在必要时允许您对存储区中的数据进行分段。
storageclass S3存储类应用于每个注册表文件。默认值为STANDARD

注意您可以提供用于访问的空字符串和密钥,以在ec2实例上运行驱动程序并使用实例的凭据处理身份验证。如果您使用IAM角色,请省略这些密钥以从IAM中获取临时凭证。

region:您要在其中存储对象的aws区域的名称(例如us-east-1)。有关区域的列表,请参见区域,可用区和本地区域

regionendpoint:(可选)S3兼容API的端点URL。使用Amazon S3时不应提供此功能。

bucket:要在其中存储对象的S3存储桶的名称。存储桶必须在驱动程序初始化之前存在。

encrypt:(可选)是否要在服务器端加密数据(如果未指定,则默认为false)。

keyid:(可选)是否要使用此KMS密钥ID加密数据(如果未指定,则默认为无;如果加密为非true,则将被忽略)。

secure:(可选)是否要通过ssl将数据传输到存储桶。如果未指定,则默认为true(表示通过ssl传输)。虽然将此设置为false可以提高性能,但是出于安全考虑,不建议这样做。

v4auth:(可选)是否要在请求中使用aws签名版本4。false如果未指定,则默认为。该eu-central-1区域不适用于版本2签名,因此,如果使用此区域并将v4auth设置为,则驱动程序会出错false

chunksize:(可选)向S3分段上传(由WriteStream执行)的默认部分大小。默认值为10 MB。请记住,S3的最小部件大小为5MB。取决于您与S3的连接速度,更大的块可能会导致更好的性能。更快的连接受益于更大的块大小。

rootdirectory:(可选)存储所有注册表文件的根目录树。默认为空字符串(存储桶根)。

storageclass:(可选)应用于每个注册表文件的存储类。默认为标准。有效选项为STANDARD和REDUCED_REDUNDANCY。

S3权限范围

注册表要求以下AWS策略进行推和拉。确保S3_BUCKET_NAME用您的存储桶名称替换。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::S3_BUCKET_NAME"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:ListMultipartUploadParts",
        "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::S3_BUCKET_NAME/*"
    }
  ]
}

有关更多详细信息,请参阅S3策略文档

CloudFront作为具有S3后端的中间件

用例

将CloudFront添加为S3支持的注册表的中间件可以大大缩短提取时间。您的注册表可以从边缘服务器检索图像,而不是从S3存储桶的地理位置限制中检索图像。您的注册表离存储桶越远,可以进行的改进越多。请参阅Amazon CloudFront

对于CloudFront的另一种需要较少配置并使用相同边缘服务器的方法是S3 Transfer Acceleration。请检查加速要求, 以了解您是否需要CloudFront或S3 Transfer Acceleration。

配置CloudFront进行分发

如果您不熟悉创建CloudFront发行版,请参阅《Cloudfront入门》

可以在大多数区域保留默认值,但以下情况除外:

起源:

  • 必须创建CloudFront分配,以将Origin Path其设置为S3中根“ docker”键的目录级别。如果您的注册表位于存储桶的根目录下,则此路径应留空。

  • 对于私有S3存储桶,您必须设置Restrict Bucket AccessYes。请参阅CloudFront文档

行为:

  • 查看器协议策略:仅HTTPS
  • 允许的HTTP方法:GET,HEAD,OPTIONS,PUT,POST,PATCH,DELETE
  • 缓存的HTTP方法:OPTIONS(已选中)
  • 限制查看者访问(使用签名的URL或签名的Cookie):是
    • 受信任的签名者:自身(只要您可以访问其他帐户的CloudFront密钥对,就可以添加其他帐户)

注册表配置

在此使用该middleware选项。保留该storage选项仍然很重要 ,因为CloudFront仅处理pull操作;因此,请参见参考资料。push动作仍直接写入S3。

以下示例显示了最低配置:

...
storage:
  s3:
    region: us-east-1
    bucket: docker.myregistry.com
middleware:
  storage:
    - name: cloudfront
      options:
        baseurl: https://abcdefghijklmn.cloudfront.net/
        privatekey: /etc/docker/cloudfront/pk-ABCEDFGHIJKLMNOPQRST.pem
        keypairid: ABCEDFGHIJKLMNOPQRST
...

CloudFront密钥对

所有需要访问您的CloudFront发行版的AWS账户都需要一个CloudFront密钥对。您必须有权访问您的AWS账户的根凭证才能创建所需的Cloudfront密钥对。有关信息,请参阅创建CloudFront密钥对

注册表服务驱动程序图像存储S3