7

HAProxy を使用して新しい Docker レジストリ (v2) をセットアップしようとしています。Docker レジストリについては、docker ハブのイメージを使用し、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 を手動で起動する引数docker -d --insecure-registry d.mydomain.com

これらのいずれも、またはオンラインで見つけた他のものも機能しません。毎回、ドッカーを再起動して再度ログインしようとすると、同じエラーメッセージが表示されます。

私が試した他のいくつかのこと:

  • ブラウザ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/

SSL ターミネーションと HTTP 認証を行う HAProxy を使用したこのセットアップは、レジストリの最初のバージョンと古いバージョンの docker を使用して過去に機能していました。では、Docker レジストリ v2 で何か変更がありましたか? これはまだ機能しますか?変更されていない場合、--insecure-registryフラグがもう何もしないのはなぜですか?

また、これを機能させるためにしばらく取り組んできたので、試したことをすべて忘れている可能性があります。動作する可能性のあるものがあれば、お知らせください。試してみます。

ありがとう、ジェームズ・ステューイ


編集

この編集は以下の回答に移動されました

4

2 に答える 2

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 エラー ページが提供されます。最も重要なのは、ヘッダーDocker-Distribution-Api-Versionが に設定されていることregistry/2.0です。

http-request authその結果、このハックな回避策のセットアップは、カスタム ヘッダーが設定されていることを除いて、古い行とまったく同じように機能しますDocker-Distribution-Api-Version。これにより、このセットアップline 236https://github.com/docker/docker/blob/v1.7.0/registry/endpoint.goで始まるテストに合格できます。

を実行するdocker login d.mydomain.comと、ログインが成功し、資格情報が に追加され.docker/config.jsonます。

2 番目の問題は、ログインしても新しいリポジトリにプッシュできないことでした。これはrsprepfrontend. この行が行うことは、Locationヘッダー (存在する場合) を変更して、すべてhttp://を に変更することhttps://です。

また、将来の参照用にこのドキュメントを見つけました。

于 2015-06-21T09:59:00.533 に答える
0

前の回答を少し明確にするために、次の行を変更する必要がありました。

WWW-Authenticate: Basic realm="Registry"

これに:

WWW-Authenticate: Basic realm="Registry realm"

そして、すべてがうまくいきました...

ところで、パスのハッシュは mkpasswd (whois deb パッケージの一部) を使用して実行できます。

于 2016-11-15T20:12:33.070 に答える