使用身份验证创建私有Docker注册表

时间:2014-11-24 10:03:33

标签: docker haproxy

所以我尝试使用身份验证运行我自己的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

1 个答案:

答案 0 :(得分:1)

好的,事实证明只是告诉docker使用HTTPS还不够,你必须强迫它。为此,我将redirect scheme https if !{ ssl_fc } domain添加到我的前端,以将HTTP流量重定向到HTTPS,从而停止发生上述错误。