18.6 使用通知系统

Docker Registry v2还内置提供了Notification功能,提供了非常方便、快捷的集成接口,避免了v1中需要用户自己实现的麻烦。

Notification功能其实就是Registry在有事件发生的时候,向用户自己定义的地址发送webhook通知。目前的事件包括镜像manifest的push、pull,镜像层的push、pull。这些动作会被序列化成webhook事件的payload,为集成服务提供事件详情,并通过Registry v2的内置广播系统发送到用户定义的服务接口,Registry v2称这些用户服务接口为Endpoints。

Registry服务器的事件会通过HTTP协议发送到用户定义的所有Endpoints上,而且每个Registry实例的每个Endpoint都有自己独立的队列,重试选项以及HTTP的目的地址。当一个动作发生时,会被转换成对应的事件并放置到一个内存队列中。镜像服务器会依次处理队列中的事件,并向用户定义的Endpoint发送请求。事件发送处理是串行的,但是Registry服务器并不会保证其到达顺序。

18.6.1 相关配置

Notification在Docker Registry中的相关配置如下:


  1. notifications:
  2. endpoints:
  3. - name: cd-handler
  4. disabled: false
  5. url: http://cd-service-host/api/v1/cd-service
  6. headers:
  7. Authorization: [token ******************]
  8. timeout: 1s
  9. threshold: 5
  10. backoff: 10s

上面的配置会在pull或者push发生时向http://cd-service-host/api/v1/cd-service发送事件,并在HTTP请求的header中传入认证信息,可以是Basic、token、Bearer等模式,主要用于接收事件方进行身份认证。更新配置后,需要重启Registry服务器,如果配置正确,会在日志中看到对应的提示信息,比如:


  1. configuring endpoint listener (http://cd-service-host/api/v1/cd-service), timeout=1s,
  2. headers=map[Authorization: [token ******]]

此时,用户再通过docker客户端去push或pull,或者查询一些manifiest信息时,就会有相应的事件发送到定义的Endpoint上。

接下来看一下事件的格式和其中的主要属性:


  1. {
  2. "events": [
  3. {
  4. "id": "70f44894-c4b4-4be8-9691-d37db77074cd",
  5. "timestamp": "2016-06-05T01:57:04.654256149Z",
  6. "action": "push",
  7. "target": {
  8. "mediaType": "application/vnd.docker.distribution.manifest.v1+json",
  9. "size": 45765,
  10. "digest": "sha256:fd0af29ba2ae034449bffb18dd6db2ed90d798464cc43
  11. aa81e63770713edaea8",
  12. "length": 45765,
  13. "repository": test-user/hello-world”,
  14. "url": "http://registry-server/v2/test-user/hello-world/manifests/
  15. sha256:fd0af29ba2ae034449bffb18dd6db2ed90d798464cc43aa81e
  16. 63770713edaea8"
  17. },
  18. "request": {
  19. "id": "9d3d837f-d7ed-4fa9-afb4-dda58687a6ce",
  20. "addr": client-host:46504",
  21. "host": “registry-server",
  22. "method": "PUT",
  23. "useragent": "docker/1.9.1 go/go1.4.2 git-commit/a34a1d5 kernel
  24. /4.2.0-35-generic os/linux arch/amd64"
  25. },
  26. "actor": {
  27. "name": test-user"
  28. },
  29. "source": {
  30. "addr": "8e14c2a190f2:5000",
  31. "instanceID": "c564003e-dd9b-4a9b-8a30-fe8564e97ba9"
  32. }
  33. }
  34. ]
  35. }

每个事件的payload,都是一个定义好的JSON格式的数据。

通知系统的主要属性主要包括action、target.mediaType、target.repository、target.url、request.method、request.useragent、actor.name等,参见表18-1。

表18-1 通知系统的主要属性

18.6 使用通知系统 - 图1

18.6.2 Notification的使用场景

理解了如何配置Docker Registry v2的Notification、Endpoint,以及接收到的Event的数据格式,我们就可以很方便地实现一些个性化的需求。这里简单列举两个场景,一个是如何统计镜像的上传、下载次数,方便了解镜像的使用情况,另一个场景是对服务的持续部署,方便管理镜像,参见图18-2。

18.6 使用通知系统 - 图2

图18-2 通知系统整合持续部署

1.镜像上传、下载计数

很常见的一个场景是根据镜像下载次数,向用户推荐使用最多的镜像,或者统计镜像更新的频率,以便了解用户对镜像的维护程度。

用户可以利用Notification的功能,定义自己的计数服务,并在Docker Registry上配置对应的Endpoint。在有pull、push动作发生时,对相应镜像的下载或者上传次数进行累加,达到计数效果。然后添加一个查询接口,供用户查看用户镜像的上传、下载次数,或者提供排行榜等扩展服务。

2.实现应用的自动部署

在这个场景下,可以在新的镜像push到Docker Registry服务器时候,自动创建或者更新对应的服务,这样可以快速查看新镜像的运行效果或者进行集成测试。用户还可以根据事件中的相应属性,比如用户信息、镜像名称等,调用对应的服务部署接口进行自动化部署操作。