登录haproxy

时间:2015-05-19 05:33:52

标签: docker haproxy docker-registry

我正在尝试使用HAProxy建立一个新的Docker Registry(v2)。对于Docker Registry,我使用docker hub中的映像并使用docker run -d -p 5000:5000 -v /path/to/registry:/tmp/registry registry:2.0.1运行它。这是我的HAProxy配置的一个子集:

global
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon
    tune.ssl.default-dh-param 2048

userlist auth_list
    group docker_registry users root
    user root password ***PASSWORD***

backend docker-registry
    server 127.0.0.1:5000_localhost 127.0.0.1:5000 cookie 127.0.0.1:5000_localhost 

frontend shared-frontend
    mode http
    bind *:80
    bind *:443 ssl crt *** CERT FILES ***
    option accept-invalid-http-request

    acl domain_d.mydomain.com hdr(host) -i d.mydomain.com
    acl auth_docker_registry_root http_auth(auth_list) root
    redirect scheme https if !{ ssl_fc } domain_d.mydomain.com
    http-request auth realm Registry if !auth_docker_registry_root { ssl_fc } domain_d.mydomain.com
    use_backend docker-registry if domain_d.mydomain.com

需要注意的重要事项是我使用HAProxy进行SSL终止和HTTP身份验证而不是注册表。

当我尝试登录新注册表时出现问题。如果我运行docker login https://d.mydomain.com/v2/然后输入用户root和密码,我会收到以下错误消息:

Docker客户端:

FATA[0009] Error response from daemon: invalid registry endpoint https://d.mydomain.com/v2/: https://d.mydomain.com/v2/ does not appear to be a v2 registry endpoint. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry d.mydomain.com` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/d.mydomain.com/ca.crt

Docker守护程序:

ERRO[0057] Handler for POST /auth returned error: invalid registry endpoint https://d.mydomain.com/v2/: https://d.mydomain.com/v2/ does not appear to be a v2 registry endpoint. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry d.mydomain.com` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/d.mydomain.com/ca.crt
ERRO[0057] HTTP Error: statusCode=500 invalid registry endpoint https://d.mydomain.com/v2/: https://d.mydomain.com/v2/ does not appear to be a v2 registry endpoint. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry d.mydomain.com` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/d.mydomain.com/ca.crt

所以我尝试将--insecure-registry d.mydomain.com添加到:

  • /etc/default/dockerDOCKER_OPTS= -H unix:///var/run/docker.sock --insecure-registry d.mydomain.com
  • 使用docker -d --insecure-registry d.mydomain.com
  • 手动启动docker的参数

这些或我在网上找到的其他任何一种都不起作用。每次重新启动docker并尝试再次登录后,都会给出相同的错误消息。

我尝试过的其他一些事情:

  • 在浏览器中转到d.mydomain.com会产生404
  • 在转到d.mydomain.com/v2/的浏览器中,结果为:{}
  • 使用所有这些替换登录命令中的https://d.mydomain.com/v2/但没有成功
    • http://d.mydomain.com/v2/
    • d.mydomain.com/v2/
    • http://d.mydomain.com/
    • d.mydomain.com/

使用HAProxy执行SSL终止和HTTP身份验证的此设置过去使用了注册表的第一个版本和旧版本的docker。所以Docker注册表v2中的任何内容都有变化吗?这仍然有用吗?如果它没有改变,为什么--insecure-registry标志不再做任何事情?

另外,我一直在努力让这个工作一段时间,所以我可能已经忘记了我尝试过的所有事情。如果有可能有用的东西,请告诉我,我会尝试一下。

谢谢, JamesStewy

修改

此修改已移至

下面的答案

2 个答案:

答案 0 :(得分:6)

我有它的工作。所以这是我的新配置:

<强> haproxy.cfg

global
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon
    tune.ssl.default-dh-param 2048

userlist auth_list
    group docker_registry users root
    user root password ***PASSWORD***

backend docker-registry
    server 127.0.0.1:5000_localhost 127.0.0.1:5000 cookie 127.0.0.1:5000_localhost 

backend docker-registry-auth
    errorfile 503 /path/to/registry_auth.http

frontend shared-frontend
    mode http
    bind *:80
    bind *:443 ssl crt *** CERT FILES ***
    option accept-invalid-http-request

    acl domain_d.mydomain.com hdr(host) -i d.mydomain.com
    redirect scheme https if !{ ssl_fc } domain_d.mydomain.com
    acl auth_docker_registry_root http_auth(auth_list) root
    use_backend docker-registry-auth if !auth_docker_registry_root { ssl_fc } domain_d.mydomain.com
    rsprep ^Location:\ http://(.*) Location:\ https://\1
    use_backend docker-registry if domain_d.mydomain.com

<强> registry_auth.http

HTTP/1.0 401 Unauthorized
Cache-Control: no-cache
Connection: close
Content-Type: text/html
Docker-Distribution-Api-Version: registry/2.0
WWW-Authenticate: Basic realm="Registry"

<html><body><h1>401 Unauthorized</h1>
You need a valid user and password to access this content.
</body></html>

http-request auth行的差异已替换为use_backend docker-registry-auth。后端docker-registry-auth没有服务器,它总是会出现503错误。但503错误文件已更改为registry_auth.http。在registry_auth.http中,错误代码被重写为401,标头WWW-Authenticate设置为Basic realm="Registry",提供了基本的HAProxy 401错误页面,最重要的是,标头{ {1}}设置为Docker-Distribution-Api-Version

因此,除了自定义标头registry/2.0之外,此hacky解决方法与旧http-request auth行完全相同。这允许此设置通过从https://github.com/docker/docker/blob/v1.7.0/registry/endpoint.goDocker-Distribution-Api-Version开始的测试。

现在,当我运行line 236时,登录成功,我的凭据已添加到docker login d.mydomain.com

第二个问题是即使登录也无法推送到新的存储库。通过在.docker/config.json中添加rsprep行来解决此问题。这一行的作用是修改frontend标题(如果存在)以将所有Location转换为http://

我还发现this bit of documentation以供将来参考。

答案 1 :(得分:0)

作为对前一个答案的一个小澄清:我不得不改变这一行:

WWW-Authenticate: Basic realm="Registry"

对此:

WWW-Authenticate: Basic realm="Registry realm"

然后一切正常......

BTW,哈希传递可以使用mkpasswd(whois deb包的一部分)来完成