文章目录
- 安装Docker Registry
- 配置 TLS 证书
- 管理访问权限
- 配置 Registry
- 批量管理镜像
- 使用通知系统
在之前的文章中,曾短暂的介绍过快速安装私有仓库。今天详细介绍一下,搭建私有仓在企业中是必不可少的。
安装Docker Registry
docker registry 工具目前最新的版本为2.0系列版本,这一版本和一些类库和工具一起被打包为负责容器内容分发的工具集:Docker Distribution。目前其核心的功能组件任然为负责镜像仓库的管理。
新版本的 Registry基于 Golang进行了重构,提供更好的性能和扩展性,并且支持 Docker 1.6+的 API ,非常适合用来构建私有的镜像注册服务器 官方仓库中也提供了 Registry的镜像,因此用户可以通过容器运行和源码安装两种方式来使用 Registry。
基于容器进行安装运行
基于容器的运行方式十分简单,只需要一条命令
$ docker run -d -p 5000:5000 restart=always --name registry registry :2
启动后,服务监听在本地的 5000 端口,可以通过访问 http://localhost:5000/v2/ 测试启动成功.
Registry 比较关键的参数是配置文件和仓库存储路径。默认的配置文件为 etc/docker/registry/config.yml,因此,通过如下命令可以指定使用本地主机上的配置文件 (如/home/user/registry-conf):
$ docker run -d -p 5000 : 5000 \
--restart=always \
--name registry \
-v / home / user/ registry conf/config . yml : / etc / docker/ registry / config . yml \
registry : 2
默认的存储位 var/lib/registry,可以通过-v 参数来映射本地的路径到容器内
例如,下面将 像存储到本地 opt /data/ registry 目录:
$ docker run -d -p 5000 : 5000 \
--restart=always \
--name registry \
-v / opt/ data / registry / var/lib/ registry \
registry : 2
本地安装运行
有时候需要本地运行仓 ,可以通过源码方法进行安装。
首先安装 Go Jang 环境 持,以 Ubuntu 为例,可以执行如下命令:
$ sudo add-apt-repository ppa : ubuntu- l x c / lxd-stable
$ sudo apt- get update
$ sudo apt- get install golang
确认 Golang 环境安装成功,并配置 $GOPATH 环境变量 ,例如 /go
创建 $GOPATH src /github com/docker/ 目录,并获取源码:
$ mkdir -p $GOPATH /src/github.com/docker/
$ cd $GOPATH/src/github.com/docker/
$ git clone https://github com/docker /distribution.git
$ cd distribution
将自带的模板配置文件复制到 /etc /docker/registry路径下,创 存储目录 var /lib /registry:
$ cp cmd/registry/config-dev.yml/etc/docker/registry/config . yml
$ mkdir -p /var/lib/registry
然后执行安装操作:
$ make PREFIX= / go cle an binaries
编译成功后,可以 过下面的命 来启动
$ registry serve /etc/docker/registry/config.yml
此时使用访问本地的 5000 端口 ,看到返回信息为 2000K 则说明运行成功:
$ curl -i 127 0.0.1:5000 /v2/
HTTP/1.1 200 OK
Content-Le gth 2
Content-Type : application/json ; charset=utf-8
Docker Distribution Api Version : registry/2.0
X-Content- Type - Options : nosniff
Date : Wed , 31 Sep 2016 06:36:10 GMT
{ }
配置 TLS 证书
当本地主机运行 gistry 服务后,所有能访问到该主机的 Docker Host 都可以把它作为.私有仓库使用,只需要在镜像名称前面添加上具体的服务器地址即可
例如将本地的 ubuntu:latest 镜像上传到私有仓库 myrepo com:
$ docker tag ubuntu:latest myrepo.com:5OOO/ubuntu:latest
$ docker push myrepo.com:5OOO/ubuntu : latest
或者从私有仓库 myrepo.com 下载镜像到本地
$ docker pull myrepo.com:5OOO/ubuntu
$ docker tag myrepo.com:5OOO/ubuntu ubuntu
私有仓库需要启用 TLS 认证,否则会报错 在第一部分中,介绍了通过添加DOCKER_ OPTS=“- -insecure-registry myrepo.com:5000 来避免这个问题
在这里将介绍如何获取和生成 TLS 证书
1. 自行生成证书
使用 Openss 工具可以很容易地生成私人证书文件
$ mkd -p certs
$ openssl req newkey rsa:4096 -nodes -sha256 keyout certs/myrepo.key -x509-days 365 -out certs/myrepo crt
生成过程中会提示填入各种信息, 注意 CN 一栏的信息要填入跟访问的地址相同的域名,例如这里应该为 myrepo.com
生成结果为秘钥文件 myrpo.key ,以及证书文件 myrepo.crt 中证书文件需要发送给用户,并且配置到用户 Docker Host 上,注意路径需要跟域名一致,例如:
/etc/docker/certs.d/myrepo.com:5OOO/ca.crt
从代理商申请证书
如果 Registry 服务需要对外公开 ,需要 申请大家都认可的证书 。知名的代理商包括SSLs.com 、GoDaddy.com 、LetsEncrypt.org 、GlobalSign.com 等, 可以自行选择权威的证书提供商
启用证书
当拥有秘钥文件和证书文件后,可以配置 Regist可启用证书支持,主要通过使用 REGI-STRY_HTTP_TLS_CERTIFICATE 和REGISTRY_HTTP_TLS_KEY 参数:
docker run -d \
- -restart=always \
--name registry \
-v 'pwd '/certs:/certs \
-e REGISTRY_HTTP_ADDR=0 . 0.0.0 : 443 \
-e REGISTRY HTTP_TLS CERTIFICATE=/certs/myrepo.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/myrepo.key \
-p 443:443 \
registry :2
管理访问权限
在企业中需要对私有仓库还进行访问代理并提供认证和用户管理。
1 . Docker Registry v2 的认证模式
Docker Registry v2 的认证模式和 vl 有了较大的变化,降低了系统的复杂度、减少了服务之间的交
互次数,其基本工作模式如图所示
具体交互过程包括如下步骤:
1 ) Docker Daemom 或者其他客户端尝试访问 Registry 服务器,比如 pull 、push 或者访问
manifiest 文件;
2)在 Registry 服务器开启了认证服务模式时,就会直接返回 401 Unauthorized 错误,并
通知调用方如何获得授权;
3)调用方按照要求,向 Authorization Service 发送请求,并携带 Authorization Service
的信息,比如用户名 \密码;
4)如果授权成功,则可以拿到合法的 Bearer token ,来标识该请求方可以获得的权限;
5)请求方将拿到 Bearer token 加到请求的 Authorization header 中,再次尝试步骤 中的
请求;
6) registry 服务通过验证 Bearer token 以及 JWT 格式的授权数据,来决定用户是否有权
限进行请求的操作
当启用认证服务时,需要注意以下两个地方:
- 对于 Authentication Service, Docker 官方目前并没有放出对应的实现方案,需要自行
实现对应的服务接口; - Registry 服务和 Authentication 服务之间通过证书进行 Bearer token 的生成和认证,所
以要保证两个服务之间证书的匹配
配置 Nginx 代理认证模式
使用 Nginx 来代理 registry 服务的原理十分简单,在上一节中,我们让 Registry 服务监
听在 127 .0.0.1:5000 ,这意味着只允许本机才能通过 5000 端口访问到 ,其他主机是无法访
到, 为了让其他主机访问到,可以通过 Nginx 监听在对外地址的 15000 端口,当外部访问
请求到达 15000 端口时 内部再将请求转发到本地的 5000 端口 。具体操作如下:
首先,安装 Nginx:
$ sudo apt-get -y install nginx
在 etc/nginx/sites-available/ 目录下,创建新的站点配置文件etc/nginx/sites-available/docker-registry.conf,代理本地的 15000 端口转发到 5000 端口
配置文件内容如下:
#本地的 registry 服务监听在 15000 端口
upstre docker-registry {
server localhos :5000;
#代理服务器监听在 15000 端口
server {
listen 15000;
server_name private-registry-server.com;
add_header 'Docker-Distr bution-Api Version' 'registry/2.0' always;
# If you have SSL cert cation files, then can enable this section.
ssl on;
ssl_certcate /etc/ssl/certs/myrepo.crt;
ssl_certficate_key /etc/ssl/private/myrepo.key;
proxy_pass http://docker-registry ;
proxy _ set_header Host \$http_host; # required for docker client’s sake
proxy_s et_header X-Real-IP \ $remote_ addr; # pass on real client ’ S IP
proxy_set_header X-Forwarded-For \$proxy_ add_ x_forwarded_for;
proxy_ set_header X-Forwarded-Proto \$scheme ;
proxy_read_timeout 600;
client_max_body_size O; # disable any limits to avoid HTTP 413 for large image uploads
# required to avoid HTTP 411: see Issue #1486
(https://github.com/dotcloud/docker /工 ssues/1486)
chunked_transfer_encoding on;
location /v2/ {
#禁止旧版本 Docker 访问
if(\$http_user_agent ~ "^( docker\/1\.(3|4|5(?!.\.[0-9]-dev))|Go ).*\$"){return 404;}
#配置转发访问请求到 registry 服务
proxy_pass http://docker-registry;
}
}
建立配置文件软连接,放到 etc/nginx/sites-enabled/ 下面,让 Nginx 启用它,最后重启Nginx 服务:
$ ln -s /etc/nginx/sites-available/docker-registry.conf /etc/nginx/sites-enabled/docker-registry.conf
$ servic nx restart
之后,可以通过上传镜像来测试服务是否正常
测试上传本地的 ubuntu:latest 镜像:
$ docker tag ubuntu : 16.04 127 .0. 0 .1: 15000 / ubuntu : latest
$ d ocker push 127.0 . 0 . 1 : 15000 / ubuntu : latest
加用户认证
公共仓库 DockerHub 是通过注册索引( index )服务来实现的。 由于index 服务并没有完全的开源实现,在这里介绍 Nginx 代理的用户访问代理方 Nginx 支持基于用户名和密码的访问管理。
首先,在配置文件的 location/ 字段中添加两行:
...
locat on I {
# let Nginx know about our auth le
auth_basic "Please Input username/password ”;
auth_basic_user_file docker- registry- htpasswd ;
proxy_pass http://-docker-registry ;
...
其中, auth_basic 行说明启用认证服务,不通过的请求将无法转发 auth_basic_user_file,docker-registry-htpasswd 指定了验证的用户名和密码存储文件为本地( etc/nginx 下)的docker-regis htpasswd 文件
docker-re gist htpasswd 文件中存储用户名和密码的格式为每行放一个用户名、密码对。
例如:
...
user1 :passwordl
user2 :password2
...
需要注意的是,密码字段存储的并不是明文,而 使用 函数加密过的字符串。
要生成加密后的字符串,可以使用 htpasswd 工具 ,首先安 apache2-utils;
$ sudo aptitude install apache2-utils y
创建用户 user1 添加密码
例如,如下的操作 创建 etc/nginx/docker-registry-htpasswd 文件来保存用户名和加密后的密码信息,并创建 user1 和对应密码:
$ sudo htpasswd -c /etc/nginx/docker-registry-htpasswd user1
$ New password :
$ Re-type new password :
$ Adding password for user user1
添加更多用户,可以重复上面的命令(密码文件存在后,不需要再使用 选项来新
建)
最后,重新启动 Nginx
$ sudo service nginx restart
此时,通过浏览器访问本地的服务 http://127.0.0.0:15000/v2/ ,会弹出对话框,提示需要输入用户名和密码.
通过命令行访问, 需要在地址前面带上用户名和密码才能正常返回:
$ curl USERNAME : PASSWORD@l27.0.0.1:15000/v2/
除了使用 Nginx 作为反向代理外, Registry 自身也支持简单的基于用户名和密码的认证,以及基于 token 的认证,可以通过如下环境变量来指定:
REGISTRY_ AUTH : htpasswd
REGISTRY_ AUTH_ HTPASSWD_PATH: /auth/htpasswd
REGISTRY AUTH HTPASSWD REALM : basic
Compose 启动 Registry
一般情况下,用户使用 Regis 需要的配置包括存储路径、 TLS 证书和用户认证 这里提供 Docker Compose 的快速启动 Registry 的模板:
registry :
restart : always
image: registry : 2.1
ports :
- 5000:5000
environment :
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/myrepo.crt
REGISTRY_HTTP_TLS_ KEY: /certs/myrepo.key
REGISTRY_ AUTH : htpasswd
REGISTRY_ AUTH_HTPASSWD_PATH: /auth/docker-registry-htpasswd
REG STRY AUTH HTPASSWD REALM: basic
volumes :
- /path/to/data: /var/lib/registry
- /path/to/certs:/certs
- /path/to/auth: /auth
配置 Registry
Docker Registry用提供了一些样例配置,用户可以直接使用它们进行开发或生产部署笔者将以下面的示例配 为例,介绍如何使用配置文件来管理私有仓库。
1: 示例配置
version:0.1
log :
level: debug
fields :
service : registry
environment: development
hooks :
- type : mail
disabled: true
levels :
- panic
options:
smtp:
addr: mail.example.com:25
username: mailuser
password : password
nsecure: true
from: sender@example.com
to :
- errors@example.com
storage :
delete:
enabled: true
cache:
blobdescriptor: redis
filesystem:
rootdirectory: /var/lib/registry
maintenance:
uploadpurging:
enabled: false
http:
addr: :5000
debug:
addr : localhost:5OOl
headers:
X-Content-type-Options : [nosniff]
redis:
addr: localhost:6379
pool:
maxidle: 16
maxactive: 64
idletmeout: 300s
dialtimeout: lOms
readtimeout: lOms
writetimeout: lOms
notifications:
endpoints:
- name: local-5003
url: http://localhost:5003/callback
headers:
Authorization : [Bearer <an example token>]
timeout: ls
threshold: 10
backoff: ls
disabled: true
-name: local-8083
url: http://localhost:8083/callback
timeout: ls
threshold: 1O
backoff: ls
disabled: true
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
2: 选项
这些选项以 yaml 文件格式提供,用户可以直接进行修改,也可以添加自定义的模板。默认情况下变量可以从环境变量中读取,例如 log.level: debug 可以配置为
export LOG_LEVEL=debug
比较重要的选项包括版本信息、 log 选项、 hooks 选项、存储选项、认证选项、 HTTP
选项、通知选项、 redi 选项、健康监控选项、代理选项和验证选项 下面分别介绍:
( I )版本信息
version: 0.1
( 2) log 选项
日志相关,代码如下:
log :
level : debug
formatter : text
fields:
service : registry
vironment: staging
其中
- level: 字符串类型,标注输出调试信息的级别,包括 debug 、info warn 、error;
- fomatter:字符串类型,日志输出的格式,包括 text json logstash 等;
- fields:增加到日志输出消息中的键值对,可以用于过滤日志。
( 3) hooks 选项
配置当仓库发生异常时,通过邮件发送日志时的参数,代码如下:
hooks:
- type : mail
levels:
- panic
options :
smtp:
addr: smtp.sendhost .com : 25
username· sendername
password: password
insecure: true
from: name@sendhost.com
to :
- name@receivehost.com
(4)存储选项
storage 选项将配置存储的引擎,默认支持包括本地文件系统 Google 云存储、 AWS S3、云存储 OpenStack Swi 位分布式存储等, 代码如下:
storage:
filesystem:
rootdirectory : /var I lib/registry
azure :
accountname:accountname
accountkey:base64encodedaccountkey
container:containername
gcs :
backet:bucketname
keyfile:/path/to/keyfile
rootdirectory:/gcs/object/name/perfix
s3 :
accesskey: awsaccesskey
secretkey: awssecretkey
region: us-west-1
regionendpoint :http : //myob] ects local
bucket: bucketname
encrypt: true
keyid : mykeyid
secure: true
v4auth : true
chunksize : 5242880
multipartcopychunksize: 33554432
multipartcopymaxconcurrency: 100
mult partcopythresholdsize 33554432
rootdirectory : /s3/object/name/prefix
swift :
username : username
password : password
authurl : https://storage .myprovider . com/auth/v1. 0 or https:/ /storage .myprov .der .com/v2.0 or https : //storage. myprovider.com/v3/auth
tenant: tenantname
tenantid: tenantid
domain : domain name for Ope stack Identity v3 API
domainid : domain id for Openstack Identity v3 API
insecureskipverify: true
region : fr
container: containername
rootdirectory : /swift/object / name /prefix
OSS :
accesskeyid : accesskeyid
acesskeysecret: accesskeysecret
region OSS region name
endpoint: optional endpoints
internal : optional internal endpoint
bucket: OSS bucket
encrypt : optional data encryption setting
secure : optional ssl setting
chunksize : optional size valye
rootdirectory: optional root directory
inmemory:
delete:
enabled : false
cache :
blobdescriptor: inmemory
ma ntenance
uploadpurging:
enabled: true
age : 168h
interval 24h
dryrun : false
redirect :
disable : false
较重要的选项如下:
- maintenance :配置维护 的功能,包括对孤立旧文件的清理 开启只读模式等;
- delete :是否允许删除镜像功能,默认关闭
- cache :开启对镜像层元数据的缓存功能,默认开启
( 5)认证选项
对认证类型的配置,代码如下
auth:
silly :
realm : silly realm
service: silly-service
token:
realm: token-realm
service: token-service
issuer: registry-token-ssuer
rootcertbundle : /root/certs/bundle
htpasswd:
realm:basic-realm
path: /path/to/htpasswd
其中:
- silly :仅供测试使用,只要请求头带有认证域即可,不做内容检查;
- toke口 基于 token 的用户认证,适用于生产环境,需要额外的 token 服务来支持;
- tpasswd :基于 pache htpasswd 文件的权限检查
( 6 ) HTTP 选项
HTTP 务相关的配置,代码如下:
http :
addr : localhost:5000
net : tcp
prefix : /my/nested/registry/
host : https://myregistryaddress.org:5000
secret : asecretforlocaldevelopment
relativeurls: false
tls:
certificate: /path /to/x509/public
key: /path/to/x509 /private
clientcas:
- /path/to/ca.pem
- /path/to/another/ca. pem
letsencrypt:
cachefile: /path/to/cache-file
email: emailused@letsencrypt.com
debug:
addr: localhost:5001
headers:
X-Content-Type-Options : [nosniff]
http2:
disabled : false
其中:
- addr 必选,服 监昕地址;
- secret 必选,与安 的随机字符串,用户可以自己定义;
- tls :证书相 的文件路径信息;
- http2 :是否开启 http2 支持 默认关
( 7) 通知选项
有事件发生时候的通知系统:
notifications:
endpoints:
- name: alistener
disabled: false
url: https://my . listener.com/event
headers: <http . Header>
timeout: 500
threshold: 5
backoff: 1000
( 8 ) redis 选项
egistry可以用 Redis 缓存文件块,这里可以配置相关选项:
redis:
addr: localhost : 6379
password : asecret
db : 0
dialtimeout: lOms
readtimeout: lOms
writet meout: lOms
pool:
maxidle: 16
maxactive: 64
idletimeout: 300s
( 9)健康监控选项
与健康监控相关,主要是对配置服务进行检测判断系统状态,代码如下:
health:
storagedr ver
enabled : true
nterval 10s
threshold : 3
file:
- file : / path/to/checked/file
nterval 10s
http :
- uri: http : //server . to . check/must/return/200
headers:
Authorization: [Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==l
statuscode : 200
timeout : 3s
interval : 10s
threshold: 3
tcp:
- addr : redis-server . domain.com : 6379
timeout 3s
interval : 10s
threshold: 3
默认并未启用
( 10 )代理选项
配置 Registry 作为一个 pull 代理 ,从远端(目前仅支持官方仓库)下拉 Docker 镜像,代
码如下:
proxy :
remoteurl: https //registry-l.docker.io
username: [username]
password: [password]
之后,用户可以通过如下命令来配 Docker 使用代理:
$ docker --registry-mirror=https://myrepo .com: 5000 daemon
( II )验证选项
限定来自指定地址的客户端才可以执行 push 操作,代码如下:
validation:
enabled:true
manifests:
urls·
allow:
- ^https?://([</]+\.)*example\.com/
deny:
- ^https?: //www\.example\.com/
批量管理镜像
如何利用脚本实现对镜像的批量化处理
批量上传指定镜像
可以使用下面的 push_images.sh 脚本,批量上传本地的镜像到注册服务器中,默认是本
地注册服务器 127 .0.0.1:5000 ,用户可以通过修改 registry=127 .0.0.1:5000 这行来指定目标注册服务 器:
#!/bin/sh
# This script will upload the given local images to a registry server ($registry
工 s the default value) .
# See :
https://github.com/yeasy/docker_practice/blob/master/_local/push_images.sh
# Usage: push mages imagel [ image2 ... ]
# Author : yeasy@g thub
# Create : 2014 09 23
#The reg stry server address where you want push the imag,es into
registry=127.0.0.1:5000
### DO NOT MODIFY THE FOLLOW NG PART , UNLESS YOU KNOW WHAT IT MEANS ###
echo_ r () {
[ $# -ne 1 ] && return 0
echo -e "\033[31m$1\033[0m"
}
echo_ g () {
[ $# -ne 1 ] && return 0
echo -e "\033[32m$1\033[0m"
}
echo_y () {
[ $# -ne 1 ] && return 0
echo e "\033[33m$1\033[0m"
}
echo b () {
[ $# -ne 1 ] && return 0
echo -e "\033[34m$1\033[0m"
}
usage() {
docker images
echo "Usage: $0 registryl tagl [registry2: tag2 ... ] "
}
[ $# 1t 1 J && usage && exit
echo_b "The registry server $registry"
for image in "$@"
do
echo_b "uploading $iamge..."
docker tag $image $registry/$image
docker push $registry/$image
docker rmi $registry/$image
echo_g "Done"
done
建议把脚本存放到本地可执行路径下,例如放在/usr/local/bin/ 下面 然后添加可执行权限,就可以使用该脚本了:
$ sudo chmod a+x /usr/local/bin/push_images .sh
例如,推送本地的 ubuntu: latest 和 centos:centos7 两个镜像到本地仓库:
$ . /push_ images.sh ubuntu:latest centos:centos7
The registry server is 127.0 . 0.1
Uploading ubuntu: latest . ..
The push refers to a repository [127 0 . 0 .1: 5000/ubuntu] (len : 1)
Sending image list
Pushing repository 127.0 . 0.1:5000/ubuntu (1 tags)
Image 511136ea3c5a already pushed , skipping
Image bfb8b5a2ad34 already pushed, skipp ng
Image clf3bdbd8355 already pushed , skipp ng
Image 897578f527ae already pushed, skipping
Image 9387bcc9826e already pushed, skipp ng
Image 809ed259f845 already pushed , skippi ng
Image 96864a7d2df3 already pushed , skipping
Push ng tag for rev [96864a7d2df3] on
{http /!127 .0. .1:50 00/vl/repositor es/ubuntu/ tags/latest}
Untagged: 127 0.0.1:5000/ubuntu : latest
Do
Uploading ce tos:ce tos7 ...
The push refers to a repository [127 0 . 0 . 1 : 5000 / centos] (len : 1)
Sending image list
Pushing repository 127.0 . 0.1:5000/centos (1 tags)
Image 511136ea3c5a already pushed, skipping
34e94e67e63a: Image successfully pushed
70214e5d0a90 : Image successfully pushed
Pushing tag for rev [70214e5d0a90] on
{http : //127 .0 . 0.1:5000/vl/repositories/centos/ tags/centos7}
Untagged: 127 0.0 .1:5 000/centos : centos?
Done
上传后,查看本地镜像,会发现上传中创建的临时标签也同时被清理了
2. 上传本地所高镜像
push_images 工具的基础上,还可以进一步地创建 push_all 工具,来上传本地所有
镜像
# !/bin/sh
# This scr 11 upload all local images to a registry server ($registry is
the default value) .
#This script requires the push_ images , which can be found at https: //github.com/yeasy/docker_practice / blob/ master/ local / push_ images sh
# Usage : push all
# Author : yeasy@github
# Create : 2014 09 23
for image in 'docker images|grep -v "REPOSITORY" |grep -v "<none>"|awk '{print $1 ":" $2 } ' '
do
push_images.sh $image
done
另外,推荐读者把它放在/usr/local/bin/ 下面,并添加可执行权限 这样就可以通过push_all 命令来同步本地所有镜像到本地私有仓库了
读者可以试着修改脚本,实现批量化下载镜像 、删除镜像 、更新镜像标签等更多的操作。
使用通知系统
Docker Regis v2 内置提供了 Notification 功能,提供了非常方便快捷地集成接口,
Notification 功能其实就是 Registry 在有事件发生的时候,向用户自己定义的地址发送webhook 通知 目前的事件包括镜像 manifest push pull ,镜像层的 push pull 这些动作会被序列化成 webhook 事件的 payload ,为集成服务提供事件详情,并通过 Registry v2 的内置广播系统发送到用户定义的服务接口, Registry v2 将这些用户服务接口称为 Endpoints
Registry 服务器的 件会通过 HTTP 协议发送到用户定义的所有 Endpoints 上,而且每个Regis 例的每个 Endpoint 都有自己独立的队列 、重试选项 以及 HTTP 的目的地址 当一个动作发生时,会被转换成对应的事件并放置到一个内存队列中 镜像服务器会依次处理队列中的事件,并向用户定义的 Endpoint 发送请求 件发送处理是串行的,但是 Registry务器并不会保证其到达顺序。
1: 相关配置
Notification 在Docker Registry中的相关配 如下:
notifications;
endpoints:
- name: cd-handler
disabled: false
url:http://cd-service-host/api/v1/cd-service
headers :
Authorizat on: [token ***************]
timeout: ls
threshold: 5
backoff: 10s
上面的配置会在 pull 或者 push 发生时向 http ?/cd-service-host/api/v 1 ed-service 发送事
件,并在 HTTP 请求的 head 中传人认证信息,可以是 Basic token Bearer 等模式,主要
用于接收事件方进行身份认证 更新配置后,需要重启 Registry 服务器,如果配置正确,会
在日志中看到对应的提示信息,比如:
configuring endpoint listener (http://cd-service-host/api/v1/cd-service), timeout=ls, headers=map[Authorization: [token ******]]
此时, 用户再通过 docker 客户端进行 push、 pull, 或者查询一些 rnanifiest 信息时, 就会
有相应的事件发送到定义的 Endpoint 上。
接下来看一下事件的格式及其主要属性:
"even七s": [
"id": "70f44894-c4b4-4be8-9691-d37db77074cd",
“七imes七amp": "2016-06-05T01: 57: 04. 6542561492",
"ac巨on": "push",
“七arget": {
},
,'mediaType": "applica巨on/vnd.docker.distribu七ion.manifest.vl+
json",
,'size": 45765,
"diges七": "sha256: fd0af29ba2ae034449bffbl8dd6db2ed90d798464cc43a
a8le63 770713edaea8",
"length": 45765,
"repository": "tes七-user/hello-world" ,
"url": "http://registry-server/v2/test-user/hello-world/manifests/
sha256:fd0af29ba2ae034449bffbl8dd6db2ed90d798464cc43aa8le6377
0713edaea8"
"request" : {
},
"id": "9d3d837f-d7ed-4fa9-afb4-dda58687a6ce",
"addr": "client-host: 46504",
"hos七": registry-server",
,'method": "PUT",
, "useragent": "docker/1.9.1 go/gol.4.2 git-commi七/a34ald5 kernel/
4.2.0-35-generic os/linux arch/amd64"
"ac七or": {
"name": test-user"
"source": {
"addr": "8el4c2al90f2:5000",
"instanceID": "c564003e-dd9b-4a9b-8a30-fe8564e97ba9"
每个事件的 payload, 都是一个定义好的 JSON 格式的数据。 通知系统的主要属性主要
包括 action 、 targe七.mediaType 、 target.repository 、 targe七.url 、 reques七 .
me七hod、 reques七.useragent 、 actor.name 等, 参见表 18-1 。
属 性
action
表18-1 通知系统的主要属性及描述
类 型
string
描 述
事件所关联的动作类型, pull或push
216 •!• 第三部分 进阶技
2: 通知系统的使用场景
略