Docker-创建功能完善的私有仓库


在之前的文章中,曾短暂的介绍过快速安装私有仓库。今天详细介绍一下,搭建私有仓在企业中是必不可少的。

安装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: 通知系统的使用场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值