所以我尝试使用身份验证运行我自己的docker注册表,以便我可以从外部访问它。为此,我使用docker hub中的docker注册表映像,如下所示:
docker run -p 5000:5000 -d -v /opt/registry:/tmp/registry registry:0.8.1
然后我使用HAProxy将其链接到URL reg.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配置的后端部分无济于事。
值得注意的是,我可以在网络浏览器中导航https://reg.mydomain.com
和/v1/_ping
等子目录,这一切都按预期工作(我必须登录等)。此外,在撰写本文时,我使用的是docker注册表版本0.8.1
而不是0.9
,因为0.9
图片无法启动。
如果需要任何其他信息,请告知我们。
谢谢JamesStewy
答案 0 :(得分:1)
好的,事实证明只是告诉docker使用HTTPS还不够,你必须强迫它。为此,我将redirect scheme https if !{ ssl_fc } domain
添加到我的前端,以将HTTP流量重定向到HTTPS,从而停止发生上述错误。