簡體   English   中英

在nginx代理后面使用docker private registry(v2)格式錯誤的HTTP響應

[英]malformed HTTP response with docker private registry (v2) behind an nginx proxy

我已根據其官方文檔在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"

我的問題是雙重的。

  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必須對此負責。 有誰知道為什么會這樣? 這讓我瘋了!

  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保留的名稱,不要在您的示例中使用不屬於您的域名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM