部署registry服务

Deploying a registry server

你需要安装Docker 1.6.0以上版本。

运行在localhost上

启动你的registry:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

你先在可以通过docker使用它了。
获取任意的镜像从hub,然后标记它指向你的registry:

docker pull ubuntu && docker tag ubuntu localhost:5000/ubuntu

。。。然后将它推入到你的registry:

docker push localhost:5000/ubuntu

。。。然后从你的registry里拉取它:

docker pull localhost:5000/ubuntu

停止你的registry,你可以:

docker stop registry && docker rm -v registry

存储

默认情况下,你的registry数据作为docker volume持久化到主机的文件系统。如果你坚持要使用本地文件系统储存,正确的理解volumes是十分必要的。

为了更容易的访问,你可能会指定你的volume位置到一个指定的地方。你可以这样:

docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/data:/var/lib/registry \
  registry:2

备选方案

通常你应该考虑使用其它的存贮后端替换本地文件系统。使用存储配置选项去设置一个其它的存储后段。

使用它们可以使你更加容易的扩展你的registry。并充分利用您的存储冗余和可用性功能。

运行一个domain registry

在localhost上运行供自己使用,但是更多的人想要registry可以更加广泛的被使用。为了做到这一点,Docker engine需要你使用TLS来确保安全,这与web服务器配置SSL是非常相似的。

获取证书

假设你拥有myregistrydomain.com这个域名,并且DNS记录指向你运行registry的主机,你首先需要从CA那里获取一个证书。

创建一个certs目录

mkdir -p certs

然后移动并重命名你的证书文件到:certs/domain.crt,你的密钥文件为:certs/domain.key

确保你停止了你的registry在上一步。再次启动你的registry通过开启TLS:

docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

现在你应该能够访问你的registry从其它的docker主机:

docker pull ubuntu
docker tag ubuntu myregistrydomain.com:5000/ubuntu
docker push myregistrydomain.com:5000/ubuntu
docker pull myregistrydomain.com:5000/ubuntu

问题

证书的颁发者可能会提供一个中间证书给你。这种情况下,你必须结合你的证书和这个中间证书为一个证书包。你可以使用cat命令:

cat domain.crt intermediate-certificates.pem > certs/domain.crt

备选方案

虽然很少建议,你可能想要使用自签证书来替代,或是使用不安全的方式。你可以在这里这里找到一些说明。

负载均衡的考虑

人们可能会想使用负载均衡器来分发负载,有限的TLS或是提高可用性。完整的负载均衡超出了本文的范围,这里有一些建议可以使你使用的更加容易。

最重要的方面是一个负载均衡的registry集群必须提供相同的资源。对于当前版本的registry,这意味着下面这些必须是相通的:

  • Storage Driver
  • HTTP Secret
  • Redis Cache (if configured)

如果这些有一个不同,registry会产生一些问题。比如,如果你使用文件系统驱动,所有的registry实例必须可以访问相同的根文件系统,这意味着它们应该在同样的机器中。对于其它的driver,比如s3或是azure,它们应该访问相同的资源,并且可能会共享相同的配置。The HTTP Secret coordinates uploads, so also must be the same across instances. Configuring different redis instances will work (at the time of writing), but will not be optimal if the instances are not shared, causing more requests to be directed to the backend.

Important/Required HTTP-Headers

Getting the headers correct is very important. For all responses to any request under the “/v2/” url space, the Docker-Distribution-API-Version header should be set to the value “registry/2.0”, even for a 4xx response. This header allows the docker engine to quickly resolve authentication realms and fallback to version 1 registries, if necessary. Confirming this is setup correctly can help avoid problems with fallback.

In the same train of thought, you must make sure you are properly sending the X-Forwarded-Proto, X-Forwarded-For and Host headers to their “client-side” values. Failure to do so usually makes the registry issue redirects to internal hostnames or downgrading from https to http.

A properly secured registry should return 401 when the “/v2/” endpoint is hit without credentials. The response should include a WWW-Authenticate challenge, providing guidance on how to authenticate, such as with basic auth or a token service. If the load balancer has health checks, it is recommended to configure it to consider a 401 response as healthy and any other as down. This will secure your registry by ensuring that configuration problems with authentication don’t accidentally expose an unprotected registry. If you’re using a less sophisticated load balancer, such as Amazon’s Elastic Load Balancer, that doesn’t allow one to change the healthy response code, health checks can be directed at “/”, which will always return a 200 OK response.

限制访问

除非registry运行在安全的本地网络,不然registry应该实现访问限制。

Native basic auth

最简单的实现访问限制的方式是通过基本认证(这与其它的web服务器的认证机制十分相似)。

警告: 你不能在不安全的registry中使用认证。所以必须先配置TLS。

首先创建一个密码文件,用户名“testuser”使用密码“testpassword”:

#这个命令借用registry镜像容器生成密码串
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd

确保你停止了你的registry在前一步。然后再次启动它:

docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

现在你可以:

docker login myregistrydomain.com:5000

然后作为一个认证用户去push和pull镜像。

问题

看到X509错误通常是你要使用自签名证书,或是没有正确配置你的docker daemon。

备选方案

  1. 你可能想通过代理设计在registry之前,使用更高级的基本身份验证。你可以在这里找到一些例子
  2. 另外,这个Registry也支持委托认证,重定向用户到一个指定的,受信任的token服务器。这种途径明显需要更多的投入,并且如果你想充分的配置ACLs(访问控制列表)和完全的控制Registry集成到你的认证系统。

你可以看看这个背景信息,和配置信息

注意你需要实现你自己的认证服务为此或是用第三方的实现。

通过Compose管理

当你的registry配置变得更复杂时,处理它就会变的很烦人。

强烈推荐使用Docker Compose使操作registry变的更加便捷。

这里有一个简单的docker-compose.yml汇聚了目前为止所有的说明:

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /path/data:/var/lib/registry
    - /path/certs:/certs
    - /path/auth:/auth

警告: 替换/path为你想要的目录,确保其中包含了你的certsauth文件夹。

然后你可以启动你的registry:

docker-compose up -d

下一步

你可以通过下面的章节发现更多更详细的内容:

  • Configuration reference
  • Working with notifications
  • Advanced 'recipes'
  • Registry API
  • Storage driver model
  • Token authentication
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275

推荐阅读更多精彩内容