2015-07-23 17 views
10

Ich habe Setup ein Docker private Register (v2) auf einer CentOS 7 Box nach ihrer offiziellen Dokumentation: https://docs.docker.com/registry/deploying/fehlerhafte HTTP-Antwort mit Docker privaten Registry (v2) hinter einem Proxy-nginx

Ich bin mit Docker 1.6.0 auf eine Fedora 21 Box.

Die Registrierung wird auf Port 5000 ausgeführt und verwendet einen SSL-Schlüssel, der von einer vertrauenswürdigen Zertifizierungsstelle signiert wurde. Ich stelle einen DNS-Eintrag für 'docker-registry.example.com' als interne IP des Servers ein. Running 'docker pull docker-registry.example.com:5000/tag/image' funktioniert wie erwartet.

Ich habe einen Nginx-Server mit der nginx-Version: nginx/1.8.0 eingerichtet und einen DNS-Record für 'nginx-proxy.example.com' eingerichtet, der auf den nginx-Server verweist und eine Site einrichtet. Hier ist die config:

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; 
    } 
} 

Wenn ich versuche zu laufen 'Docker ziehen nginx-proxy.example.com/tag/image' bekomme ich folgende Fehlermeldung:

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" 

Meine Frage ist zweifach.

  1. Warum sucht der Docker-Client nach dem/v1_/ping?
  2. Warum sehe ich die 'Ungültige HTTP-Antwort'

Wenn ich laufen 'curl -v nginx-proxy.example.com/v2' Ich sehe:

[[email protected] 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 

Wenn ich 'tun curl -v docker-registry.example.com 'Ich bekomme eine 200 OK-Antwort. Also muss nginx dafür verantwortlich sein. Hat jemand eine Idee, warum das passiert? Es macht mich wahnsinnig!

Antwort

13
proxy_pass http://docker-registry.example.com:5000; 

Sie übergeben die Anfrage mit einfachen HTTP (das heißt kein https)

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

Und Sie sind eine SSL-Antwort zurück zu bekommen. So sieht es aus wie Sie https verwenden müssen: // und nicht http: // für den Zugriff auf Port 5000. Und Sie selbst wissen, dass Sie SSL verwenden:

The registry is running on port 5000, and is using an SSL key signed by a trusted CA...

Abgesehen davon: bitte die Namen für Beispiele reserviert verwenden wie example.com und verwende in deinem Beispiel keine Domain-Namen, die nicht dir gehören.

+0

Danke! Das hat es getan. Ich wusste, dass es etwas Offensichtliches wäre ... Außerdem habe ich die Instanzen von "domain.com" in "example.com" geändert. –