本文致力于学习使用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: [email protected]
to:
- [email protected]
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: [email protected]
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:
# 默认启用,上传清理,一个后台进程,定期删除上传目录中孤立的文件
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
#
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: [email protected]
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,如果没有时间单位则默认为纳秒。
ttl: 168h
validation:
manifests:
urls:
allow:
- ^https?://([^/]+\.)*example\.com/
deny:
- ^https?://www\.example\.com/