2015-07-23 1 views
10

У меня есть настроить Docker частный реестр (v2) на поле CentOS 7 после их OFFICAL документации: https://docs.docker.com/registry/deploying/неверный формат ответа HTTP с Docker частного реестра (v2) позади с Nginx прокси

Я бегу докер 1.6.0 на коробка Fedora 21.

Реестр работает на порту 5000 и использует ключ SSL, подписанный доверенным ЦС. Я установил DNS-запись для «docker-registry.example.com» как внутренний IP-адрес сервера. Запуск «docker pull docker-registry.example.com:5000/tag/image» работает, как и ожидалось.

Я установил сервер nginx, выполнив версию nginx: 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; 
    } 
} 

Когда я пытаюсь запустить «докер тянуть 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. Почему клиент-докер ищет/v1_/ping?
  2. Почему я вижу в 'неверный формат ответа HTTP'

Если я бегу 'завиток -v nginx-proxy.example.com/v2' Я вижу:

[[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 

Если я ' curl -v docker-registry.example.com 'Я получаю ответ 200 OK. Поэтому nginx должен нести ответственность за это. У кого-нибудь есть идея, почему это происходит? Это сводит меня с ума!

ответ

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

вы передаете запрос с простым HTTP (т.е. не HTTPS)

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

И вы получаете ответ SSL обратно. Так это выглядит, как вы должны использовать https: //, а не HTTP: //, чтобы получить доступ к порту 5000. И вы даже знаете, что вы используете SSL:

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

Помимо этого: используйте имена зарезервированные для примеров например example.com, и не используйте имена доменов в вашем примере, которые не принадлежат вам.

+0

Спасибо! Так оно и было. Я знал, что это будет что-то очевидное ... Кроме того, я изменил примеры «domain.com» на «example.com», –

Смежные вопросы