所以我试图通过身份验证运行自己的docker注册表,以便可以从外部访问它。为此,我使用来自docker hub的docker注册表映像,如下所示:
docker run -p 5000:5000 -d -v /opt/registry:/tmp/registry registry:0.8.1
然后,我使用HAProxy将其链接到URLreg.mydomain.com
并添加身份验证:
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
运行该命令后,我将使用以下命令登录:
root@mydomain:~# docker login https://reg.mydomain.com
Username: root
Password:
Email:
Login Succeeded
问题是,当我运行命令以推入或拉出注册表时,出现以下错误:
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和Docker Registry容器之间)是HTTP,但是身份验证标头仍然存在,导致推送错误。为了对此进行测试,我将reqidel ^Authorization
HAProxy配置的后端部分添加至无效。
还值得注意的是,我可以在Web浏览器中导航https://reg.mydomain.com
和子目录/v1/_ping
,并且它们都按预期工作(我必须登录等)。另外,在撰写本文时,我使用的是Docker注册表版本,0.8.1
而不是0.9
因为0.9
映像无法启动。
如果需要任何其他信息,请告诉我。
谢谢,JamesStewy
好的,事实证明仅告诉docker使用HTTPS是不够的,您必须强制使用。为此redirect scheme https if !{ ssl_fc } domain
,我在前端添加了将HTTP流量重定向到HTTPS的操作,这阻止了上述错误的发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句