web-dev-qa-db-ja.com

nginxプロキシの背後にあるdocker private registry(v2)での不正なHTTP応答

CentOS 7ボックスにDockerプライベートレジストリ(v2)を公式ドキュメントに従ってセットアップしました: https://docs.docker.com/registry/deploying/

Fedora 21ボックスでdocker 1.6.0を実行しています。

レジストリはポート5000で実行されており、信頼できるCAによって署名されたSSLキーを使用しています。 「docker-registry.example.com」のDNSレコードをサーバーの内部IPに設定しました。 「docker pull docker-registry.example.com:5000/tag/image」を実行すると、期待どおりに動作します。

Nginxバージョンを実行するnginxサーバーをセットアップし、nginx/1.8.0を実行し、nginxサーバーを指す 'nginx-proxy.example.com'のdnsレコードをセットアップし、サイトをセットアップします。これが設定です:

server {
   listen 443 ssl;
   server_name nginx-proxy.example.com;

   add_header Docker-Distribution-Api-Version: registry/2.0 always;

   ssl on;
   ssl_certificate /etc/ssl/certs/cert.crt;
   ssl_certificate_key /etc/ssl/certs/key.key;

   proxy_set_header Host $Host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Original-URI $request_uri;
   proxy_set_header Docker-Distribution-Api-Version registry/2.0;

   location / {
     proxy_pass http://docker-registry.example.com:5000;
   }
}

「docker pull nginx-proxy.example.com/tag/image」を実行しようとすると、次のエラーが発生します。

FATA[0001] Error response from daemon: v1 ping attempt failed with error: Get https://nginx-proxy.example.com/v1/_ping: malformed HTTP response "\x15\x03\x01\x00\x02\x02"

私の質問は2つあります。

  1. Dockerクライアントが/ v1_/pingを探しているのはなぜですか?
  2. 「不正なhttp応答」が表示されるのはなぜですか

「curl -v nginx-proxy.example.com/v2」を実行すると、次のようになります。

[root@alex amerenda] $ curl -v https://nginx-proxy.example.com/v2/
* Hostname was NOT found in DNS cache
*   Trying 10.1.43.165...
* Connected to nginx-proxy.example.com (10.1.43.165) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*   subject: CN=*.example.com,O="example, Inc.",L=New York,ST=New York,C=US
*   start date: Sep 15 00:00:00 2014 GMT
*   expire date: Sep 15 23:59:59 2015 GMT
*   common name: *.example.com
*   issuer: CN=GeoTrust SSL CA - G2,O=GeoTrust Inc.,C=US
> GET /v2/ HTTP/1.1
> User-Agent: curl/7.37.0
> Host: nginx-proxy.example.com
> Accept: */*
> \x15\x03\x01\x00\x02\x02

「curl -v docker-registry.example.com」を実行すると、200 OK応答が返されます。したがって、nginxがこれを担当する必要があります。なぜこれが起こっているのか誰かが知っていますか?私を狂わせている!

16
Alex M
 proxy_pass http://docker-registry.example.com:5000;

プレーンHTTP(つまり、httpsなし)でリクエストを渡している

\ x15\x03\x01\x00\x02\x02

そして、SSL応答が返されます。したがって、ポート5000にアクセスするには、http://ではなくhttps://を使用する必要があるようです。SSLを使用していることもわかります。

レジストリはポート5000で実行されており、信頼できるCAによって署名されたSSLキーを使用しています...

それとは別に:example.comのような例のために予約されている名前を使用し、自分の例ではドメイン名を使用しないでください。

19
Steffen Ullrich