认识 Registry
Registry 是一个存储,内容分发系统,通过命名Docker的镜像,让镜像可以有不同的标志版本号。比如,镜像distribution/registry
,就有 2.0
和 latest
两个标志。
用户通过pull和push命令和registry进行交互。比如, docker pull myregistry.com/stevvooe/batman:voice
。
存储本身是委托不同的驱动程序。默认的存储驱动是本地的POSIX文件系统,适用于开发和小规模的部署场景。也支持基于云存储的驱动,像亚马逊的S3、微软的Azure和Ceph。用户也可以通过实现Storage API,创建自己个性化的存储驱动。
因为安全的访问被托管的镜像对用户至关重要,registry原生的支持TLS。你也可以使用Nginx作为一个基础认证代理。
在registry的github仓库中,包含了额外的身份验证和授权方法的参考实现。这些功能仅在大规模或公共部署中才会用到。
最后,registry包含一个健壮的通知系统,当响应、日志和报告被激活时,回调webhooks钩子。报告对于想收集检测信息的大型系统很有用。目前,支持New Relic和Bugsnag。
理解镜像的命名
镜像的名字被用在标准的docker命令中,表达了它们的起源:
docker pull ubuntu
命令docker向docker官方的数据中心拉取一个名为ubuntu
的镜像。这个是拉取日志的片段docker pull registry-1.docker.io/library/ubuntu
。docker pull myregistrydomain:port/foo/bar
命令docker到地址为myregistrydomain:port
的registry中查找制定名字的镜像。
你也可以到官方的docker引擎使用文档中了解更多关于处理镜像的docker命令。
用例.
运行自己的registry是对你的CI/CD系统的完美整合和补充。在一个标准的工作流程里,当你向一个版本控制系统提交你的源码时,在你的CI系统上会自动构建,当构建成功后会向你的registry推送一个新的的镜像。在这个期间,registry将触发一个发布通知,或通知其他的系统新增了一个镜像。
如果你想在一个大型的集群机器中快速部署一个新的镜像时,它是必不可少的。
最后,在一个airgap的环境里,它是最好的发布方式。
要求
你需要对充分的了解docker,特别是关于上传和拉取镜像。你必须理解守护进程和客户端之间的差异,至少理解关于网络的基本概念。
虽然,启动一个registry是非常简单的,但是在生产的环境下对它的操作需要炒作技巧,就好像其他的服务一样。你应该熟悉系统的可用性和伸缩性,日志和日志处理,系统的监控和安全。对http和整个网络通信有深刻的理解,有一定的golang基础更好。