distribution使用方式

本文致力于学习使用cncf项目distribution,即原docker registry

官方文档
翻译内容比较主观,请勿完全信任。

基础了解

是什么

是一个无状态、高度可扩展的服务器端应用程序,用于存储并允许您分发容器映像和其他内容。Harbor基于此开发。

基础使用

# 运行容器
docker run -d -p 5000:5000 --restart=always --name registry registry:2
# 镜像推拉使用
docker pull ubuntu
docker image tag ubuntu localhost:5000/myfirstimage
docker push localhost:5000/myfirstimage
docker pull localhost:5000/myfirstimage
# 删除容器
docker container stop registry && docker container rm -v registry

自定义配置

环境变量覆盖性配置

storage:
  filesystem:
    rootdirectory: /path

创建环境变量REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/path即可实现同样的作用。
环境变量规则:以REGISTRY_variable为主体,以_代表缩进级别。

注意:环境变量形式会覆盖配置文件形式,为保证稳定性所以不建议用环境变量的形式。

全量配置列表

官方提供,且某些选项互斥,需要自行调整

点我展开看配置选项
# 必需;便于解析文件前的一致性版本检查。
version: 0.1
# 配置日志系统行为,日志输出到stderr。
log:
  # 访问日志系统的行为管控。
  # 默认情况访问日志会以组合日志形式输出stdout。
  accesslog:
    # 如果要禁用如下设置。
    disabled: true
  # 非必需,默认info,可选error、warn、debug。
  level: debug
  # 非必需,默认text,可选json,logstash;影响日志行键控属性的编码方式。
  formatter: text
  # 非必需,指定字段值字典,会被添加到上下文的每个日志行中,一般用于日志系统混合收集日志后便于区分来源。
  fields:
    service: registry
    environment: staging
  # 对日志的回调行为,下文以邮件形式。
  hooks:
    - type: mail
      disabled: true
      levels:
        - panic
      options:
        smtp:
          addr: mail.example.com:25
          username: mailuser
          password: password
          insecure: true
        from: sender@example.com
        to:
          - errors@example.com
loglevel: debug # deprecated: use "log"
# 必需配置,且只能单个存储后端。
storage:
  # 本地磁盘
  filesystem:
    # 可选,存储介质的绝对路径。
    # 默认/var/lib/registry。
    # 如果目录不存在,根据umask值创建目录。如umask未设置则默认0777权限
    rootdirectory: /var/lib/registry
    # 可选,允许同时阻止文件系统操作的最大数量。
    # 每个操作都会生成一个新线程,如果许多操作并行完成会导致线程耗尽问题。
    # 默认100,且不能低于25.
    maxthreads: 100
  # Microsoft Azure Blob 存储
  azure:
    # 必需,存储账户名。
    accountname: accountname
    # 必需,存储账户密钥值。
    accountkey: base64encodedaccountkey
    # 必需,根容器路径命名。需要符合储存容器名称要求
    # 指定 image.com/xxxx 中 xxx 字段。
    container: containername
    # 存储目录
    rootdirectory: /az/object/name/prefix
    credentials:
      type: client_secret
      clientid: client_id_string
      tenantid: tenant_id_string
      secret: secret_string
    copy_status_poll_max_retry: 10
    copy_status_poll_delay: 100ms
  # 谷歌云存储驱动  
  gcs:
    # 必需,存储桶名称
    bucket: bucketname
    # 校验密钥文件
    keyfile: /path/to/keyfile
    credentials:
      type: service_account
      project_id: project_id_string
      private_key_id: private_key_id_string
      private_key: private_key_string
      client_email: client@example.com
      client_id: client_id_string
      auth_uri: http://example.com/auth_uri
      token_uri: http://example.com/token_uri
      auth_provider_x509_cert_url: http://example.com/provider_cert_url
      client_x509_cert_url: http://example.com/client_cert_url  
    rootdirectory: /gcs/object/name/prefix
    chunksize: 5242880
  s3:
    accesskey: awsaccesskey
    secretkey: awssecretkey
    region: us-west-1
    regionendpoint: http://myobjects.local
    forcepathstyle: true
    accelerate: false
    bucket: bucketname
    encrypt: true
    keyid: mykeyid
    secure: true
    v4auth: true
    chunksize: 5242880
    multipartcopychunksize: 33554432
    multipartcopymaxconcurrency: 100
    multipartcopythresholdsize: 33554432
    rootdirectory: /s3/object/name/prefix
    usedualstack: false
    loglevel: debug
  # 无参数,使用运行内存存储数据,仅测试使用。
  inmemory:  
  # 标签查找并发限制
  # 删除manifest时,程序会查找所有引用该manifest的tag
  # 会迭代所有tag的链接文件以检查是否与manifest匹配
  tag:
    # 对于s3等对象存储,由于调用查询api,所以tag越多性能越差
    # 该标志会限制并发查询以优化查找性能
    # 0或不设置时使用 GOMAXPROCS 的值
    concurrencylimit: 8
  # 开启后可以通过digest删除blob和manifests  
  delete:
    enabled: false
  # 管理对后端内容的重定向  
  redirect:
    disable: false
  # 缓存图层元数据的快速访问。  
  cache:
    # 可选redis、inmemory
    blobdescriptor: redis
    # 如果设置inmemory则可设置下面字段
    # 默认10000,为0则允许缓存增长无限制
    blobdescriptorsize: 10000
  # 维护配置  
  maintenance:
    # 默认启用,上传清理,一个后台进程,定期删除上传目录中孤立的文件
    # 当registry以proxy拉取式缓存服务运行时不接受push,所以可以关闭该功能
    uploadpurging:
      enabled: true
      # 超龄删除对象
      age: 168h
      # 清理任务间隔时间
      interval: 24h
      # true时则获取将要删除目录的摘要
      dryrun: false
    # 清理时registry的只读性调整。
    # 开启后会阻止对存储后端写入数据以便可以运行垃圾收集。
    # 建议gc前设置为true并重启。
    readonly:
      enabled: false
# 可选,用于配置身份验证,单一有效 
auth:
  # 仅开放使用
  # 检查HTTP请求中是否存在Authorization标头而不检查值
  # 失败则会使用质询响应进行响应,回显访问被拒绝的领域、服务和范围。
  silly:
    # 必需,注册服务器进行身份验证的领域
    realm: silly-realm
    # 必需:正在被验证的服务
    service: silly-service
  # 基于令牌的身份验证  
  token:
    # 非必需
    # true:realm将自动使用请求的Host标头作为域和路径(/auth/token),否则由autoredirectpath指定
    # realm会使用X-Forwarded-Proto标头,否则https
    autoredirect: true
    # 必需
    realm: token-realm
    # 必需
    service: token-service
    # 必需
    issuer: registry-token-issuer
    # 必需,根证书包的绝对路径
    rootcertbundle: /root/certs/bundle
  # 使用apache htpasswd文件配置身份验证,仅支持密码格式 bcrypt
  # 文件只在启动时加载一次,如果无效则registy启动失败。
  htpasswd:
    realm: basic-realm
    path: /path/to/htpasswd
# 可选,在指定的挂钩点注入中间件。每个中间件必须实现与其包装的对象相同的接口
middleware:
  registry:
    - name: ARegistryMiddleware
      options:
        foo: bar
  repository:
    - name: ARepositoryMiddleware
      options:
        foo: bar
  storage:
    - name: cloudfront
      options:
        baseurl: https://my.cloudfronted.domain.com/
        privatekey: /path/to/pem
        keypairid: cloudfrontkeypairid
        duration: 3000s
        ipfilteredby: awsregion
        awsregion: us-east-1, use-east-2
        updatefrequency: 12h
        iprangesurl: https://ip-ranges.amazonaws.com/ip-ranges.json
  storage:
    - name: redirect
      options:
        baseurl: https://example.com/
# registry的http服务器配置        
http:
  # 服务器链接地址
  addr: localhost:5000
  # 如果不在根路径运行,需要设置前缀值,开头结尾要有斜杠
  prefix: /my/nested/registry/
  # 外部可访问的地址
  host: https://myregistryaddress.org:5000
  # 非必需,对状态签名的随机数据。
  # 省略时会自动生成密钥
  # 如果在SLB后构建registry集群需要确保所有的密钥都相同
  secret: asecretforlocaldevelopment
  # 如果为true,会在location标头中反馈相对url,客户端自行解析正确url,docker1.7及之前不支持
  relativeurls: false
  # 非必需,注册表收到sigterm信号后关闭之前的http链接的等待时间
  draintimeout: 60s
  # 可选,配置服务的tls,建议外部nginx而非registry的tls
  tls:
    # 以下两个必需,证书路径
    certificate: /path/to/x509/public
    key: /path/to/x509/private
    # x509 CA的绝对路径数组
    clientcas:
      - /path/to/ca.pem
      - /path/to/another/ca.pem
    # 可选,配置自动更新免费证书
    letsencrypt:
      cachefile: /path/to/cache-file
      email: emailused@letsencrypt.com
      hosts: [myregistryaddress.org]
      directoryurl: https://acme-v02.api.letsencrypt.org/directory
  # 可选,可用于监控服务指标、运行状态。
  # 如果开启,notification、redis、proxy统计信息通过/degbug/vars路径暴露
  debug:
    addr: localhost:5001
    # 启动prometheus,均非必需
    prometheus:
      enabled: true
      path: /metrics
  # 可选,指定请求塞入的响应标头    
  headers:
    X-Content-Type-Options: [nosniff]
  # 可选,控制基于TLS的http/2,如果tls没有配置则忽略
  # 要通过非TLS启动HTTP/2请用 h2c
  http2:
    disabled: false
  # 可选,常用于SLB后部署多节点时  
  h2c:
    enabled: false
# 可选    
notifications:
  # 提供信息额外信息
  events:
    # 如果开启则额外提供参考信息
    includereferences: true
  # 配置可接受事件通知  
  endpoints:
    - name: alistener
      disabled: false
      # 必需,要通知的请求对象
      url: https://my.listener.com/event
      # 必需,添加静态标头
      headers: 
      # 必需
      timeout: 1s
      # 必需,在故障退出前的等待时间
      threshold: 10
      # 必需,服务失败后要多久才重试的时间
      backoff: 1s
      # 非必需,要忽略的某婊媒体类型
      ignoredmediatypes:
        - application/octet-stream
      ignore:
        mediatypes:
           - application/octet-stream
        actions:
           - pull
redis:
  addr: localhost:6379
  password: asecret
  db: 0
  dialtimeout: 10ms
  readtimeout: 10ms
  writetimeout: 10ms
  pool:
    maxidle: 16
    maxactive: 64
    idletimeout: 300s
  tls:
    enabled: false
# 可选,健康检查
# 如果http中开启了debug,会提供 /debug/health
health:
  # 对存储检查
  storagedriver:
    enabled: true
    # 充值存储检查之间的等待时间
    interval: 10s
    # 表示在状态被标记为不健康之前检查必须失败的次数
    # 未指定则单次故障就标记不健康
    threshold: 3
  # 定期检查路径是否存在文件,如果存在则健康检查会失败
  # 所以可以通过该机制创建文件以将服务脱离循环(?)
  file:
    - file: /path/to/checked/file
      interval: 10s
  # 定期检查Head请求    
  # 如果未完成或代码非statuscode则失败
  http:
    # 必需,要检查的url
    - uri: http://server.to.check/must/return/200
      # 添加到每个请求的标头 
      headers:
        Authorization: [Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==]
      statuscode: 200
      timeout: 3s
      interval: 10s
      threshold: 
  # tcp地址健康检查,tcp链接失败则健康检查失败。
  tcp:
    # 检查地址 
    - addr: redis-server.domain.com:6379
      timeout: 3s
      interval: 10s
      threshold: 3
# 可选,对指定仓库配置缓存。不支持推送到配置为拉取式缓存的注册表。
proxy:
  # 远端地址
  remoteurl: https://registry-1.docker.io
  # 账号密码
  username: [username]
  password: [password]
  # 代理缓存有效期时长,默认7天(168h)。要触发清理,需要开启`delete`模块。
  # 0为禁止过期,要求后缀单位ns、us、ms、s、m、h,如果没有时间单位则默认为纳秒。
  # 测试结果仅当v3版本支持ttl参数
  ttl: 168h
validation:
  manifests:
    urls:
      allow:
        - ^https?://([^/]+\.)*example\.com/
      deny:
        - ^https?://www\.example\.com/
posted @ 2024-05-13 10:06  土里的豆是土豆  阅读(3)  评论(0编辑  收藏  举报