使用身份validation创build私有Dockerregistry

所以我试图运行我自己的dockerregistry与身份validation,所以我可以访问它在外部。 为此,我使用docker集线器中的dockerregistry映像,如下所示:

docker run -p 5000:5000 -d -v /opt/registry:/tmp/registry registry:0.8.1 

然后,我使用HAProxy将其链接到URL reg.mydomain.com并添加身份validation:

 userlist auth_list group registry users root user root password [password] backend docker-registry mode http server localhost:5000_localhost localhost:5000 cookie localhost:5000_localhost frontend web mode http bind *:80 bind *:443 ssl crt /path/to/ssl.pem acl domain hdr(host) -i reg.mydomain.com acl auth_docker_registry http_auth_group(auth_list) registry acl registry_ping url_sub _ping http-request auth realm Registry if !auth_docker_registry domain !registry_ping use_backend docker-registry if domain 

一旦运行,我使用这个命令login:

 root@mydomain:~# docker login https://reg.mydomain.com Username: root Password: Email: Login Succeeded 

问题是,当我运行一个命令来推或registry我得到这些错误:

 root@mydomain:~# docker pull reg.mydomain.com/project1 The push refers to a repository [reg.mydomain.com/project1] (len: 1) Sending image list Pushing repository reg.mydomain.com/project1 (1 tags) 511136ea3c5a: Pushing 2014/11/24 20:40:33 HTTP code 401, Docker will not send auth headers over HTTP. root@mydomain:~# docker pull reg.mydomain.com/project1 Pulling repository reg.mydomain.com/project1 2014/11/24 20:40:38 Could not reach any registry endpoint 

我猜是什么问题是HTTPS连接终止在HAProxy和连接(HAProxy和Dockerregistry容器之间)的其余部分是HTTP,但身份validation标头仍然存在导致错误推送。 为了testing这个,我把reqidel ^Authorization添加到HAProxyconfiguration的后端部分,这是无济于事的。

还值得注意的是我可以浏览https://reg.mydomain.com和子目录,如/v1/_ping在网页浏览器,它都按预期工作(我必须login等)。 此外,在写0.8.1文章的时候,我正在使用docker registry版本0.8.1而不是0.9因为0.9图像没有启动。

如果有任何额外的信息需要,请让我知道。

谢谢,JamesStewy

好吧,所以事实certificate只是告诉docker使用HTTPS是不够的,你必须强迫它。 为此,我添加了redirect scheme https if !{ ssl_fc } domain到我的前端,将HTTP通信redirect到HTTPS,从而停止发生上述错误。