web-dev-qa-db-fra.com

réponse HTTP mal formée avec le registre privé docker (v2) derrière un proxy nginx

J'ai configuré un registre privé Docker (v2) sur une boîte CentOS 7 suivant leur documentation officielle: https://docs.docker.com/registry/deploying/

J'utilise docker 1.6.0 sur une boîte Fedora 21.

Le registre s'exécute sur le port 5000 et utilise une clé SSL signée par une autorité de certification de confiance. J'ai défini un enregistrement DNS pour "docker-registry.example.com" comme IP interne du serveur. En exécutant "docker pull docker-registry.example.com:5000/tag/image", cela fonctionne comme prévu.

J'installe un serveur nginx, exécute la version nginx: nginx/1.8.0, et configure un enregistrement DNS pour 'nginx-proxy.example.com' pointant vers le serveur nginx et configure un site. Voici la 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;
   }
}

Lorsque j'essaie d'exécuter "docker pull nginx-proxy.example.com/tag/image", j'obtiens l'erreur suivante:

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"

Ma question est double.

  1. Pourquoi le client docker recherche-t-il/v1_/ping?
  2. Pourquoi est-ce que je vois la "réponse http malformée"

Si je lance "curl -v nginx-proxy.example.com/v2", je vois:

[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

Si je fais "curl -v docker-registry.example.com", j'obtiens une réponse 200 OK. Nginx doit donc en être responsable. Quelqu'un at-il une idée pourquoi cela se produit? Ça me rend fou!

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

vous transmettez la demande avec HTTP simple (c'est-à-dire sans https)

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

Et vous obtenez une réponse SSL. Il semble donc que vous devez utiliser https: // et non http: // pour accéder au port 5000. Et vous savez même que vous utilisez SSL:

Le registre s'exécute sur le port 5000 et utilise une clé SSL signée par une autorité de certification de confiance ...

En dehors de cela: veuillez utiliser les noms réservés pour des exemples comme example.com et n'utilisez pas de noms de domaine dans votre exemple qui ne vous appartiennent pas.

19
Steffen Ullrich