在nginx代理后使用docker私有注册表(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 version: nginx/1.8.0,并设置了一个dns记录'nginx-proxy.example.com'指向nginx服务器,并设置了一个站点。下面是配置:

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 "x15x03x01x00x02x02"
我的问题是双重的。
  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: */*
> x15x03x01x00x02x02

如果我做'curl -v docker-registry.example.com',我得到一个200 OK响应。所以nginx必须负责这个。有人知道为什么会这样吗?它快把我逼疯了!

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

您正在使用普通HTTP(即没有https)传递请求

x15 x03 x01 x00 x02 x02

你得到了一个SSL响应。因此,看起来您必须使用https://而不是http://来访问端口5000。你甚至知道你在使用SSL:

注册表运行在端口5000上,并且使用由可信CA签名的SSL密钥…

除此之外:请使用为example.com等示例保留的名称,不要在示例中使用不属于您的域名。

最新更新